[
https://issues.apache.org/jira/browse/FELIX-3345?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
David Jencks updated FELIX-3345:
--------------------------------
Attachment: FELIX-3345-3.diff
I've finally managed to reproduce a similar problem in a test. The attached
includes a lot of logging additions to scr, ignores the existing integration
tests, and adds one that demonstrates a similar problem. It also always fails
for unrelated reasons. The interesting stack trace is
java.lang.NullPointerException: No log service
at
org.apache.felix.scr.impl.BundleComponentActivator.log(BundleComponentActivator.java:623)
at
org.apache.felix.scr.impl.BundleComponentActivator.log(BundleComponentActivator.java:594)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.log(AbstractComponentManager.java:635)
at
org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:596)
at
org.apache.felix.scr.impl.helper.BaseMethod$NotResolved.invoke(BaseMethod.java:552)
at
org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:476)
at
org.apache.felix.scr.impl.helper.BindMethod.invoke(BindMethod.java:36)
at
org.apache.felix.scr.impl.manager.DependencyManager.invokeUnbindMethod(DependencyManager.java:1142)
at
org.apache.felix.scr.impl.manager.DependencyManager.unbind(DependencyManager.java:999)
at
org.apache.felix.scr.impl.manager.DependencyManager.close(DependencyManager.java:886)
at
org.apache.felix.scr.impl.manager.ImmediateComponentManager.disposeImplementationObject(ImmediateComponentManager.java:269)
at
org.apache.felix.scr.impl.manager.ImmediateComponentManager.deleteComponent(ImmediateComponentManager.java:135)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$Satisfied.deactivate(AbstractComponentManager.java:1225)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:339)
at
org.apache.felix.scr.impl.manager.DependencyManager.serviceRemoved(DependencyManager.java:346)
at
org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:253)
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.unregister(ServiceRegistrationImpl.java:225)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterComponentService(AbstractComponentManager.java:567)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$Satisfied.deactivate(AbstractComponentManager.java:1224)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.disposeInternal(AbstractComponentManager.java:360)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.dispose(AbstractComponentManager.java:197)
at
org.apache.felix.scr.impl.config.ImmediateComponentHolder.disposeComponents(ImmediateComponentHolder.java:356)
at
org.apache.felix.scr.impl.BundleComponentActivator.dispose(BundleComponentActivator.java:312)
at
org.apache.felix.scr.impl.Activator.disposeComponents(Activator.java:333)
at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:198)
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:1523)
at
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1459)
at
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1454)
at
org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:506)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.stop(AbstractBundle.java:464)
at
org.eclipse.osgi.framework.internal.core.AbstractBundle.stop(AbstractBundle.java:456)
at
org.apache.felix.scr.integration.concurrency.ConcurrentShutdownTest$Worker.run(ConcurrentShutdownTest.java:185)
at java.lang.Thread.run(Thread.java:680)
By messing with the timing I've gotten into a state where we're trying to log
on a BundleComponentActivator that has been shut down. The activity being
logged is different, but the NPE is the same. Admittedly I added the log
statement in question....
The basic scenario is two threads shutting stuff down concurrently, and an
unbind method that takes a long time to return.
bundle A has a service s1
bundle B has a service s2 with a reference to s1, and an unbind method that
takes a long time.
Stop A in thread 1; the thread gets stuck in unbind of s2.
Stop B in thread 2; this shuts down B so it's BundleComponentActivator no
longer can log (the NPE).
If the unbind method in thread 1 now returns, it will try to log in B's BCA
which has no log service tracker.
If you comment out my added logging statement you get a different NPE.
> 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
> Attachments: FELIX-3345-2.diff, FELIX-3345-3.diff, FELIX-3345.diff
>
>
> 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