Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
None
-
None
Description
When running a large system with complex and deeply nested component graph, the changecount timer can time out resulting in exceptions like:
[junit] java.lang.IllegalStateException: Timer already cancelled. [junit] at java.util.Timer.sched(Timer.java:397) [junit] at java.util.Timer.schedule(Timer.java:193) [junit] at org.apache.felix.scr.impl.ComponentRegistry.updateChangeCount(ComponentRegistry.java:722) [junit] at org.apache.felix.scr.impl.BundleComponentActivator.updateChangeCount(BundleComponentActivator.java:777) [junit] at org.apache.felix.scr.impl.manager.AbstractComponentManager.setState(AbstractComponentManager.java:1420) [junit] at org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:806) [junit] at org.apache.felix.scr.impl.manager.DependencyManager.deactivateComponentManager(DependencyManager.java:2330) [junit] at org.apache.felix.scr.impl.manager.DependencyManager.access$400(DependencyManager.java:56) [junit] at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:1125) [junit] at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:1007) [junit] at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1242) [junit] at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1137) [junit] at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:997) [junit] at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1176) [junit] at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:125) [junit] at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109) [junit] at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:891) [junit] at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:804) [junit] at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:222) [junit] at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.unregisterServices(ServiceRegistry.java:668) [junit] at org.eclipse.osgi.internal.framework.BundleContextImpl.close(BundleContextImpl.java:96) [junit] at org.eclipse.osgi.internal.framework.EquinoxBundle.stopWorker0(EquinoxBundle.java:1018) [junit] at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.stopWorker(EquinoxBundle.java:359) [junit] at org.eclipse.osgi.container.Module.doStop(Module.java:636) [junit] at org.eclipse.osgi.container.Module.stop(Module.java:498) [junit] at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.decStartLevel(ModuleContainer.java:1723) [junit] at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1642) [junit] at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1555) [junit] at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1) [junit] at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) [junit] at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
There are two issues:
- the timeout is not configurable (hard coded to 5000L)
- the exception is not handled in a safe way (i.e. logged to an appropriate log which ends up in the system log)