Aled Sage created BROOKLYN-316:
----------------------------------

             Summary: 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


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.4#6332)

Reply via email to