tesshucom / jpsonic

This is a repository for development. See https://github.com/jpsonic/jpsonic
GNU General Public License v3.0
14 stars 13 forks source link

Some issues related to cleanup #1842

Closed tesshucom closed 1 year ago

tesshucom commented 2 years ago

Scan considerations. Related airsonic/airsonic#1425, airsonic/airsonic#1674, airsonic/airsonic#1756, #1736. Prerequisites: #1909, #1925

I've done some additional checking and it doesn't look like a serious problem. Several verifications and internal investigations are carried out. Corrections will occur if necessary.


investigate

Jpsonic is used for the survey, not Airsonic.

airsonic/airsonic#1425

Couldn't reproduce. However, (albeit another issue) ... After trying all the operations, I was able to generate a bug with the following procedure. ![image](https://user-images.githubusercontent.com/27724847/208307013-4b46751e-376f-4311-bafe-e7c655648487.png) Scan here. And add another music folder. And scan ![image](https://user-images.githubusercontent.com/27724847/208307082-f0bf2c02-e8c6-47d7-89e4-2586cbd57242.png) After enabling both and selecting the music folder, an error occurs when trying to open the album. ![image](https://user-images.githubusercontent.com/27724847/208307276-a8de2fac-1ef9-4110-a6cc-140235d2db1c.png) ``` WARN --- o.e.jetty.server.HttpChannel : /main.view org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: Property [path] not found on type [com.tesshu.jpsonic.domain.MusicFolder] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:501) ~[apache-jsp-9.0.52.jar!/:9.0.52] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) ~[apache-jsp-9.0.52.jar!/:9.0.52] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327) ~[apache-jsp-9.0.52.jar!/:9.0.52] at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) ~[jakarta.servlet-api-4.0.4.jar!/:4.0.4] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1665) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:527) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:596) ~[jetty-security-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1571) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1378) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1544) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1300) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:215) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:135) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequestDispatcher.forward(HeaderWriterFilter.java:170) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1405) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1149) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:497) ~[jakarta.servlet-api-4.0.4.jar!/:4.0.4] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.24.jar!/:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) ~[jakarta.servlet-api-4.0.4.jar!/:4.0.4] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1665) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at com.tesshu.jpsonic.security.JWTRequestParameterProcessingFilter.doFilter(JWTRequestParameterProcessingFilter.java:90) ~[classes!/:111.6.0-SNAPSHOT] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at com.tesshu.jpsonic.filter.FontSchemeFilter.doFilter(FontSchemeFilter.java:81) ~[classes!/:111.6.0-SNAPSHOT] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at com.tesshu.jpsonic.filter.MetricsFilter.doFilter(MetricsFilter.java:60) ~[classes!/:111.6.0-SNAPSHOT] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at com.tesshu.jpsonic.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:51) ~[classes!/:111.6.0-SNAPSHOT] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at com.tesshu.jpsonic.filter.ParameterDecodingFilter.doFilter(ParameterDecodingFilter.java:66) ~[classes!/:111.6.0-SNAPSHOT] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at com.tesshu.jpsonic.filter.BootstrapVerificationFilter.doFilter(BootstrapVerificationFilter.java:69) ~[classes!/:111.6.0-SNAPSHOT] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:352) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:110) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:101) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:164) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:227) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:221) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at com.tesshu.jpsonic.security.RESTRequestParameterProcessingFilter.doFilter(RESTRequestParameterProcessingFilter.java:102) ~[classes!/:111.6.0-SNAPSHOT] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:117) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:225) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:190) ~[spring-security-web-5.8.0.jar!/:5.8.0] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.24.jar!/:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar!/:5.3.24] at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:527) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578) ~[jetty-security-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1571) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1378) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484) ~[jetty-servlet-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1544) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1300) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:173) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.Server.handle(Server.java:562) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.HttpChannel.lambda$handle$0(HttpChannel.java:505) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:762) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:497) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:282) ~[jetty-server-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:319) ~[jetty-io-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100) ~[jetty-io-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) ~[jetty-io-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:412) ~[jetty-util-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:381) ~[jetty-util-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:268) ~[jetty-util-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.lambda$new$0(AdaptiveExecutionStrategy.java:138) ~[jetty-util-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:407) ~[jetty-util-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894) ~[jetty-util-10.0.11.jar!/:10.0.11] at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038) ~[jetty-util-10.0.11.jar!/:10.0.11] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na] Caused by: javax.el.PropertyNotFoundException: Property [path] not found on type [com.tesshu.jpsonic.domain.MusicFolder] at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:251) ~[apache-el-9.0.52.jar!/:9.0.52] at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:203) ~[apache-el-9.0.52.jar!/:9.0.52] at javax.el.BeanELResolver.property(BeanELResolver.java:324) ~[apache-el-9.0.52.jar!/:9.0.52] at javax.el.BeanELResolver.getValue(BeanELResolver.java:83) ~[apache-el-9.0.52.jar!/:9.0.52] at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:124) ~[apache-jsp-9.0.52.jar!/:9.0.52] at org.apache.el.parser.AstValue.getValue(AstValue.java:168) ~[apache-el-9.0.52.jar!/:9.0.52] at org.apache.el.parser.AstEqual.getValue(AstEqual.java:37) ~[apache-el-9.0.52.jar!/:9.0.52] at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) ~[apache-el-9.0.52.jar!/:9.0.52] at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:692) ~[apache-jsp-9.0.52.jar!/:9.0.52] at org.apache.jsp.WEB_002dINF.jsp.albumMain_jsp._jspx_meth_c_005fif_005f1(albumMain_jsp.java:1857) ~[na:na] at org.apache.jsp.WEB_002dINF.jsp.albumMain_jsp._jspx_meth_c_005fwhen_005f0(albumMain_jsp.java:1826) ~[na:na] at org.apache.jsp.WEB_002dINF.jsp.albumMain_jsp._jspx_meth_c_005fchoose_005f0(albumMain_jsp.java:1785) ~[na:na] at org.apache.jsp.WEB_002dINF.jsp.albumMain_jsp._jspx_meth_c_005fif_005f0(albumMain_jsp.java:1750) ~[na:na] at org.apache.jsp.WEB_002dINF.jsp.albumMain_jsp._jspService(albumMain_jsp.java:567) ~[na:na] at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) ~[apache-jsp-9.0.52.jar!/:9.0.52] at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) ~[jakarta.servlet-api-4.0.4.jar!/:4.0.4] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466) ~[apache-jsp-9.0.52.jar!/:9.0.52] ... 154 common frames omitted ``` (The actual fix for this bug is #1973.) Well, duplicate paths should not be allowed. should be fixed.

If my method to reproduce is not good, please let me know the steps to reproduce.

airsonic/airsonic#1674

I was able to reproduce it.It's working properly The database should have been successfully cleaned up. -> Why can I still get an error regarding the path information? -> There is a service called StatusService that manages the player's performance status in memory. The information is there. Since it is volatile, it will be gone after a reboot. Or play another accessible file, etc. Even if the file exists, it becomes inaccessible as soon as the database records are deleted. It is also within spec that the SecurityService throws an error and logs it. There are currently no plans to change spec of StatusService or queues. Also, even if we fix only that, you can't, for example, update the information of the songs on the playlist of the client app on your smartphone in real time. Deletion is rarely done on regular media servers, so guarding against attempts to access old data should be the first line of defense. ![image](https://user-images.githubusercontent.com/27724847/208307836-cdac8deb-3b29-46cb-8813-6693962a7f85.png)

airsonic/airsonic#1756

It's non-reproducible, just like you. > To be honest, i am not able reproduce this issue. I tried moving around and deleting files but after rescan & clean, everything works as expected. In most cases rescan & clean will fix it. You mentioned search and random, which might give you a little clue. Search and random are functions that are realized in parallel with the Lucene search engine, not just the database. However, Subsonic does not have any of Lucene's data maintenance functions. Just add data. It may cause malfunction in the long term. Airsonic has improved this, so it's a little better than Subsonic. However, we have not been able to prove whether it can provide integrity at any time and under any circumstances. Airsonic has been cumulatively corrected over a long period of time, so there is a possibility that some kind of garbage is included in the data that has been used for a long time. A complete cleanup can be done by stopping the server and manually deleting the directory index** in the data directory. If you start the server again and scan it, your Lucene data should be healthy again. (This is the same for Subsonic, Airsonic and Jpsonic)

Irreproducible problem

There are many reports of unreproducible data inconsistencies in Subsonic and Airsonic. For those individual cases, it is difficult to take the approach of finding a clear cause, correcting it, and making improvements so that the corresponding problem does not occur.

The reason is that many processes fail to achieve concurrency due to poor internal quality or design flaws. This will lead to bug reports "if you're unlucky", "accidentally overwriting bad data", and "if the user notices it". So in most cases the steps to reproduce are unknown. A relatively easy to understand example is the Roles glitch that has been reported many times with Airsonic.

Whether it happens or not depends on your luck. It is a bug that is considered to be relatively infrequent, but multiple occurrences have been reported in the community. (This is a surprising fact. It seems that data races occurred unexpectedly frequently.)

Jpsonic has eliminated some high-risk features and improved scanning workflows to root out these risks. In v111.6.0, consistency with normal music management and other operations concurrent with scanning will be ensured. In v111.7.0 Podcasts will be redesigned intensively.

These improvements are essential for adding features such as scan cancellation, retries, and parallelization.


During the research of these Issues, some validations and suggested amendments arose. Some minor fixes will occur.

tesshucom commented 1 year ago

There are many cases where fixing only the visible bad part does not lead to the solution of the fundamental problem. I think all tables should be re-reviewed. Yes, it takes time, but it is necessary.

This issue will be considered as part of the review of all table record deletions.


Jpsonic's table definitions are almost identical to Airsonic's. This is because if you make changes easily, it will hinder bug fixes. (On the other hand, it is lenient when it comes to adding columns and tables.)

The current table has a foreign key on User and Player. Most are CASCADE.

Image

Image

The SQL issued when deleting a user is as follows.

    public void deleteUser(String username) {
        update("delete from user_role where username=?", username);
        update("delete from player where username=?", username);
        update("delete from " + getUserTable() + " where username=?", username);
    }

The relationship between users and players and their derived tables is probably fine. I think there were some issues such as NPE occurring on the web page when all records were deleted, but they should have been fixed in Jpsonic.

The problem is that there are a number of other implicit references that have not been fully resolved in the implementation. Individual confirmation is required.

tesshucom commented 1 year ago

Things to check, part 1.

media_library_statistics is added since Jpsonic v111.6.0. We will add an event table and connect them with CASCADE, so don't worry about it for now.

image

There seems to be no particular problem.

table colomn comment
artist cover_art_path Will be set to the path or null found by MediaFileService#findCoverArt when scanning
  folder_id In ScannerProcedureService#markNonPresent, older generations are set to present=false (Follow the deletion of Musicfolder at the timing of scanning)
album path In ScannerProcedureService#markNonPresent, older generations are set to present=false (Follow the deletion of Musicfolder at the timing of scanning)
  cover_art_path Will be set to the path or null found by MediaFileService#findCoverArt when scanning
  folder_id In ScannerProcedureService#markNonPresent, older generations are set to present=false (Follow the deletion of Musicfolder at the timing of scanning)
music_file_info - It is currently unused and appears to be a table for data migration from Subsonic.
tesshucom commented 1 year ago

Things to check, part 2.

It seems that removing user_rating is not implemented. It doesn't develop into bugs, but garbage always remains.

No need to worry about moving files. Moving or deleting files is a rare case in a well-thought-out library. Adding such features only adds new seeds of bugs. Totally YAGNI. Or there is also the idea that it is unnatural to use path in the first place. Let's respect the current design for now.

image

table colomn comment
media_file cover_art_path Will be set to the path or null found by MediaFileService#findCoverArt when scanning
  folder In ScannerProcedureService#markNonPresent, older generations are set to present=false (Follow the deletion of Musicfolder at the timing of scanning)
  parent_path In ScannerProcedureService#markNonPresent, older generations are set to present=false (Follow the deletion of Musicfolder at the timing of scanning)
user_rating path No delete flow. It probably won't malfunction, but it will be added infinitely.
tesshucom commented 1 year ago

Things to check, part 3.

Well, It seems that there is a function called podcast. Will be scrutinized in v111.7.0. Because there are various problems .. before the ... cleanup.