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

Jim Church commented on FELIX-3067:
-----------------------------------

Consistently recreatable if using Camel.
   1.  In bundle A: Define a Camel Context and define a Camel TypeConverter (in 
META-INF/services folder).  Import one or more packages from Bundle B.
   2.  Hot Deploy Bundle B.

Simply removing the TypeConverter definition corrects the problem.


Name: Camel (svc-insertion-order-api-camel-context) thread #15 - ShutdownTask
State: WAITING on [Ljava.lang.Object;@4f7df5fa
Total blocked: 0  Total waited: 50

Stack trace: 
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:503)
org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:4995)
org.apache.felix.framework.Felix.resolveBundles(Felix.java:3492)
org.apache.felix.framework.Felix.findBundleEntries(Felix.java:1563)
org.apache.felix.framework.BundleImpl.findEntries(BundleImpl.java:293)
org.apache.camel.impl.osgi.Activator$BundleTypeConverterLoader$Loader.load(Activator.java:335)
org.apache.camel.impl.osgi.Activator$BundleTypeConverterLoader.load(Activator.java:278)
   - locked 
org.apache.camel.impl.osgi.Activator$BundleTypeConverterLoader@13ae5a25
org.apache.camel.core.osgi.OsgiTypeConverter.createRegistry(OsgiTypeConverter.java:175)
org.apache.camel.core.osgi.OsgiTypeConverter.getDelegate(OsgiTypeConverter.java:147)
   - locked org.apache.camel.core.osgi.OsgiTypeConverter@168783db
org.apache.camel.core.osgi.OsgiTypeConverter.convertTo(OsgiTypeConverter.java:98)
org.apache.camel.util.CamelContextHelper.convertTo(CamelContextHelper.java:72)
org.apache.camel.component.bean.RegistryBean.getProcessor(RegistryBean.java:90)
org.apache.camel.component.bean.BeanProcessor.getProcessor(BeanProcessor.java:206)
org.apache.camel.component.bean.BeanProcessor.doStop(BeanProcessor.java:256)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.DelegateAsyncProcessor.doStop(DelegateAsyncProcessor.java:82)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.DelegateAsyncProcessor.doStop(DelegateAsyncProcessor.java:82)
org.apache.camel.processor.interceptor.TraceInterceptor.doStop(TraceInterceptor.java:364)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.interceptor.DefaultChannel.doStop(DefaultChannel.java:157)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:114)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.MulticastProcessor.doStop(MulticastProcessor.java:952)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.DelegateAsyncProcessor.doStop(DelegateAsyncProcessor.java:82)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.DelegateAsyncProcessor.doStop(DelegateAsyncProcessor.java:82)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.DelegateAsyncProcessor.doStop(DelegateAsyncProcessor.java:82)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.processor.DelegateAsyncProcessor.doStop(DelegateAsyncProcessor.java:82)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:128)
org.apache.camel.util.ServiceHelper.stopServices(ServiceHelper.java:97)
org.apache.camel.impl.DefaultConsumer.doStop(DefaultConsumer.java:86)
org.apache.camel.component.http.HttpConsumer.doStop(HttpConsumer.java:63)
org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
org.apache.camel.impl.DefaultShutdownStrategy.shutdownNow(DefaultShutdownStrategy.java:306)
org.apache.camel.impl.DefaultShutdownStrategy$ShutdownTask.run(DefaultShutdownStrategy.java:558)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
java.util.concurrent.FutureTask.run(FutureTask.java:166)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:722)

                
> 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