Details
Description
HTR
- Go to FeCru source code, bundled plugin (e.g. branch reviews)
- start it with amps
- go to UPM page and uninstall branch review plugin (make sure it's enabled)
Actual Result
PluginDisabledEvent is fired after transaction from com.atlassian.upm.core.install.DefaultPluginInstallationService#uninstallInternal is committed. There are event listeners which cleans some config/data after receiving this event. This leads to two types of errors (but result depends on race condition of some sort)
- ActiveObjects fail to clean up and actually nothing really bad happens, apart from that application throws exception in the logs when user tries to access UPM page (doesn't block execution)
2016-08-10 09:29:55,198 ERROR [qtp261650860-135 ] com.atlassian.event.internal.AsynchronousAbleEventDispatcher AsynchronousAbleEventDispatcher$1$1-run - There was an exception thrown trying to dispatch event [com.atlassian.plugin.event.events.PluginDisabledEvent for com.atlassian.crucible.plugins.crucible-branch-review-plugin] from the invoker [SingleParameterMethodListenerInvoker{method=public void c om.atlassian.activeobjects.osgi.ActiveObjectsServiceFactory.onPluginDisabledEvent(com.atlassian.plugin.event.events.PluginDisabledEvent), listener=com.atlassian.activeobjects.osgi.ActiveObjectsServiceFa ctory@23b750a7}] java.lang.RuntimeException: This operation must occur before the plugin 'com.atlassian.crucible.plugins.crucible-branch-review-plugin' is uninstalled at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:41) [atlassian-event-3.1.1.jar:?] at com.atlassian.event.internal.AsynchronousAbleEventDispatcher$1$1.run(AsynchronousAbleEventDispatcher.java:38) [atlassian-event-3.1.1.jar:?] at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:299) [guava-18.0.jar:?] at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.dispatch(AsynchronousAbleEventDispatcher.java:88) [atlassian-event-3.1.1.jar:?] at com.atlassian.event.internal.LockFreeEventPublisher$Publisher.dispatch(LockFreeEventPublisher.java:222) [atlassian-event-3.1.1.jar:?] at com.atlassian.event.internal.LockFreeEventPublisher.publish(LockFreeEventPublisher.java:95) [atlassian-event-3.1.1.jar:?] at com.atlassian.fisheye.event.FisheyeEventPublisher$EventPublication.publish(FisheyeEventPublisher.java:63) [fisheye.jar:?]
- Some bundles are not cleaned out properly and application can't render any page
2016-08-10 09:45:22,630 WARN [qtp261650860-199 ] org.eclipse.jetty.servlet.ServletHandler ServletHandler-doHandle - /fecru/plugins/servlet/dev-toolbar com.atlassian.templaterenderer.RenderingException: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getDisplayableLabel' in class com.atlassian.plugin.web.model.DefaultWebLabel threw exception com.atlassian.plugin.IllegalPluginStateException: This operation must occur before the plugin 'com.atlassian.crucible.plugins.crucible-branch-review-plugin' is uninstalled at /templates/toolbar.vm[line 96, column 161] at com.atlassian.templaterenderer.velocity.one.six.internal.VelocityTemplateRendererImpl.render(VelocityTemplateRendererImpl.java:109) [?:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [?:1.8.0_102] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [?:1.8.0_102] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [?:1.8.0_102] at java.lang.reflect.Method.invoke(Method.java:498) [?:1.8.0_102] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56) [?:?] at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60) [?:?] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70) [?:?] at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53) [?:?] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57) [?:?] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) [spring-aop-4.0.9.RELEASE.jar:4.0.9.RELEASE] at com.sun.proxy.$Proxy387.render(Unknown Source) [?:?] at com.atlassian.devrel.servlet.ToolbarServlet.doGet(ToolbarServlet.java:51) [?:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) [javax.servlet-api-3.0.1.jar:3.0.1] at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) [javax.servlet-api-3.0.1.jar:3.0.1] at com.atlassian.plugin.servlet.DelegatingPluginServlet.service(DelegatingPluginServlet.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) [javax.servlet-api-3.0.1.jar:3.0.1] at com.atlassian.fisheye.plugin.servlet.FisheyeServletModuleContainerServlet.service(FisheyeServletModuleContainerServlet.java:103) [fisheye.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) [javax.servlet-api-3.0.1.jar:3.0.1] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) [jetty-servlet-8.1.10.v20130312.jar:8.1.10.v20130312] at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1526) [jetty-servlet-8.1.10.v20130312.jar:8.1.10.v20130312] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:39) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter.doFilter(PrettyUrlsSiteMeshFixupFilter.java:32) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:58) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsDispatcherFilter.doFilter(PrettyUrlsDispatcherFilter.java:55) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:64) [atlassian-plugins-servlet-4.4.0.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-4.4.0.jar:?] ... Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getDisplayableLabel' in class com.atlassian.plugin.web.model.DefaultWebLabel threw exception com.atlassian.plugin.IllegalPluginStateException: This operation must occur before the plugin 'com.atlassian.crucible.plugins.crucible-branch-review-plugin' is uninstalled at /templates/toolbar.vm[line 96, column 161] at org.apache.velocity.runtime.parser.node.ASTMethod.handleInvocationException(ASTMethod.java:337) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:284) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:252) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:332) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.directive.Foreach.performIteration(Foreach.java:375) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:315) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:175) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.Template.merge(Template.java:328) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.Template.merge(Template.java:235) [velocity-1.6.1-atlassian-2.jar:?] at com.atlassian.templaterenderer.velocity.one.six.internal.VelocityTemplateRendererImpl.render(VelocityTemplateRendererImpl.java:100) [?:?] ... 160 more Caused by: com.atlassian.plugin.IllegalPluginStateException: This operation must occur before the plugin 'com.atlassian.crucible.plugins.crucible-branch-review-plugin' is uninstalled at com.atlassian.plugin.osgi.factory.OsgiPluginNotInstalledHelperBase.getClassLoader(OsgiPluginNotInstalledHelperBase.java:43) [atlassian-plugins-osgi-4.4.0.jar:?] at com.atlassian.plugin.osgi.factory.OsgiPlugin.getClassLoader(OsgiPlugin.java:233) [atlassian-plugins-osgi-4.4.0.jar:?] at com.atlassian.sal.fisheye.message.FishEyeI18nResolver.getBundle(FishEyeI18nResolver.java:148) [?:?] at com.atlassian.sal.fisheye.message.FishEyeI18nResolver.getRawText(FishEyeI18nResolver.java:59) [?:?] at com.atlassian.sal.fisheye.message.FishEyeI18nResolver.resolveText(FishEyeI18nResolver.java:45) [?:?] at com.atlassian.sal.fisheye.message.FishEyeI18nResolver.resolveText(FishEyeI18nResolver.java:40) [?:?] at com.atlassian.sal.core.message.AbstractI18nResolver.getText(AbstractI18nResolver.java:31) [?:?] at com.atlassian.fisheye.plugin.web.FisheyeWebFragmentHelper.getI18nValue(FisheyeWebFragmentHelper.java:81) [fisheye.jar:?] at com.atlassian.plugin.web.model.DefaultWebLabel.getDisplayableLabel(DefaultWebLabel.java:60) [atlassian-plugins-webfragment-4.0.0.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [?:1.8.0_102] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [?:1.8.0_102] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [?:1.8.0_102] at java.lang.reflect.Method.invoke(Method.java:498) [?:1.8.0_102] at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:389) [velocity-1.6.1-atlassian-2.jar:?] at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:378) [velocity-1.6.1-atlassian-2.jar:?] at com.atlassian.velocity.htmlsafe.introspection.UnboxingMethod.invoke(UnboxingMethod.java:30) [?:?] at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:270) [velocity-1.6.1-atlassian-2.jar:?] ... 170 more
Expected Result
The plugin is deleted and there are none leftovers in the system from deleted plugin. Fisheye&Crucible works like a charm
Workaround
Disable plugin first before uninstalling it.
Affected versions
Affected version 4.1.1 which uses UPM 2.20.5