[
https://issues.apache.org/jira/browse/BROOKLYN-316?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Aled Sage resolved BROOKLYN-316.
--------------------------------
Resolution: Fixed
Fix Version/s: 0.10.0
> jetty loginService used in karaf: can cause ConstraintSecurityHandler's to
> fail
> -------------------------------------------------------------------------------
>
> Key: BROOKLYN-316
> URL: https://issues.apache.org/jira/browse/BROOKLYN-316
> Project: Brooklyn
> Issue Type: Bug
> Reporter: Aled Sage
> Fix For: 0.10.0
>
>
> In a downstream project of Brooklyn, trying to use karaf with Brooklyn
> master, some UI modules failed to load. Whether it fails, and which modules
> fail, is non-deterministic.
> ---
> On doing a {{bundle:refresh}} for the ui module, it started up correctly.
> Below is the exception from the logs. The second is probably the most
> relevant:
> {noformat}
> 07:54:26,624 WARN 224 component.AbstractLifeCycle [pool-99-thread-3]
> FAILED
> HttpServiceContext{httpContext=WebAppHttpContext{amp-ui-blueprint-composer -
> 13}}: java.lang.IllegalStateException: LoginService has different
> IdentityService to
> org.eclipse.jetty.security.ConstraintSecurityHandler@315dd009
> java.lang.IllegalStateException: LoginService has different IdentityService
> to org.eclipse.jetty.security.ConstraintSecurityHandler@315dd009
> at
> org.eclipse.jetty.security.SecurityHandler.doStart(SecurityHandler.java:376)[220:org.eclipse.jetty.security:9.2.14.v20151106]
> at
> org.eclipse.jetty.security.ConstraintSecurityHandler.doStart(ConstraintSecurityHandler.java:449)[220:org.eclipse.jetty.security:9.2.14.v20151106]
> at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.session.SessionHandler.doStart(SessionHandler.java:116)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:784)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294)[222:org.eclipse.jetty.servlet:9.2.14.v20151106]
> at
> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)[221:org.eclipse.jetty.server:9.2.14.v20151106]
> at
> org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doStart(HttpServiceContext.java:245)[244:org.ops4j.pax.web.pax-web-jetty:4.2.4]
> at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)[224:org.eclipse.jetty.util:9.2.14.v20151106]
> at
> org.ops4j.pax.web.service.jetty.internal.JettyServerImpl$1.start(JettyServerImpl.java:259)[244:org.ops4j.pax.web.pax-web-jetty:4.2.4]
> at
> org.ops4j.pax.web.service.internal.HttpServiceStarted.end(HttpServiceStarted.java:1047)[246:org.ops4j.pax.web.pax-web-runtime:4.2.4]
> at
> org.ops4j.pax.web.service.internal.HttpServiceProxy.end(HttpServiceProxy.java:413)[246:org.ops4j.pax.web.pax-web-runtime:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.RegisterWebAppVisitorWC.end(RegisterWebAppVisitorWC.java:380)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.model.WebApp.accept(WebApp.java:692)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher$WebAppDependencyListener.register(WebAppPublisher.java:237)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher$WebAppDependencyListener.addingService(WebAppPublisher.java:182)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher$WebAppDependencyListener.addingService(WebAppPublisher.java:135)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)[org.osgi.core-6.0.0.jar:]
> at
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)[org.osgi.core-6.0.0.jar:]
> at
> org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)[org.osgi.core-6.0.0.jar:]
> at
> org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)[org.osgi.core-6.0.0.jar:]
> at
> org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:318)[org.osgi.core-6.0.0.jar:]
> at
> org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261)[org.osgi.core-6.0.0.jar:]
> at
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher.publish(WebAppPublisher.java:101)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.WebObserver.deploy(WebObserver.java:219)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.WebObserver$1.doStart(WebObserver.java:179)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.extender.SimpleExtension.start(SimpleExtension.java:59)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> org.ops4j.pax.web.extender.war.internal.extender.AbstractExtender$1.run(AbstractExtender.java:280)[242:org.ops4j.pax.web.pax-web-extender-war:4.2.4]
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)[:1.7.0_71]
> at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_71]
> at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)[:1.7.0_71]
> at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)[:1.7.0_71]
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_71]
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_71]
> at java.lang.Thread.run(Thread.java:745)[:1.7.0_71]
> {noformat}
> Running this in the debugger, I see there is a race: multiple threads are
> doing {{ConstraintSecurityHandler.doStart()}}. There is one thread per UI
> bundle.
> These threads all share the same {{LoginService}} (which is defined in
> Brooklyn's {{karaf/jetty-config/src/main/resources/jetty.xml}}. However, that
> LoginService does not have an IdentityService.
> Each thread executing doStart() will see that there is no IdentityService,
> will instantiate one, and will set it on the shared LoginService.
> The subsequent check that {{securityService.getLoginService() ==
> _loginService}} then fails for some threads, depending on the interleaving.
> The doStart() does the following to get the identityService:
> * is there an identityService already set on the loginService (if so, use it)
> * is there a bean for an identityService that it can use
> * instantiate a new {{org.eclipse.jetty.security.DefaultIdentityService}},
> and use that.
> The stacktraces below show the execution state of two threads. One or both is
> about to fail (depending on subsequent interleaving, which I was controlling
> through an attached debugger):
> A solution would therefore be for Brooklyn to create the loginService bean
> with an existing IdentityService instance.
> {noformat}
> Thread [pool-99-thread-2] (Suspended)
> owns: Object (id=981)
> owns: Object (id=982)
> owns: Object (id=983)
> owns: WebObserver$1 (id=984)
> ConstraintSecurityHandler(SecurityHandler).doStart() line: 351
> ConstraintSecurityHandler.doStart() line: 449
> ConstraintSecurityHandler(AbstractLifeCycle).start() line: 68
> SessionHandler(ContainerLifeCycle).start(LifeCycle) line: 132
> SessionHandler(ContainerLifeCycle).doStart() line: 114
> SessionHandler(AbstractHandler).doStart() line: 61
> SessionHandler(ScopedHandler).doStart() line: 120
> SessionHandler.doStart() line: 116
> SessionHandler(AbstractLifeCycle).start() line: 68
> HttpServiceContext(ContainerLifeCycle).start(LifeCycle) line: 132
> HttpServiceContext(ContainerLifeCycle).doStart() line: 114
> HttpServiceContext(AbstractHandler).doStart() line: 61
> HttpServiceContext(ScopedHandler).doStart() line: 120
> HttpServiceContext(ContextHandler).startContext() line: 784
> HttpServiceContext(ServletContextHandler).startContext() line: 294
> HttpServiceContext(ContextHandler).doStart() line: 741
> HttpServiceContext.doStart() line: 245
> HttpServiceContext(AbstractLifeCycle).start() line: 68
> JettyServerImpl$1.start() line: 259
> HttpServiceStarted.end(HttpContext) line: 1047
> HttpServiceProxy.end(HttpContext) line: 413
> RegisterWebAppVisitorWC.end() line: 380
> WebApp.accept(WebAppVisitor) line: 692
>
> WebAppPublisher$WebAppDependencyListener.register(WebAppDependencyHolder,
> HttpService) line: 237
>
> WebAppPublisher$WebAppDependencyListener.addingService(ServiceReference<WebAppDependencyHolder>)
> line: 182
>
> WebAppPublisher$WebAppDependencyListener.addingService(ServiceReference)
> line: 135
> ServiceTracker$Tracked.customizerAdding(ServiceReference<S>,
> ServiceEvent) line: 941
> ServiceTracker$Tracked.customizerAdding(Object, Object) line: 870
> ServiceTracker$Tracked(AbstractTracked<S,T,R>).trackAdding(S, R) line:
> 256
> ServiceTracker$Tracked(AbstractTracked<S,T,R>).trackInitial() line: 183
> ServiceTracker<S,T>.open(boolean) line: 318
> ServiceTracker<S,T>.open() line: 261
> WebAppPublisher.publish(WebApp) line: 101
> WebObserver.deploy(WebApp) line: 219
> WebObserver$1.doStart() line: 179
> WebObserver$1(SimpleExtension).start() line: 59
> AbstractExtender$1.run() line: 280
> Executors$RunnableAdapter<T>.call() line: 471
> ScheduledThreadPoolExecutor$ScheduledFutureTask<V>(FutureTask<V>).run()
> line: 262
>
> ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.access$201(ScheduledThreadPoolExecutor$ScheduledFutureTask)
> line: 178
> ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.run() line: 292
>
> ScheduledThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker)
> line: 1145
> ThreadPoolExecutor$Worker.run() line: 615
> Thread.run() line: 745
> Thread [pool-99-thread-1] (Suspended (breakpoint at line 374 in
> SecurityHandler))
> owns: Object (id=985)
> owns: Object (id=986)
> owns: Object (id=987)
> owns: WebObserver$1 (id=988)
> ConstraintSecurityHandler(SecurityHandler).doStart() line: 374
> ConstraintSecurityHandler.doStart() line: 449
> ConstraintSecurityHandler(AbstractLifeCycle).start() line: 68
> SessionHandler(ContainerLifeCycle).start(LifeCycle) line: 132
> SessionHandler(ContainerLifeCycle).doStart() line: 114
> SessionHandler(AbstractHandler).doStart() line: 61
> SessionHandler(ScopedHandler).doStart() line: 120
> SessionHandler.doStart() line: 116
> SessionHandler(AbstractLifeCycle).start() line: 68
> HttpServiceContext(ContainerLifeCycle).start(LifeCycle) line: 132
> HttpServiceContext(ContainerLifeCycle).doStart() line: 114
> HttpServiceContext(AbstractHandler).doStart() line: 61
> HttpServiceContext(ScopedHandler).doStart() line: 120
> HttpServiceContext(ContextHandler).startContext() line: 784
> HttpServiceContext(ServletContextHandler).startContext() line: 294
> HttpServiceContext(ContextHandler).doStart() line: 741
> HttpServiceContext.doStart() line: 245
> HttpServiceContext(AbstractLifeCycle).start() line: 68
> JettyServerImpl$1.start() line: 259
> HttpServiceStarted.end(HttpContext) line: 1047
> HttpServiceProxy.end(HttpContext) line: 413
> RegisterWebAppVisitorWC.end() line: 380
> WebApp.accept(WebAppVisitor) line: 692
>
> WebAppPublisher$WebAppDependencyListener.register(WebAppDependencyHolder,
> HttpService) line: 237
>
> WebAppPublisher$WebAppDependencyListener.addingService(ServiceReference<WebAppDependencyHolder>)
> line: 182
>
> WebAppPublisher$WebAppDependencyListener.addingService(ServiceReference)
> line: 135
> ServiceTracker$Tracked.customizerAdding(ServiceReference<S>,
> ServiceEvent) line: 941
> ServiceTracker$Tracked.customizerAdding(Object, Object) line: 870
> ServiceTracker$Tracked(AbstractTracked<S,T,R>).trackAdding(S, R) line:
> 256
> ServiceTracker$Tracked(AbstractTracked<S,T,R>).trackInitial() line: 183
> ServiceTracker<S,T>.open(boolean) line: 318
> ServiceTracker<S,T>.open() line: 261
> WebAppPublisher.publish(WebApp) line: 101
> WebObserver.deploy(WebApp) line: 219
> WebObserver$1.doStart() line: 179
> WebObserver$1(SimpleExtension).start() line: 59
> AbstractExtender$1.run() line: 280
> Executors$RunnableAdapter<T>.call() line: 471
> ScheduledThreadPoolExecutor$ScheduledFutureTask<V>(FutureTask<V>).run()
> line: 262
>
> ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.access$201(ScheduledThreadPoolExecutor$ScheduledFutureTask)
> line: 178
> ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.run() line: 292
>
> ScheduledThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker)
> line: 1145
> ThreadPoolExecutor$Worker.run() line: 615
> Thread.run() line: 745
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)