You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Brent Daniel (JIRA)" <ji...@apache.org> on 2017/02/23 19:20:44 UTC

[jira] [Commented] (FELIX-4682) [DS] NPE during deactivation of OSGi framework

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