[
https://issues.apache.org/jira/browse/FELIX-3393?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13242534#comment-13242534
]
Jarek Gawor commented on FELIX-3393:
------------------------------------
I was hoping that this fix also addresses the problem we were seeing in
Geronimo (which looks very similar to the original stack trace) but we are
still seeing the problem. Here are the relevant stack traces:
"FelixShutdown" prio=10 tid=0x08157c00 nid=0x5a0c in Object.wait() [0x30ffe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0xa33ded98> (a java.lang.Integer)
at java.lang.Object.wait(Object.java:485)
at
org.apache.felix.framework.FrameworkStartLevelImpl.setStartLevelAndWait(FrameworkStartLevelImpl.java:153)
- locked <0xa33ded98> (a java.lang.Integer)
at
org.apache.felix.framework.Felix$SystemBundleActivator.stop(Felix.java:4492)
at
org.apache.felix.framework.util.SecureAction.stopActivator(SecureAction.java:663)
at org.apache.felix.framework.Felix.stopBundle(Felix.java:2361)
at org.apache.felix.framework.Felix$2.run(Felix.java:882)
at java.lang.Thread.run(Thread.java:662)
"Blueprint Extender: 1" daemon prio=10 tid=0x086fa400 nid=0x5a09 in
Object.wait() [0x312fb000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x9f6a28f0> (a [Ljava.lang.Object;)
at java.lang.Object.wait(Object.java:485)
at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4871)
- locked <0x9f6a28f0> (a [Ljava.lang.Object;)
at org.apache.felix.framework.Felix.registerService(Felix.java:3205)
at
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
at
org.apache.aries.blueprint.container.BlueprintContainerImpl.registerService(BlueprintContainerImpl.java:388)
at
org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:324)
at
org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:213)
- locked <0xa26ec7f0> (a java.util.concurrent.atomic.AtomicBoolean)
- locked <0xa26ec7e0> (a java.util.concurrent.atomic.AtomicBoolean)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
"FelixStartLevel" daemon prio=10 tid=0x082dcc00 nid=0x5a07 waiting for monitor
entry [0x326c8000]
java.lang.Thread.State: BLOCKED (on object monitor)
at
org.apache.aries.blueprint.container.BlueprintContainerImpl.destroy(BlueprintContainerImpl.java:810)
- waiting to lock <0xa26ec7f0> (a
java.util.concurrent.atomic.AtomicBoolean)
at
org.apache.aries.blueprint.container.BlueprintExtender.destroyContext(BlueprintExtender.java:204)
at
org.apache.aries.blueprint.container.BlueprintExtender.bundleChanged(BlueprintExtender.java:196)
at
org.apache.aries.blueprint.container.BlueprintExtender$BlueprintBundleTrackerCustomizer.modifiedBundle(BlueprintExtender.java:385)
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:453)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:237)
at
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:413)
at
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:868)
at
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:789)
at
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:514)
at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4244)
at org.apache.felix.framework.Felix.stopBundle(Felix.java:2351)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1214)
at
org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:298)
at java.lang.Thread.run(Thread.java:662)
"main" prio=10 tid=0x08058c00 nid=0x470e in Object.wait() [0xb7410000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x9f875888> (a org.apache.felix.framework.util.ThreadGate)
at org.apache.felix.framework.util.ThreadGate.await(ThreadGate.java:79)
- locked <0x9f875888> (a org.apache.felix.framework.util.ThreadGate)
at org.apache.felix.framework.Felix.waitForStop(Felix.java:921)
> Possible deadlock with reentrant calls
> --------------------------------------
>
> Key: FELIX-3393
> URL: https://issues.apache.org/jira/browse/FELIX-3393
> Project: Felix
> Issue Type: Bug
> Components: Framework
> Affects Versions: framework-4.0.2
> Reporter: Guillaume Nodet
> Assignee: Guillaume Nodet
> Fix For: framework-4.2.0
>
>
> This happen when a thread which has a bundle lock has some reentrant call
> while the global lock is held by another thread (see stack trace below)
> In the code Felix#acquireBundleLock, the comment on the loop says "Wait if
> the desired bundle is already locked by someone else or if any thread has the
> global lock, unless the current thread holds the global lock or the bundle
> lock already." which makes total sense, but I don't think the code handle the
> case where the lock is already held by the current thread *and* the global
> lock is held by a different thread.
> Possible patch below.
> {code}
> diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java
> b/framework/src/main/java/org/apache/felix/framework/Felix.java
> index 6504f13..0965d8b 100644
> --- a/framework/src/main/java/org/apache/felix/framework/Felix.java
> +++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
> @@ -5002,7 +5002,8 @@ public class Felix extends BundleImpl implements
> Framework
> // holds the global lock or the bundle lock already.
> while (!bundle.isLockable() ||
> ((m_globalLockThread != null)
> - && (m_globalLockThread != Thread.currentThread())))
> + && (m_globalLockThread != Thread.currentThread())
> + && (bundle.getLockingThread() !=
> Thread.currentThread())))
> {
> // Check to make sure the bundle is in a desired state.
> // If so, keep waiting. If not, throw an exception.
> {code}
> {code}
> "FelixStartLevel" daemon prio=5 tid=7fb1b2ac7800 nid=0x111144000 in
> Object.wait() [111142000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <7e039bc90> (a [Ljava.lang.Object;)
> at java.lang.Object.wait(Object.java:485)
> at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:5025)
> - locked <7e039bc90> (a [Ljava.lang.Object;)
> at org.apache.felix.framework.Felix.registerService(Felix.java:3282)
> at
> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.registerService(BlueprintContainerImpl.java:408)
> at
> org.apache.aries.blueprint.container.ServiceRecipe.register(ServiceRecipe.java:184)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.registerServices(BlueprintContainerImpl.java:666)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:334)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:230)
> - locked <7f5898750> (a java.util.concurrent.atomic.AtomicBoolean)
> - locked <7f5898740> (a java.util.concurrent.atomic.AtomicBoolean)
> at
> org.apache.aries.blueprint.container.BlueprintExtender.checkBundle(BlueprintExtender.java:325)
> at
> org.apache.aries.blueprint.container.BlueprintExtender.bundleChanged(BlueprintExtender.java:244)
> at
> org.apache.aries.blueprint.container.BlueprintExtender$BlueprintBundleTrackerCustomizer.modifiedBundle(BlueprintExtender.java:471)
> at
> org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:495)
> at
> org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1)
> at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:238)
> at
> org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:457)
> at
> org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:870)
> at
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:791)
> at
> org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:515)
> at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4321)
> at org.apache.felix.framework.Felix.startBundle(Felix.java:1945)
> at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1213)
> at
> org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
> at java.lang.Thread.run(Thread.java:680)
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira