[ 
https://issues.apache.org/jira/browse/FELIX-3067?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13629943#comment-13629943
 ] 

metatech commented on FELIX-3067:
---------------------------------

We are also facing this problem infrequently with Felix 3.0.9 (ServiceMix 
4.4.2), especially when hot-reploying bundles...
We did not try the patch yet, but wouldn't safer to throw an exception instead 
of just logging the lock failure.

Example of such a stack trace (not during hot-redeploy) : 
"camel-jetty:9005-238" prio=6 tid=0x5f256800 nid=0x2fe8 in Object.wait() 
[0x67e2e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
        at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:4821)
        - locked <0x1e40fe40> (a [Ljava.lang.Object;)
        at org.apache.felix.framework.Felix.access$0(Felix.java:4800)
        at 
org.apache.felix.framework.Felix$FelixResolver.resolve(Felix.java:3998)
        at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3439)
        at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1609)
        at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:900)
        at 
org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
        at 
org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at 
org.apache.log4j.OsgiThrowableRenderer.findClass(OsgiThrowableRenderer.java:217)
        at 
org.apache.log4j.OsgiThrowableRenderer.formatElement(OsgiThrowableRenderer.java:129)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:99)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:112)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:53)
        at 
org.apache.log4j.spi.ThrowableInformation.getThrowableStrRep(ThrowableInformation.java:89)
        - locked <0x5b8e9db8> (a org.apache.log4j.spi.ThrowableInformation)
        at 
org.apache.log4j.spi.LoggingEvent.getThrowableStrRep(LoggingEvent.java:413)
        at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:313)
        at 
org.apache.log4j.DailyRollingFileAppender.subAppend(DailyRollingFileAppender.java:369)
        at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
        - locked <0x20b84430> (a org.apache.log4j.DailyRollingFileAppender)
        at 
org.apache.log4j.sift.MDCSiftingAppender.append(MDCSiftingAppender.java:80)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
        - locked <0x1dcb5428> (a org.apache.log4j.sift.MDCSiftingAppender)
        at 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
        at org.apache.log4j.Category.callAppenders(Category.java:206)
        - locked <0x1dc3dcd8> (a org.apache.log4j.spi.RootLogger)
        at org.apache.log4j.Category.forcedLog(Category.java:391)
        at org.apache.log4j.Category.log(Category.java:856)
        at 
org.ops4j.pax.logging.service.internal.PaxLoggerImpl.error(PaxLoggerImpl.java:156)
        at 
org.ops4j.pax.logging.internal.TrackingLogger.error(TrackingLogger.java:96)
        at org.ops4j.pax.logging.slf4j.Slf4jLogger.error(Slf4jLogger.java:911)
        at org.apache.camel.processor.CamelLogger.log(CamelLogger.java:232)
        at org.apache.camel.processor.CamelLogger.log(CamelLogger.java:219)
        at 
org.apache.camel.processor.RedeliveryErrorHandler.logFailedDelivery(RedeliveryErrorHandler.java:866)
        at 
org.apache.camel.processor.RedeliveryErrorHandler.deliverToFailureProcessor(RedeliveryErrorHandler.java:766)
        at 
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:261)
        at 
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
        at 
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:306)
        at 
org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:139)
        at 
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:106)
        at 
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
        at 
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
        at 
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
        at 
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
        at 
com.mycompany.camel.component.secure.SecureCamelContinuationServlet.service(SecureCamelContinuationServlet.java:156)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
        at 
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:538)
        at 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
        at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:937)
        at 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
        at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:871)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
        at 
com.mycompany.jetty.SecureHandlerCollection.handle(SecureHandlerCollection.java:78)
        at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
        at org.eclipse.jetty.server.Server.handle(Server.java:346)
        at 
org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:589)
        at 
org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1048)
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:601)
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:214)
        at 
org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:411)
        at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
        at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
        at 
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
        at java.lang.Thread.run(Thread.java:662)

                
> Prevent Deadlock Situation in Felix.acquireGlobalLock
> -----------------------------------------------------
>
>                 Key: FELIX-3067
>                 URL: https://issues.apache.org/jira/browse/FELIX-3067
>             Project: Felix
>          Issue Type: Improvement
>          Components: Framework
>    Affects Versions: framework-3.0.7, framework-3.0.8, framework-3.0.9, 
> framework-3.2.0, framework-3.2.1, fileinstall-3.1.10
>            Reporter: Felix Meschberger
>         Attachments: FELIX-3067.patch, FELIX-3067-sling.patch
>
>
> Every now and then we encounter deadlock situations which involve the 
> Felix.acquireGlobalLock method. In our use case we have the following aspects 
> which contribute to this:
> (a) The Apache Felix Declarative Services implementation stops components 
> (and thus causes service unregistration) while the bundle lock is being held 
> because this happens in a SynchronousBundleListener while handling the 
> STOPPING bundle event. We have to do this to ensure the bundle is not really 
> stopped yet to properly stop the bundle's components.
> (b) Implementing a special class loader which involves dynamically resolving 
> packages which in turn uses the global lock
> (c) Eclipse Gemini Blueprint implementation which operates asynchronously
> (d) synchronization in application classes
> Often times, I would assume that we can self-heal such complex deadlck 
> situations, if we let acquireGlobalLock time out. Looking at the calles of 
> acquireGlobalLock there seems to already be provision to handle this case 
> since acquireGlobalLock returns true only if the global lock has actually 
> been acquired.
> This issue is kind of a companion to FELIX-3000 where deadlocks involve 
> sending service registration events while holding the bundle lock.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to