You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "David Jencks (JIRA)" <ji...@apache.org> on 2013/10/28 19:36:32 UTC

[jira] [Created] (FELIX-4297) [DS] timing hole in opening a dependency manager

David Jencks created FELIX-4297:
-----------------------------------

             Summary: [DS] timing hole in opening a dependency manager
                 Key: FELIX-4297
                 URL: https://issues.apache.org/jira/browse/FELIX-4297
             Project: Felix
          Issue Type: Bug
          Components: Declarative Services (SCR)
    Affects Versions: scr-1.8.0
            Reporter: David Jencks
            Assignee: David Jencks
             Fix For: scr-1.8.0


Pierre de Rop saw this running the integration tests:

test_concurrent_injection_with_bundleContext(org.apache.felix.scr.integration.Felix3680_2Test)  Time elapsed: 36.597 sec  <<< ERROR!
java.lang.NullPointerException
        at org.apache.felix.scr.impl.manager.DependencyManager.invokeUnbindMethod(DependencyManager.java:1710)
        at org.apache.felix.scr.impl.manager.SingleComponentManager.invokeUnbindMethod(SingleComponentManager.java:387)
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(DependencyManager.java:355)
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(DependencyManager.java:290)
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1503)
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1398)
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:1258)
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1437)
        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.felix.scr.integration.components.felix3680_2.Main$RegistrationHelper$2.run(Main.java:136)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)


The problem is that a service is being removed between the time the component instance is being created and the time the dependency manager is opened, and there is no open latch yet.  I see that the EdgeInfos are never reused, so the fix appears to be to:
1. set up all the edgeInfos in the ComponentContextImpl constructor, avoiding a race (not observed AFAIK) in getEdgeInfo
2. make the open latch and close latch in EdgeInfo final
3. in DependencyManager.invokeUnbind and invokeUpdated make sure open is complete before checking outOfRange.
4. distinguish between out of range before and after.



--
This message was sent by Atlassian JIRA
(v6.1#6144)