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

metatech edited comment on FELIX-3067 at 2/21/14 10:12 AM:
-----------------------------------------------------------

With ServiceMix 4.5.3 (containing Felix 3.2.2), here are the 2 threads involved 
in the deadlock when trying to acquire the Felix global lock together with the 
"logger" lock.  Check for the 4 -----> below.

{code}
"FelixPackageAdmin" daemon prio=6 tid=0x0000000008df2800 nid=0x2f6c waiting for 
monitor entry [0x00000000098ae000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231)
        - waiting to lock <0x00000000c02d4010> (a 
org.apache.log4j.sift.MDCSiftingAppender)
-----> Trying to acquire log lock
        at 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
        at org.apache.log4j.Category.callAppenders(Category.java:193)
        at org.apache.log4j.Category.forcedLog(Category.java:365)
        at org.apache.log4j.Category.log(Category.java:772)
        at 
org.ops4j.pax.logging.service.internal.PaxLoggerImpl.error(PaxLoggerImpl.java:159)
        at 
org.ops4j.pax.logging.internal.TrackingLogger.error(TrackingLogger.java:96)
        at 
org.apache.commons.logging.internal.JclLogger.error(JclLogger.java:164)
        at 
org.springframework.osgi.extender.internal.util.concurrent.RunnableTimedExecution.execute(RunnableTimedExecution.java:109)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener.maybeCloseApplicationContextFor(ContextLoaderListener.java:798)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$ContextBundleListener.handleEvent(ContextLoaderListener.java:242)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$BaseListener.bundleChanged(ContextLoaderListener.java:172)
        at 
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:807)
        at 
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:729)
        at 
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:610)
        at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:3879)
        at org.apache.felix.framework.Felix.stopBundle(Felix.java:2268)
        at org.apache.felix.framework.Felix$RefreshHelper.stop(Felix.java:4668)
-----> Global lock acquired
        at org.apache.felix.framework.Felix.refreshPackages(Felix.java:3699)
        at 
org.apache.felix.framework.PackageAdminImpl.run(PackageAdminImpl.java:365)
        at java.lang.Thread.run(Thread.java:662)

"Timer-2" daemon prio=6 tid=0x0000000010202000 nid=0x23cc in Object.wait() 
[0x000000001352e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
-----> Trying to acquire global lock
        at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:4995)
        - locked <0x00000000c082b910> (a [Ljava.lang.Object;)
        at org.apache.felix.framework.Felix.access$600(Felix.java:79)
        at 
org.apache.felix.framework.Felix$StatefulResolver.resolve(Felix.java:4177)
        at 
org.apache.felix.framework.ModuleImpl.searchDynamicImports(ModuleImpl.java:1448)
        at 
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:759)
        at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
        at 
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at 
org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)
        at 
org.apache.felix.framework.resolver.WireModuleImpl.getClass(WireModuleImpl.java:97)
        at 
org.apache.felix.framework.ModuleImpl.searchImports(ModuleImpl.java:1426)
        at 
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:747)
        at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
        at 
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at 
org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)
        at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1654)
        at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:909)
        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.ops4j.pax.logging.util.OsgiUtil.loadClass(OsgiUtil.java:99)
        at 
org.apache.log4j.OsgiThrowableRenderer.findClass(OsgiThrowableRenderer.java:221)
        at 
org.apache.log4j.OsgiThrowableRenderer.formatElement(OsgiThrowableRenderer.java:134)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:105)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:52)
        at 
org.apache.log4j.spi.ThrowableInformation.getThrowableStrRep(ThrowableInformation.java:89)
        - locked <0x00000000c482ac88> (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 <0x00000000c02d6688> (a 
org.apache.log4j.DailyRollingFileAppender)
        at 
org.apache.log4j.sift.MDCSiftingAppender.append(MDCSiftingAppender.java:80)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
-----> Log lock acquired
        - locked <0x00000000c02d4010> (a 
org.apache.log4j.sift.MDCSiftingAppender)
        at 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
        at org.apache.log4j.Category.callAppenders(Category.java:193)
        at org.apache.log4j.Category.forcedLog(Category.java:365)
        at org.apache.log4j.Category.log(Category.java:772)
        at 
org.ops4j.pax.logging.service.internal.PaxLoggerImpl.warn(PaxLoggerImpl.java:151)
        at 
org.ops4j.pax.logging.internal.TrackingLogger.warn(TrackingLogger.java:91)
        at 
org.apache.commons.logging.internal.JclLogger.warn(JclLogger.java:151)
        at 
org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1010)
        at 
org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.doClose(AbstractOsgiBundleApplicationContext.java:197)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$501(AbstractDelegatedExecutionApplicationContext.java:69)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$2.run(AbstractDelegatedExecutionApplicationContext.java:214)
        at 
org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.normalClose(AbstractDelegatedExecutionApplicationContext.java:210)
        at 
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.close(DependencyWaiterApplicationContextExecutor.java:374)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.doClose(AbstractDelegatedExecutionApplicationContext.java:236)
        at 
org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:970)
        - locked <0x00000000c2778310> (a java.lang.Object)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$3.run(ContextLoaderListener.java:805)
        at 
org.springframework.osgi.extender.internal.util.concurrent.RunnableTimedExecution$MonitoredRunnable.run(RunnableTimedExecution.java:60)
        at 
org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:70)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)
{code}



was (Author: metatech):
With ServiceMix 4.5.3 (containing Felix 3.2.2), here are the 2 threads involved 
in the deadlock when trying to acquire the Felix global lock together with the 
"logger" lock.  Check for the 4 -----> below.

{code}
"FelixPackageAdmin" daemon prio=6 tid=0x0000000008df2800 nid=0x2f6c waiting for 
monitor entry [0x00000000098ae000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231)
        - waiting to lock <0x00000000c02d4010> (a 
org.apache.log4j.sift.MDCSiftingAppender)
-----> Trying to acquire lock lock
        at 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
        at org.apache.log4j.Category.callAppenders(Category.java:193)
        at org.apache.log4j.Category.forcedLog(Category.java:365)
        at org.apache.log4j.Category.log(Category.java:772)
        at 
org.ops4j.pax.logging.service.internal.PaxLoggerImpl.error(PaxLoggerImpl.java:159)
        at 
org.ops4j.pax.logging.internal.TrackingLogger.error(TrackingLogger.java:96)
        at 
org.apache.commons.logging.internal.JclLogger.error(JclLogger.java:164)
        at 
org.springframework.osgi.extender.internal.util.concurrent.RunnableTimedExecution.execute(RunnableTimedExecution.java:109)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener.maybeCloseApplicationContextFor(ContextLoaderListener.java:798)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$ContextBundleListener.handleEvent(ContextLoaderListener.java:242)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$BaseListener.bundleChanged(ContextLoaderListener.java:172)
        at 
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:807)
        at 
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:729)
        at 
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:610)
        at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:3879)
        at org.apache.felix.framework.Felix.stopBundle(Felix.java:2268)
        at org.apache.felix.framework.Felix$RefreshHelper.stop(Felix.java:4668)
-----> Global lock acquired
        at org.apache.felix.framework.Felix.refreshPackages(Felix.java:3699)
        at 
org.apache.felix.framework.PackageAdminImpl.run(PackageAdminImpl.java:365)
        at java.lang.Thread.run(Thread.java:662)

"Timer-2" daemon prio=6 tid=0x0000000010202000 nid=0x23cc in Object.wait() 
[0x000000001352e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
-----> Trying to acquire global lock
        at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:4995)
        - locked <0x00000000c082b910> (a [Ljava.lang.Object;)
        at org.apache.felix.framework.Felix.access$600(Felix.java:79)
        at 
org.apache.felix.framework.Felix$StatefulResolver.resolve(Felix.java:4177)
        at 
org.apache.felix.framework.ModuleImpl.searchDynamicImports(ModuleImpl.java:1448)
        at 
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:759)
        at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
        at 
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at 
org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)
        at 
org.apache.felix.framework.resolver.WireModuleImpl.getClass(WireModuleImpl.java:97)
        at 
org.apache.felix.framework.ModuleImpl.searchImports(ModuleImpl.java:1426)
        at 
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:747)
        at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
        at 
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at 
org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)
        at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1654)
        at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:909)
        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.ops4j.pax.logging.util.OsgiUtil.loadClass(OsgiUtil.java:99)
        at 
org.apache.log4j.OsgiThrowableRenderer.findClass(OsgiThrowableRenderer.java:221)
        at 
org.apache.log4j.OsgiThrowableRenderer.formatElement(OsgiThrowableRenderer.java:134)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:105)
        at 
org.apache.log4j.OsgiThrowableRenderer.doRender(OsgiThrowableRenderer.java:52)
        at 
org.apache.log4j.spi.ThrowableInformation.getThrowableStrRep(ThrowableInformation.java:89)
        - locked <0x00000000c482ac88> (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 <0x00000000c02d6688> (a 
org.apache.log4j.DailyRollingFileAppender)
        at 
org.apache.log4j.sift.MDCSiftingAppender.append(MDCSiftingAppender.java:80)
        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
-----> Log lock acquired
        - locked <0x00000000c02d4010> (a 
org.apache.log4j.sift.MDCSiftingAppender)
        at 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
        at org.apache.log4j.Category.callAppenders(Category.java:193)
        at org.apache.log4j.Category.forcedLog(Category.java:365)
        at org.apache.log4j.Category.log(Category.java:772)
        at 
org.ops4j.pax.logging.service.internal.PaxLoggerImpl.warn(PaxLoggerImpl.java:151)
        at 
org.ops4j.pax.logging.internal.TrackingLogger.warn(TrackingLogger.java:91)
        at 
org.apache.commons.logging.internal.JclLogger.warn(JclLogger.java:151)
        at 
org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1010)
        at 
org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.doClose(AbstractOsgiBundleApplicationContext.java:197)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$501(AbstractDelegatedExecutionApplicationContext.java:69)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$2.run(AbstractDelegatedExecutionApplicationContext.java:214)
        at 
org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.normalClose(AbstractDelegatedExecutionApplicationContext.java:210)
        at 
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.close(DependencyWaiterApplicationContextExecutor.java:374)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.doClose(AbstractDelegatedExecutionApplicationContext.java:236)
        at 
org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:970)
        - locked <0x00000000c2778310> (a java.lang.Object)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$3.run(ContextLoaderListener.java:805)
        at 
org.springframework.osgi.extender.internal.util.concurrent.RunnableTimedExecution$MonitoredRunnable.run(RunnableTimedExecution.java:60)
        at 
org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:70)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)
{code}


> 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-sling.patch, FELIX-3067.patch, 
> threaddump-ise-deadlock.txt, threads_locked_by_camel_type_converter
>
>
> 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 was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to