• Icon: Bug Bug
    • Resolution: Fixed
    • Icon: High High
    • 2.2
    • 1.4
    • None

      If you upload a broken plug-in which causes an exception when loading, it does the following:

      a) Prevents all other 'dropped-in' plug-ins from loading
      b) Prevents removal of the offending plug-in.

      To fix the problem, you have to stop your web server, delete the offending jar, and restart the webserver. Not fun, particularly when developing a new plug-in, where errors happen semi-frequently. Plus, it doesn't give very good error messages. The one I'm getting at the moment is 'java.lang.NullPointerException'. No stack trace - just the exception classname.

            [CONFSERVER-3183] Broken Plug-ins are fatal

            Hi guys,

            You'll be pleased to know we've fixed this for the 2.2 release. When there is a problem with a plugin (the most common being an unsatisfied dependency), rather than causing Confluence to crash, it logs the problem and moves on. A "dummy" plugin (and modules) will appear in the "Manage Plugins" interface, showing any applicable errors.

            Jeremy

            Jeremy Higgs added a comment - Hi guys, You'll be pleased to know we've fixed this for the 2.2 release. When there is a problem with a plugin (the most common being an unsatisfied dependency), rather than causing Confluence to crash, it logs the problem and moves on. A "dummy" plugin (and modules) will appear in the "Manage Plugins" interface, showing any applicable errors. Jeremy

            This is critical as it is trivial to kill a confluence server dead through normal operation and there is very little information which can be used to diagnose the problem.

            What is needed is the system to work out what is going wrong and to tell you (eg: "You have 2 plugins with the same plugin keys, here is their versioning information - which do you want me to remove from the file system?" [giving a link so that they can download and backup any files that would be removed])

            Even if no extra debugging information is given it should either fail verbosely (worst case) or survive with a warning.

            Dan Hardiker added a comment - This is critical as it is trivial to kill a confluence server dead through normal operation and there is very little information which can be used to diagnose the problem. What is needed is the system to work out what is going wrong and to tell you (eg: "You have 2 plugins with the same plugin keys, here is their versioning information - which do you want me to remove from the file system?" [giving a link so that they can download and backup any files that would be removed] ) Even if no extra debugging information is given it should either fail verbosely (worst case) or survive with a warning.

            Is this one ever going to get fixed?

            David Peterson added a comment - Is this one ever going to get fixed?

            Ok, just fiddled enough to get a semi-useful stack trace. Since I don't have any other floating point numbers in the atlassian-plugin.xml, the chief suspect was the fact that I had a 'min' but no 'max' in my <application-version> tag. This turned out to be the problem here. Still, the general problem listed above still exists - a single broken plug-in will disable all other uploaded plugins. Not good.

            Anyway, here's the stack trace, for your edification.

            java.lang.NullPointerException
            at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:980)
            at java.lang.Float.parseFloat(Float.java:222)
            at com.atlassian.plugin.loaders.AbstractXmlPluginLoader.createPluginInformation(AbstractXmlPluginLoader.java:114)
            at com.atlassian.plugin.loaders.AbstractXmlPluginLoader.configurePlugin(AbstractXmlPluginLoader.java:143)
            at com.atlassian.plugin.loaders.ClassLoadingPluginLoader.deployPluginFromUnit(ClassLoadingPluginLoader.java:82)
            at com.atlassian.plugin.loaders.ClassLoadingPluginLoader.loadAllPlugins(ClassLoadingPluginLoader.java:51)
            at com.atlassian.plugin.DefaultPluginManager.init(DefaultPluginManager.java:39)
            at com.atlassian.confluence.admin.actions.plugins.UploadPluginAction.execute(UploadPluginAction.java:63)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:168)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.intercept(DefaultWorkflowInterceptor.java:55)
            at com.atlassian.confluence.core.ConfluenceWorkflowInterceptor.intercept(ConfluenceWorkflowInterceptor.java:33)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.atlassian.confluence.core.ConfluenceValidationInterceptor.intercept(ConfluenceValidationInterceptor.java:16)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.atlassian.confluence.security.actions.PermissionCheckInterceptor.intercept(PermissionCheckInterceptor.java:40)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.atlassian.confluence.pages.actions.PageAwareInterceptor.intercept(PageAwareInterceptor.java:84)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.atlassian.confluence.core.ConfluenceAutowireInterceptor.intercept(ConfluenceAutowireInterceptor.java:25)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.atlassian.confluence.util.XWorkTransactionInterceptor.intercept(XWorkTransactionInterceptor.java:133)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
            at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
            at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:115)
            at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:229)
            at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
            at com.atlassian.confluence.util.profiling.ProfilingPageFilter.parsePage(ProfilingPageFilter.java:150)
            at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:168)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.atlassian.seraph.filter.LoginFilter.doFilter(LoginFilter.java:181)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.atlassian.johnson.filters.JohnsonFilter.doFilter(JohnsonFilter.java:96)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:170)
            at bucket.custom.FlushingSpringSessionInViewFilter.doFilterInternal(FlushingSpringSessionInViewFilter.java:31)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:73)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:132)
            at com.atlassian.confluence.util.error.ProfilingAndErrorFilter.doFilter(ProfilingAndErrorFilter.java:27)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.atlassian.core.filters.gzip.GzipFilter.doFilter(GzipFilter.java:61)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at com.atlassian.core.filters.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:36)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
            at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
            at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
            at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
            at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
            at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
            at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
            at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
            at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
            at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
            at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
            at java.lang.Thread.run(Thread.java:534)

            David Peterson added a comment - Ok, just fiddled enough to get a semi-useful stack trace. Since I don't have any other floating point numbers in the atlassian-plugin.xml, the chief suspect was the fact that I had a 'min' but no 'max' in my <application-version> tag. This turned out to be the problem here. Still, the general problem listed above still exists - a single broken plug-in will disable all other uploaded plugins. Not good. Anyway, here's the stack trace, for your edification. java.lang.NullPointerException at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:980) at java.lang.Float.parseFloat(Float.java:222) at com.atlassian.plugin.loaders.AbstractXmlPluginLoader.createPluginInformation(AbstractXmlPluginLoader.java:114) at com.atlassian.plugin.loaders.AbstractXmlPluginLoader.configurePlugin(AbstractXmlPluginLoader.java:143) at com.atlassian.plugin.loaders.ClassLoadingPluginLoader.deployPluginFromUnit(ClassLoadingPluginLoader.java:82) at com.atlassian.plugin.loaders.ClassLoadingPluginLoader.loadAllPlugins(ClassLoadingPluginLoader.java:51) at com.atlassian.plugin.DefaultPluginManager.init(DefaultPluginManager.java:39) at com.atlassian.confluence.admin.actions.plugins.UploadPluginAction.execute(UploadPluginAction.java:63) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:168) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.intercept(DefaultWorkflowInterceptor.java:55) at com.atlassian.confluence.core.ConfluenceWorkflowInterceptor.intercept(ConfluenceWorkflowInterceptor.java:33) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.atlassian.confluence.core.ConfluenceValidationInterceptor.intercept(ConfluenceValidationInterceptor.java:16) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.atlassian.confluence.security.actions.PermissionCheckInterceptor.intercept(PermissionCheckInterceptor.java:40) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.atlassian.confluence.pages.actions.PageAwareInterceptor.intercept(PageAwareInterceptor.java:84) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.atlassian.confluence.core.ConfluenceAutowireInterceptor.intercept(ConfluenceAutowireInterceptor.java:25) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.atlassian.confluence.util.XWorkTransactionInterceptor.intercept(XWorkTransactionInterceptor.java:133) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:115) at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:229) at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118) at com.atlassian.confluence.util.profiling.ProfilingPageFilter.parsePage(ProfilingPageFilter.java:150) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:168) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.atlassian.seraph.filter.LoginFilter.doFilter(LoginFilter.java:181) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.atlassian.johnson.filters.JohnsonFilter.doFilter(JohnsonFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:170) at bucket.custom.FlushingSpringSessionInViewFilter.doFilterInternal(FlushingSpringSessionInViewFilter.java:31) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:73) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:132) at com.atlassian.confluence.util.error.ProfilingAndErrorFilter.doFilter(ProfilingAndErrorFilter.java:27) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.atlassian.core.filters.gzip.GzipFilter.doFilter(GzipFilter.java:61) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.atlassian.core.filters.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:36) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644) at java.lang.Thread.run(Thread.java:534)

              8d92d19feb5e Jeremy Higgs
              david@randombits.org David Peterson
              Affected customers:
              3 This affects my team
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: