On Tue, Jan 1, 2013 at 6:21 AM, Richard S. Hall <he...@ungoverned.org>wrote:

> On 1/1/13 06:09, Jad Naous wrote:
>
>> Happy new year!
>>
>> I'm running into another deadlock now. It seems like there needs to be a
>> more rigorous study of how locking is used in the framework. In
>> particular,
>> it seems like the framework should not be invoking any listeners within
>> the
>> same thread that's executing the stopping/starting/refreshing of
>> bundles...
>> Anywhere that happens there will be a potential for a deadlock because of
>> a
>> misordering of lock acquisition. The framework should never call into user
>> code with any locks held.
>>
>
> Yeah, tell me about it, but it is not possible in all cases,
> unfortunately. I personally feel that all events should be asynchronous,
> but that's another story.
>
> -> richard
>
>
I'm happy to help fix this, but I need some pointers as to what needs to
happen. For synchronous events, what are the requirements? Or is this not
fixable? Can the lock be released before firing the events?


>
>> Name: Thread-2
>> State: WAITING on [Ljava.lang.Object;@4a018e1b
>> Total blocked: 38,871,649  Total waited: 38,871,650
>>
>> Stack trace:
>>   java.lang.Object.wait(Native Method)
>> java.lang.Object.wait(Object.**java:485)
>> org.apache.felix.framework.**Felix.acquireGlobalLock(Felix.**java:5033)
>> org.apache.felix.framework.**StatefulResolver.resolve(**
>> StatefulResolver.java:451)
>> org.apache.felix.framework.**BundleWiringImpl.**searchDynamicImports(**
>> BundleWiringImpl.java:1578)
>> org.apache.felix.framework.**BundleWiringImpl.**
>> findClassOrResourceByDelegatio**n(BundleWiringImpl.java:1478)
>> org.apache.felix.framework.**BundleWiringImpl.access$400(**
>> BundleWiringImpl.java:75)
>> org.apache.felix.framework.**BundleWiringImpl$**
>> BundleClassLoader.loadClass(**BundleWiringImpl.java:1882)
>> java.lang.ClassLoader.**loadClass(ClassLoader.java:**247)
>> org.apache.felix.framework.**BundleWiringImpl.**getClassByDelegation(**
>> BundleWiringImpl.java:1356)
>> org.apache.felix.framework.**ServiceRegistrationImpl$**
>> ServiceReferenceImpl.**isAssignableTo(**ServiceRegistrationImpl.java:**
>> 548)
>> org.apache.felix.framework.**util.Util.isServiceAssignable(**
>> Util.java:280)
>> org.apache.felix.framework.**util.EventDispatcher.**
>> invokeServiceListenerCallback(**EventDispatcher.java:916)
>> org.apache.felix.framework.**util.EventDispatcher.**fireEventImmediately(
>> **EventDispatcher.java:793)
>> org.apache.felix.framework.**util.EventDispatcher.**fireServiceEvent(**
>> EventDispatcher.java:543)
>> org.apache.felix.framework.**Felix.fireServiceEvent(Felix.**java:4346)
>> org.apache.felix.framework.**Felix.registerService(Felix.**java:3356)
>> org.apache.felix.framework.**BundleContextImpl.**registerService(**
>> BundleContextImpl.java:346)
>> org.apache.felix.ipojo.**IPojoFactory.start(**IPojoFactory.java:613)
>>     - locked org.apache.felix.ipojo.**ComponentFactory@468034b6
>> org.apache.felix.ipojo.**Extender.**createAbstractFactory(**
>> Extender.java:520)
>> org.apache.felix.ipojo.**Extender.parse(Extender.java:**301)
>> org.apache.felix.ipojo.**Extender.startManagementFor(**Extender.java:237)
>> org.apache.felix.ipojo.**Extender.access$600(Extender.**java:52)
>> org.apache.felix.ipojo.**Extender$CreatorThread.run(**Extender.java:769)
>> java.lang.Thread.run(Thread.**java:662)
>>
>> Name: FelixFrameworkWiring
>> State: BLOCKED on org.apache.felix.ipojo.**ComponentFactory@468034b6owned
>> by: Thread-2
>> Total blocked: 7  Total waited: 1
>>
>> Stack trace:
>>   org.apache.felix.ipojo.**IPojoFactory.**removeFactoryStateListener(**
>> IPojoFactory.java:511)
>> org.apache.felix.ipojo.**InstanceCreator.removeFactory(**
>> InstanceCreator.java:199)
>> org.apache.felix.ipojo.**Extender.closeManagementFor(**Extender.java:180)
>> org.apache.felix.ipojo.**Extender.bundleChanged(**Extender.java:153)
>> org.apache.felix.framework.**util.EventDispatcher.**
>> invokeBundleListenerCallback(**EventDispatcher.java:868)
>> org.apache.felix.framework.**util.EventDispatcher.**fireEventImmediately(
>> **EventDispatcher.java:789)
>> org.apache.felix.framework.**util.EventDispatcher.**fireBundleEvent(**
>> EventDispatcher.java:514)
>> org.apache.felix.framework.**Felix.fireBundleEvent(Felix.**java:4330)
>> org.apache.felix.framework.**Felix.stopBundle(Felix.java:**2451)
>> org.apache.felix.framework.**Felix$RefreshHelper.stop(**Felix.java:4715)
>> org.apache.felix.framework.**Felix.refreshPackages(Felix.**java:4037)
>> org.apache.felix.framework.**FrameworkWiringImpl.run(**
>> FrameworkWiringImpl.java:178)
>> java.lang.Thread.run(Thread.**java:662)
>>
>>
>>
>> On Sat, Dec 22, 2012 at 6:39 PM, Richard S. Hall <he...@ungoverned.org
>> >wrote:
>>
>>  On 12/22/12 20:41 , Jad Naous wrote:
>>>
>>>  Thanks! I was building with java6. Don't know if that is the issue.
>>>> Anyway,
>>>> I tested the snapshot, and looks like that fixes it.
>>>>
>>>> Any idea when 4.1.0 will be released? Do you know if
>>>> http://svn.apache.org/viewvc?****view=revision&revision=**1421958<http://svn.apache.org/viewvc?**view=revision&revision=1421958>
>>>> <http://svn.apache.org/**viewvc?view=revision&revision=**1421958<http://svn.apache.org/viewvc?view=revision&revision=1421958>>will
>>>> apply
>>>>
>>>> cleanly onto 4.0.3? Otherwise, how stable do you think is
>>>> 4.1.0-SNAPSHOT?
>>>>
>>>>  The release version will be 4.2.0, but the 4.1.0-SNAPSHOT build should
>>> be
>>> reasonably stable. We try to keep trunk stable.
>>>
>>> I want to try to get a release out soon, but I don't have a specific time
>>> table. I'll try to get in done in January if all goes well.
>>>
>>> -> richard
>>>
>>>
>>>  Thanks!
>>>>
>>>> Jad.
>>>>
>>>>
>>>>
>>>> On Fri, Dec 21, 2012 at 6:49 AM, Richard S. Hall <he...@ungoverned.org
>>>>
>>>>> wrote:
>>>>>
>>>>   It built fine for me. I'm was building with Java 7.
>>>>
>>>>> Regardless, I deployed snapshots of framework, main, and
>>>>> main.distribution, so just grab what you want from the Apache snapshot
>>>>> repo
>>>>> to try it out.
>>>>>
>>>>> -> richard
>>>>>
>>>>>
>>>>> On 12/20/12 18:56 , Jad Naous wrote:
>>>>>
>>>>>   It does look like the same issue.
>>>>>
>>>>>> Got the trunk/framework. mvn clean install gives:
>>>>>>
>>>>>> [INFO] --- maven-compiler-plugin:2.3.2:******compile
>>>>>> (default-compile) @
>>>>>> org.apache.felix.framework ---
>>>>>> Dec 20, 2012 3:54:59 PM org.sonatype.guice.bean.****
>>>>>> reflect.Logs$JULSink
>>>>>> warn
>>>>>> WARNING: Error injecting: org.apache.maven.plugin.******CompilerMojo
>>>>>> java.lang.******NoClassDefFoundError:
>>>>>> org/codehaus/plexus/compiler/******util/scan/******
>>>>>> InclusionScanException
>>>>>>
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> jad.
>>>>>>
>>>>>>
>>>>>> On Thu, Dec 20, 2012 at 3:22 PM, Richard S. Hall <
>>>>>> he...@ungoverned.org
>>>>>>
>>>>>>  wrote:
>>>>>>>
>>>>>>>     On 12/20/12 4:10 PM, Jad Naous wrote:
>>>>>>
>>>>>>     If a bundle undergoes a refresh while ipojo is still initializing
>>>>>>>
>>>>>>>  components, a deadlock can happen.  The issue is that if ipojo is
>>>>>>>> attempting to register a service, it will be doing it while
>>>>>>>> synchronizing
>>>>>>>> on the InstanceCreator instance. It will then try to register a
>>>>>>>> service
>>>>>>>> which requires the framework's global lock.
>>>>>>>>
>>>>>>>>    Registering a service doesn't require a global, just a bundle
>>>>>>>> lock.
>>>>>>>> I
>>>>>>>>
>>>>>>>>  think this could be related to:
>>>>>>>
>>>>>>>        
>>>>>>> https://issues.apache.org/********jira/browse/FELIX-3761<https://issues.apache.org/******jira/browse/FELIX-3761>
>>>>>>> <https**://issues.apache.org/****jira/**browse/FELIX-3761<https://issues.apache.org/****jira/browse/FELIX-3761>
>>>>>>> >
>>>>>>> <https:/**/issues.apache.org/****jira/**browse/FELIX-3761<http://issues.apache.org/**jira/**browse/FELIX-3761>
>>>>>>> <http**s://issues.apache.org/**jira/**browse/FELIX-3761<https://issues.apache.org/**jira/browse/FELIX-3761>
>>>>>>> >
>>>>>>> <https:/**/issues.apache.org/****jira/**browse/FELIX-3761<http://issues.apache.org/**jira/**browse/FELIX-3761>
>>>>>>> <http**://issues.apache.org/jira/****browse/FELIX-3761<http://issues.apache.org/jira/**browse/FELIX-3761>
>>>>>>> >
>>>>>>> <https**://issues.apache.org/**jira/**browse/FELIX-3761<http://issues.apache.org/jira/**browse/FELIX-3761>
>>>>>>> <https**://issues.apache.org/jira/**browse/FELIX-3761<https://issues.apache.org/jira/browse/FELIX-3761>
>>>>>>> >
>>>>>>>
>>>>>>>
>>>>>>> This avoid grabbing the bundle lock when registering a service, so
>>>>>>> maybe
>>>>>>> it will help your situation. You could try to build the framework
>>>>>>> from
>>>>>>> trunk and see if it makes a difference.
>>>>>>>
>>>>>>> If you aren't able to build from trunk, let me know and I'll try to
>>>>>>> publish a snapshot build since I don't think we have a recent one (we
>>>>>>> should do this no matter what).
>>>>>>>
>>>>>>> -> richard
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>    If a refresh is happening in another thread, the refresh will be
>>>>>>> holding
>>>>>>>
>>>>>>>  the framework's global lock, which will then call IPOJO's extender,
>>>>>>>> which
>>>>>>>> then attempts to call a method on InstanceCreator, hence leading to
>>>>>>>> the
>>>>>>>> deadlock.
>>>>>>>>
>>>>>>>> Here are the stack traces:
>>>>>>>>
>>>>>>>> Daemon Thread [Thread-1] (Suspended)
>>>>>>>> Object.wait(long) line: not available [native method]
>>>>>>>> Object[](Object).wait() line: 485
>>>>>>>> Felix.acquireBundleLock(********BundleImpl, int) line: 4871
>>>>>>>> Felix.registerService(********BundleImpl, String[], Object,
>>>>>>>> Dictionary)
>>>>>>>> line:
>>>>>>>> 3205
>>>>>>>> BundleContextImpl.********registerService(String[], Object,
>>>>>>>> Dictionary)
>>>>>>>> line:
>>>>>>>> 346
>>>>>>>>
>>>>>>>> IPojoContext.registerService(********String[], Object, Dictionary)
>>>>>>>> line:
>>>>>>>> 385
>>>>>>>> ProvidedService.********registerService() line: 362
>>>>>>>> ProvidedServiceHandler.__M_********stateChanged(int) line: 509
>>>>>>>> ProvidedServiceHandler.********stateChanged(int) line: not
>>>>>>>> available
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> InstanceManager.setState(int) line: 536
>>>>>>>> InstanceManager.start() line: 418
>>>>>>>> ComponentFactory.********createInstance(Dictionary, IPojoContext,
>>>>>>>> HandlerManager[])
>>>>>>>> line: 179
>>>>>>>>
>>>>>>>> ComponentFactory(IPojoFactory)********.**
>>>>>>>> createComponentInstance(******
>>>>>>>> Dictionary,
>>>>>>>> ServiceContext) line: 310
>>>>>>>> ComponentFactory(IPojoFactory)********.**
>>>>>>>> createComponentInstance(******
>>>>>>>> Dictionary)
>>>>>>>> line: 239
>>>>>>>> InstanceCreator$********ManagedInstance.create(********
>>>>>>>> IPojoFactory)
>>>>>>>> line: 355
>>>>>>>> InstanceCreator.addInstance(********Dictionary, long) line: 89
>>>>>>>> Extender.parse(Bundle, String) line: 306
>>>>>>>> Extender.startManagementFor(********Bundle) line: 237
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Extender.access$600(Extender, Bundle) line: 52
>>>>>>>> Extender$CreatorThread.run() line: 769
>>>>>>>> Thread.run() line: 662
>>>>>>>>
>>>>>>>> Daemon Thread [FelixFrameworkWiring] (Suspended)
>>>>>>>> InstanceCreator.********removeInstancesFromBundle(********long)
>>>>>>>> line: 116
>>>>>>>> Extender.closeManagementFor(********Bundle) line: 171
>>>>>>>> Extender.bundleChanged(********BundleEvent) line: 153
>>>>>>>> EventDispatcher.********invokeBundleListenerCallback(***
>>>>>>>> *****Bundle,
>>>>>>>> EventListener,
>>>>>>>> EventObject) line: 868
>>>>>>>> EventDispatcher.********fireEventImmediately(********
>>>>>>>> EventDispatcher,
>>>>>>>>
>>>>>>>> int, Map,
>>>>>>>> EventObject, Dictionary) line: 789
>>>>>>>> EventDispatcher.********fireBundleEvent(BundleEvent, Framework)
>>>>>>>> line:
>>>>>>>>
>>>>>>>> 514
>>>>>>>>
>>>>>>>>
>>>>>>>> Felix.fireBundleEvent(int, Bundle) line: 4244
>>>>>>>> Felix.stopBundle(BundleImpl, boolean) line: 2351
>>>>>>>> Felix$RefreshHelper.stop() line: 4629
>>>>>>>> Felix.refreshPackages(********Collection, FrameworkListener[])
>>>>>>>> line:
>>>>>>>>
>>>>>>>> 3951
>>>>>>>>
>>>>>>>>
>>>>>>>> FrameworkWiringImpl.run() line: 172
>>>>>>>> Thread.run() line: 662
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>

Reply via email to