Concurrency problems in SCR
---------------------------
Key: FELIX-3345
URL: https://issues.apache.org/jira/browse/FELIX-3345
Project: Felix
Issue Type: Bug
Components: Declarative Services (SCR)
Affects Versions: scr-1.6.0
Reporter: David Jencks
We've been encountering several exceptions thrown intermittently from DS. They
generally look like ungetting service on a disposed-of SCR
BundleComponentActivator, ComponentManager, or DependencyManager. There may be
two threads trying to shut down the same bundles at the same time. I'm not
sure how to investigate the root cause or if this kind of behavior is expected.
The SCR code generally doesn't look very thread safe. It's easy to "fix" the
specific problems we see by adding more checks to the SCR code so the NPEs are
avoided, or attempted use of closed bundle contexts are caught and ignored.
I'd be happy to keep looking into this but could use some hints about what
should be happening. Unless someone can come up with a better explanation and
fix it would be great meanwhile to patch the code to avoid throwing the
exceptions.
Here are some of the typical stack traces we see:
Stack Dump = org.osgi.framework.ServiceException: Exception in
org.apache.felix.scr.impl.manager.DelayedComponentManager.ungetService()
at
org.eclipse.osgi.internal.serviceregistry.ServiceUse.releaseService(ServiceUse.java:287)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.releaseService(ServiceRegistrationImpl.java:562)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.releaseServicesInUse(ServiceRegistry.java:665)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.close(BundleContextImpl.java:91)
at
org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:514)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:565)
at
org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1161)
at
org.eclipse.osgi.framework.internal.core.StartLevelManager.decFWSL(StartLevelManager.java:595)
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:691)
at
org.eclipse.osgi.framework.internal.core.Framework.close(Framework.java:598)
at
org.eclipse.osgi.framework.internal.core.InternalSystemBundle$1.run(InternalSystemBundle.java:261)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.NullPointerException
at
org.apache.felix.scr.impl.BundleComponentActivator.log(BundleComponentActivator.java:614)
at
org.apache.felix.scr.impl.BundleComponentActivator.log(BundleComponentActivator.java:589)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.log(AbstractComponentManager.java:633)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$State.log(AbstractComponentManager.java:1000)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$State.ungetService(AbstractComponentManager.java:964)
at
org.apache.felix.scr.impl.manager.DelayedComponentManager.ungetService(DelayedComponentManager.java:114)
at
org.eclipse.osgi.internal.serviceregistry.ServiceUse$3.run(ServiceUse.java:277)
at java.security.AccessController.doPrivileged(Native Method)
at
org.eclipse.osgi.internal.serviceregistry.ServiceUse.releaseService(ServiceUse.java:275)
... 14 more
Stack Dump = org.osgi.framework.ServiceException: Exception in
org.apache.felix.scr.impl.manager.DelayedComponentManager.ungetService()
at
org.eclipse.osgi.internal.serviceregistry.ServiceUse.releaseService(ServiceUse.java:287)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.releaseService(ServiceRegistrationImpl.java:562)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:245)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.unregisterServices(ServiceRegistry.java:635)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.close(BundleContextImpl.java:88)
at
org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:514)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:565)
at
org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1161)
at
org.eclipse.osgi.framework.internal.core.StartLevelManager.decFWSL(StartLevelManager.java:595)
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:691)
at
org.eclipse.osgi.framework.internal.core.Framework.close(Framework.java:598)
at
org.eclipse.osgi.framework.internal.core.InternalSystemBundle$1.run(InternalSystemBundle.java:261)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.IllegalStateException: BundleContext is no longer valid
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.checkValid(BundleContextImpl.java:931)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.ungetService(BundleContextImpl.java:634)
at
org.apache.felix.scr.impl.manager.DependencyManager.ungetService(DependencyManager.java:819)
at
org.apache.felix.scr.impl.manager.DependencyManager.unbind(DependencyManager.java:1000)
at
org.apache.felix.scr.impl.manager.DependencyManager.close(DependencyManager.java:880)
at
org.apache.felix.scr.impl.manager.ImmediateComponentManager.disposeImplementationObject(ImmediateComponentManager.java:268)
at
org.apache.felix.scr.impl.manager.ImmediateComponentManager.deleteComponent(ImmediateComponentManager.java:135)
at
org.apache.felix.scr.impl.manager.DelayedComponentManager.deleteComponent(DelayedComponentManager.java:67)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$Active.ungetService(AbstractComponentManager.java:1266)
at
org.apache.felix.scr.impl.manager.DelayedComponentManager.ungetService(DelayedComponentManager.java:114)
at
org.eclipse.osgi.internal.serviceregistry.ServiceUse$3.run(ServiceUse.java:277)
at java.security.AccessController.doPrivileged(Native Method)
at
org.eclipse.osgi.internal.serviceregistry.ServiceUse.releaseService(ServiceUse.java:275)
... 15 more
-------
This one is from FELIX-3307:
java.lang.NullPointerException
at
org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:1028)
at
org.apache.felix.scr.impl.manager.DependencyManager.serviceAdded(DependencyManager.java:308)
at
org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:170)
at
org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:104)
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.publishServiceEvent(ServiceRegistry.java:771)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130)
at
org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:214)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:433)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:451)
at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:950)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira