[ 
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)

Reply via email to