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

Dmitry Konstantinov commented on ARIES-1051:
--------------------------------------------

Looks like yes, I have not enough information about the Karaf issue reason. I 
mentioned this fact just to explain what in case of Karaf >= 2.3.2 version the 
workaround is enable by default.

The simplest way to reproduce deadlock is to use breakpoints.
A blueprint bandle with a service is needed-  test bundle. 
# Run Karaf with debug
# Setup a breakpoint to the first line of 
org.apache.aries.blueprint.container.BlueprintContainerImpl#registerService 
method. Breakpoint should suspend only current thread
# Setup a breakpoint to org.apache.felix.framework.Felix#refreshPackages method 
just after acquireGlobalLock() invocation
# Drop the test bundle to deploy folder
# Breakpoint 
org.apache.aries.blueprint.container.BlueprintContainerImpl#registerService 
should be triggered
# Run a command "list" in Karaf console to find id of the test bundle
# Run a command "refresh <id of the test bundle>" in Karaf console
# Breakpoint to org.apache.felix.framework.Felix#refreshPackages method just 
after acquireGlobalLock() invocation should be triggered
# Now we are inside of the deadlock and can continiue execution of all threads 
suspended by debug
As the result: test bundle is stick in Stopping blueprint state
{code}
"fileinstall-D:\TestInstances\Diagnostic/deploy@112" daemon prio=5 tid=0x14 
nid=NA waiting
  java.lang.Thread.State: WAITING
         blocks FelixFrameworkWiring@41
          at java.lang.Object.wait(Object.java:-1)
          at java.lang.Object.wait(Object.java:485)
          at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4871)
          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:439)
          at 
org.apache.aries.blueprint.container.ServiceRecipe.register(ServiceRecipe.java:190)
          at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.registerServices(BlueprintContainerImpl.java:690)
          at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:369)
          at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:261)
          - locked <0x1d3> (a java.util.concurrent.atomic.AtomicBoolean)
          at 
org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:259)
          at 
org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:222)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)
          at 
org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1103)
          at 
org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:695)
          at 
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:483)
          at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4244)
          at org.apache.felix.framework.Felix.startBundle(Felix.java:1923)
          at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
          at 
org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1247)
          at 
org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1219)
          at 
org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:508)
          at 
org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)


"FelixFrameworkWiring@41" daemon prio=5 tid=0x78 nid=NA waiting for monitor 
entry
  java.lang.Thread.State: BLOCKED
         waiting for fileinstall-D:\TestInstances\Diagnostic/deploy@112 to 
release lock on <0x1d3> (a java.util.concurrent.atomic.AtomicBoolean)
          at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.destroy(BlueprintContainerImpl.java:842)
          at 
org.apache.aries.blueprint.container.BlueprintExtender$3.run(BlueprintExtender.java:284)
          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 
org.apache.aries.blueprint.container.BlueprintExtender.destroyContainer(BlueprintExtender.java:305)
          at 
org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:206)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)
          at 
org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)
          at 
org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1103)
          at 
org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:695)
          at 
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:483)
          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$RefreshHelper.stop(Felix.java:4629)
          at org.apache.felix.framework.Felix.refreshPackages(Felix.java:3951)
          at 
org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:172)
          at java.lang.Thread.run(Thread.java:662)

{code}


> Blueprint deadlock is occured during Karaf startup or bundle update action
> --------------------------------------------------------------------------
>
>                 Key: ARIES-1051
>                 URL: https://issues.apache.org/jira/browse/ARIES-1051
>             Project: Aries
>          Issue Type: Bug
>          Components: Blueprint
>    Affects Versions: blueprint-core-1.1.0
>         Environment: Windows 7, x64
> java version "1.6.0_24"
> Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
> Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
> Karaf 2.3.1
>            Reporter: Dmitry Konstantinov
>            Priority: Critical
>
> There are two locks - felix bundle lock and lock of {{AtomicBoolean 
> scheduled}} in BlueprintContainerImpl class and these locks can be occured in 
> diferent order for some situations.
> For example:
> 1) In case of container initialization the order is following: blueprint lock 
> (inside executor task) -> bundle lock (inside service registration) 
> 2) In case of container destroying: bundle lock (bundle tracker) -> blueprint 
> lock (BlueprintContainerImpl.namespaceHandlerUnregistered method)
> The thread dump provides a real example of the deadlock:
> {noformat}
> "Blueprint Extender: 3" daemon prio=6 tid=0x0000000006ec4000 nid=0x1658 in 
> Object.wait() [0x0000000009b2e000]
>    java.lang.Thread.State: WAITING (on object monitor)
>       at java.lang.Object.wait(Native Method)
>       - waiting on <0x00000000e098fdf0> (a [Ljava.lang.Object;)
>       at java.lang.Object.wait(Object.java:485)
>       at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4871)
>       - locked <0x00000000e098fdf0> (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:439)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:379)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:261)
>       - locked <0x00000000e0274b50> (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 
> org.apache.aries.blueprint.container.ExecutorServiceWrapper.run(ExecutorServiceWrapper.java:106)
>       at 
> org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)
>       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)
> "FelixFrameworkWiring" daemon prio=6 tid=0x0000000006eca000 nid=0x900 waiting 
> for monitor entry [0x000000000b30e000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.namespaceHandlerUnregistered(BlueprintContainerImpl.java:892)
>       - waiting to lock <0x00000000e0274b50> (a 
> java.util.concurrent.atomic.AtomicBoolean)
>       at 
> org.apache.aries.blueprint.namespace.NamespaceHandlerRegistryImpl$NamespaceHandlerSetImpl.unregisterHandler(NamespaceHandlerRegistryImpl.java:582)
>       at 
> org.apache.aries.blueprint.namespace.NamespaceHandlerRegistryImpl.unregisterHandler(NamespaceHandlerRegistryImpl.java:173)
>       at 
> org.apache.aries.blueprint.namespace.NamespaceHandlerRegistryImpl.removedService(NamespaceHandlerRegistryImpl.java:144)
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:956)
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1)
>       at 
> org.osgi.util.tracker.AbstractTracked.untrack(AbstractTracked.java:341)
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:902)
>       at 
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
>       at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
>       at org.apache.felix.framework.Felix.access$000(Felix.java:74)
>       at org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:390)
>       at 
> org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:148)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:127)
>       at 
> org.apache.aries.util.AriesFrameworkUtil.safeUnregisterService(AriesFrameworkUtil.java:114)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.unregister(ServiceRecipe.java:209)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.unregisterServices(BlueprintContainerImpl.java:701)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.tidyupComponents(BlueprintContainerImpl.java:907)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.destroy(BlueprintContainerImpl.java:857)
>       at 
> org.apache.aries.blueprint.container.BlueprintExtender$3.run(BlueprintExtender.java:284)
>       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 
> org.apache.aries.blueprint.container.BlueprintExtender.destroyContainer(BlueprintExtender.java:305)
>       at 
> org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:206)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)
>       at 
> org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1103)
>       at 
> org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:695)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:483)
>       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$RefreshHelper.stop(Felix.java:4629)
>       at org.apache.felix.framework.Felix.refreshPackages(Felix.java:3951)
>       at 
> org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:172)
>       at java.lang.Thread.run(Thread.java:662)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Reply via email to