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

Brent Daniel commented on FELIX-4682:
-------------------------------------

This is still a problem in SCR 2.0.8. From what I've experienced, this only 
happens when a separate thread is explicitly unregistering a 
ServiceRegistration while the component is being deactivated. 

The ordering is something like this:

Thread 1 explicitly calls ServiceRegistration.unregister(). The service changed 
event eventually causes BundleComponentActivator$ListenerInfo.serviceChanged() 
to be called, and that advances past the line that copies the map of filters to 
service listeners (currently 114). 

Meanwhile, Thread 2 is deactivating the component, which causes it to 
unregister the service listeners. It gets to 
DependencyManager.unregisterServiceListener, but does not close the tracker 
before T1 copies the filterMap. Once T1 does that, T2 will close the tracker 
and set m_tracker to null.

T1 then begins iterating through the filterMap to untrack the service 
listeners. It has a stale list of service listeners, so  
DependencyManager$SingleStaticCustomizer.removedService() will be called on a 
dependency manager that has the null m_tracker, and we get the NPE. 

Can we just check if the tracker value is null in removedService() and return? 
It doesn't seem like the rest of the processing is needed if another thread has 
already deactivated the component.  



> [DS] NPE during deactivation of OSGi framework
> ----------------------------------------------
>
>                 Key: FELIX-4682
>                 URL: https://issues.apache.org/jira/browse/FELIX-4682
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-1.8.2
>         Environment: Equinox OSGi 3.8.2 
> Felix SCR 1.8.2
>            Reporter: Arnoud Glimmerveen
>
> During the shutdown of the OSGi framework (Equinox), the following 
> NullPointerException was thrown:
> {noformat}
> java.lang.NullPointerException
>     at 
> org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:964)
>     at 
> org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:895)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1506)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1401)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:1261)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1440)
>     at 
> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:107)
>     at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861)
>     at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>     at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry$1.run(ServiceRegistry.java:775)
>     at java.security.AccessController.doPrivileged(Native Method)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:773)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:225)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:1011)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:992)
>     at 
> org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:141)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterService(AbstractComponentManager.java:1054)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.doDeactivate(AbstractComponentManager.java:900)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:883)
>     at 
> org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:974)
>     at 
> org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:895)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1506)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1401)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:1261)
>     at 
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1440)
>     at 
> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:107)
>     at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861)
>     at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>     at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry$1.run(ServiceRegistry.java:775)
>     at java.security.AccessController.doPrivileged(Native Method)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:773)
>     at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:225)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:1011)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:992)
>     at 
> org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:141)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterService(AbstractComponentManager.java:1054)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.doDeactivate(AbstractComponentManager.java:900)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:883)
>     at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.dispose(AbstractComponentManager.java:580)
>     at 
> org.apache.felix.scr.impl.config.ConfigurableComponentHolder.disposeComponents(ConfigurableComponentHolder.java:406)
>     at 
> org.apache.felix.scr.impl.BundleComponentActivator.dispose(BundleComponentActivator.java:335)
>     at 
> org.apache.felix.scr.impl.Activator.disposeComponents(Activator.java:313)
>     at org.apache.felix.scr.impl.Activator.access$300(Activator.java:45)
>     at 
> org.apache.felix.scr.impl.Activator$ScrExtension.destroy(Activator.java:198)
>     at 
> org.apache.felix.utils.extender.AbstractExtender$2.run(AbstractExtender.java:290)
>     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
>     at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
>     at java.util.concurrent.FutureTask.run(Unknown Source)
>     at 
> org.apache.felix.utils.extender.AbstractExtender.destroyExtension(AbstractExtender.java:312)
>     at 
> org.apache.felix.utils.extender.AbstractExtender.bundleChanged(AbstractExtender.java:186)
>     at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:847)
>     at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>     at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1568)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework$9.run(Framework.java:1508)
>     at java.security.AccessController.doPrivileged(Native Method)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1506)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1499)
>     at 
> org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:506)
>     at 
> org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:566)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1206)
>     at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.decFWSL(StartLevelManager.java:592)
>     at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:257)
>     at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.shutdown(StartLevelManager.java:215)
>     at 
> org.eclipse.osgi.framework.internal.core.InternalSystemBundle.suspend(InternalSystemBundle.java:284)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework.shutdown(Framework.java:692)
>     at 
> org.eclipse.osgi.framework.internal.core.Framework.close(Framework.java:600)
>     at 
> org.eclipse.osgi.framework.internal.core.InternalSystemBundle$1.run(InternalSystemBundle.java:261)
>     at java.lang.Thread.run(Unknown Source)
> {noformat}
> I had a quick look at the SCR code and saw that at the line the NPE is 
> triggered {{getTracker()}} would return {{null}}.
> Currently I don't have a way to reproduce this issue.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to