You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by "Gavin Scott (JIRA)" <ji...@apache.org> on 2012/11/05 02:40:12 UTC

[jira] [Updated] (ARIES-924) Deadlock in transaction wrappers BundleActivator

     [ https://issues.apache.org/jira/browse/ARIES-924?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Gavin Scott updated ARIES-924:
------------------------------

    Description: 
There is a deadlock condition in org.apache.aries.transaction.jdbc.Activator.  It is possible for start() and serviceChanged() to both call open() on the Activator's ServiceTracker such that the start() thread has acquired the transaction.wrappers bundle lock and needs to acquire the ServiceTracker's monitor, and the serviceChanged() thread holds the ServiceTracker's monitor and needs to acquire the transaction.wrappers bundle lock.  We are seeing this particularly when running pax exam tests on our integration test server.  

Simply synchronizing all of the Activator's methods seems like a reasonable fix.

Sample stack traces are:

{code}
"Thread-6" daemon prio=10 tid=0x00007f97e80b7800 nid=0x1a7c waiting for monitor entry [0x00007f97fd1f2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:299)
         - waiting to lock <0x00000000c4c06558> (a org.osgi.util.tracker.ServiceTracker)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273)
         at org.apache.aries.transaction.jdbc.Activator.start(Activator.java:58)
         at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
         at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
         at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
         at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
         at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:914)
         at org.apache.karaf.features.internal.FeaturesServiceImpl.installFeatures(FeaturesServiceImpl.java:353)
         at org.apache.karaf.features.internal.FeaturesServiceImpl$1.run(FeaturesServiceImpl.java:988)

"CM Configuration Updater (ManagedService Update: pid=org.apache.aries.transaction)" daemon prio=10 tid=0x00007f97e407d800 nid=0x1a5a in Object.wait() [0x00007f9818324000]
   java.lang.Thread.State: WAITING (on object monitor)
         at java.lang.Object.wait(Native Method)
         - waiting on <0x00000000c403c2e8> (a [Ljava.lang.Object;)
         at java.lang.Object.wait(Object.java:503)
         at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4922)
         - locked <0x00000000c403c2e8> (a [Ljava.lang.Object;)
         at org.apache.felix.framework.Felix.addServiceListener(Felix.java:2814)
         at org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:246)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:308)
         - locked <0x00000000c4c34e48> (a org.osgi.util.tracker.ServiceTracker$Tracked)
         - locked <0x00000000c4c06558> (a org.osgi.util.tracker.ServiceTracker)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273)
         at org.apache.aries.transaction.jdbc.Activator.serviceChanged(Activator.java:118)
         at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:871)
         at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:733)
         at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
         at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3890)
         at org.apache.felix.framework.Felix.access$000(Felix.java:79)
         at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:728)
         at org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
         at org.apache.felix.framework.Felix.registerService(Felix.java:2979)
         at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:313)
         at org.apache.aries.transaction.TransactionManagerService.start(TransactionManagerService.java:157)
         at org.apache.aries.transaction.Activator.updated(Activator.java:63)
         - locked <0x00000000c4be3b90> (a org.apache.aries.transaction.Activator)
         at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1160)
         at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:104)
         at java.lang.Thread.run(Thread.java:722)
{code}

  was:
There is a deadlock condition in org.apache.aries.transaction.jdbc.Activator.  It is possible for start() and serviceChanged() to both call open() on the Activator's ServiceTracker such that the start() thread has acquired the transaction.wrappers bundle lock and needs to acquire the ServiceTracker's monitor, and the serviceChanged() thread holds the ServiceTracker's monitor and needs to acquire the transaction.wrappers bundle lock.  We are seeing this particularly when running pax exam tests on our integration test server.  

Simply synchronizing all of the Activator's methods seems like a reasonable fix.

Sample stack traces are:


"Thread-6" daemon prio=10 tid=0x00007f97e80b7800 nid=0x1a7c waiting for monitor entry [0x00007f97fd1f2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:299)
         - waiting to lock <0x00000000c4c06558> (a org.osgi.util.tracker.ServiceTracker)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273)
         at org.apache.aries.transaction.jdbc.Activator.start(Activator.java:58)
         at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
         at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
         at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
         at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
         at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:914)
         at org.apache.karaf.features.internal.FeaturesServiceImpl.installFeatures(FeaturesServiceImpl.java:353)
         at org.apache.karaf.features.internal.FeaturesServiceImpl$1.run(FeaturesServiceImpl.java:988)

"CM Configuration Updater (ManagedService Update: pid=org.apache.aries.transaction)" daemon prio=10 tid=0x00007f97e407d800 nid=0x1a5a in Object.wait() [0x00007f9818324000]
   java.lang.Thread.State: WAITING (on object monitor)
         at java.lang.Object.wait(Native Method)
         - waiting on <0x00000000c403c2e8> (a [Ljava.lang.Object;)
         at java.lang.Object.wait(Object.java:503)
         at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4922)
         - locked <0x00000000c403c2e8> (a [Ljava.lang.Object;)
         at org.apache.felix.framework.Felix.addServiceListener(Felix.java:2814)
         at org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:246)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:308)
         - locked <0x00000000c4c34e48> (a org.osgi.util.tracker.ServiceTracker$Tracked)
         - locked <0x00000000c4c06558> (a org.osgi.util.tracker.ServiceTracker)
         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273)
         at org.apache.aries.transaction.jdbc.Activator.serviceChanged(Activator.java:118)
         at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:871)
         at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:733)
         at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
         at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3890)
         at org.apache.felix.framework.Felix.access$000(Felix.java:79)
         at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:728)
         at org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
         at org.apache.felix.framework.Felix.registerService(Felix.java:2979)
         at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:313)
         at org.apache.aries.transaction.TransactionManagerService.start(TransactionManagerService.java:157)
         at org.apache.aries.transaction.Activator.updated(Activator.java:63)
         - locked <0x00000000c4be3b90> (a org.apache.aries.transaction.Activator)
         at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1160)
         at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:104)
         at java.lang.Thread.run(Thread.java:722)


    
> Deadlock in transaction wrappers BundleActivator
> ------------------------------------------------
>
>                 Key: ARIES-924
>                 URL: https://issues.apache.org/jira/browse/ARIES-924
>             Project: Aries
>          Issue Type: Bug
>          Components: Transaction
>    Affects Versions: 0.3
>            Reporter: Gavin Scott
>
> There is a deadlock condition in org.apache.aries.transaction.jdbc.Activator.  It is possible for start() and serviceChanged() to both call open() on the Activator's ServiceTracker such that the start() thread has acquired the transaction.wrappers bundle lock and needs to acquire the ServiceTracker's monitor, and the serviceChanged() thread holds the ServiceTracker's monitor and needs to acquire the transaction.wrappers bundle lock.  We are seeing this particularly when running pax exam tests on our integration test server.  
> Simply synchronizing all of the Activator's methods seems like a reasonable fix.
> Sample stack traces are:
> {code}
> "Thread-6" daemon prio=10 tid=0x00007f97e80b7800 nid=0x1a7c waiting for monitor entry [0x00007f97fd1f2000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>          at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:299)
>          - waiting to lock <0x00000000c4c06558> (a org.osgi.util.tracker.ServiceTracker)
>          at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273)
>          at org.apache.aries.transaction.jdbc.Activator.start(Activator.java:58)
>          at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
>          at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
>          at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
>          at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
>          at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:914)
>          at org.apache.karaf.features.internal.FeaturesServiceImpl.installFeatures(FeaturesServiceImpl.java:353)
>          at org.apache.karaf.features.internal.FeaturesServiceImpl$1.run(FeaturesServiceImpl.java:988)
> "CM Configuration Updater (ManagedService Update: pid=org.apache.aries.transaction)" daemon prio=10 tid=0x00007f97e407d800 nid=0x1a5a in Object.wait() [0x00007f9818324000]
>    java.lang.Thread.State: WAITING (on object monitor)
>          at java.lang.Object.wait(Native Method)
>          - waiting on <0x00000000c403c2e8> (a [Ljava.lang.Object;)
>          at java.lang.Object.wait(Object.java:503)
>          at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4922)
>          - locked <0x00000000c403c2e8> (a [Ljava.lang.Object;)
>          at org.apache.felix.framework.Felix.addServiceListener(Felix.java:2814)
>          at org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:246)
>          at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:308)
>          - locked <0x00000000c4c34e48> (a org.osgi.util.tracker.ServiceTracker$Tracked)
>          - locked <0x00000000c4c06558> (a org.osgi.util.tracker.ServiceTracker)
>          at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273)
>          at org.apache.aries.transaction.jdbc.Activator.serviceChanged(Activator.java:118)
>          at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:871)
>          at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:733)
>          at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
>          at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3890)
>          at org.apache.felix.framework.Felix.access$000(Felix.java:79)
>          at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:728)
>          at org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
>          at org.apache.felix.framework.Felix.registerService(Felix.java:2979)
>          at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:313)
>          at org.apache.aries.transaction.TransactionManagerService.start(TransactionManagerService.java:157)
>          at org.apache.aries.transaction.Activator.updated(Activator.java:63)
>          - locked <0x00000000c4be3b90> (a org.apache.aries.transaction.Activator)
>          at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1160)
>          at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:104)
>          at java.lang.Thread.run(Thread.java:722)
> {code}

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