[
https://issues.apache.org/jira/browse/FELIX-6439?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Tom Watson resolved FELIX-6439.
-------------------------------
Fix Version/s: scr-2.1.30
Resolution: Fixed
> Synchronization Issue while unbinding dynamic injected services
> ---------------------------------------------------------------
>
> Key: FELIX-6439
> URL: https://issues.apache.org/jira/browse/FELIX-6439
> Project: Felix
> Issue Type: Bug
> Components: Declarative Services (SCR)
> Affects Versions: scr-2.1.28
> Reporter: Amit Mondal
> Priority: Minor
> Fix For: scr-2.1.30
>
>
> The following exception occurs when a component's dynamic injected services
> of same type are unbound.
> The following stacktrace has been generated by SCR-2.1.18 though.
> {code:java}
> java.lang.NullPointerExceptionjava.lang.NullPointerException at
> java.util.TreeMap.rotateLeft(TreeMap.java:2224) at
> java.util.TreeMap.fixAfterDeletion(TreeMap.java:2397) at
> java.util.TreeMap.deleteEntry(TreeMap.java:2332) at
> java.util.TreeMap.remove(TreeMap.java:608) at
> org.apache.felix.scr.impl.inject.field.FieldHandler.updateField(FieldHandler.java:248)
> at
> org.apache.felix.scr.impl.inject.field.FieldHandler.access$400(FieldHandler.java:49)
> at
> org.apache.felix.scr.impl.inject.field.FieldHandler$Resolved.invoke(FieldHandler.java:422)
> at
> org.apache.felix.scr.impl.inject.field.FieldHandler$ReferenceMethodImpl.invoke(FieldHandler.java:492)
> at
> org.apache.felix.scr.impl.manager.DependencyManager.invokeUnbindMethod(DependencyManager.java:1927)
> at
> org.apache.felix.scr.impl.manager.SingleComponentManager.invokeUnbindMethod(SingleComponentManager.java:458)
> at
> org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(DependencyManager.java:382)
> at
> org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(DependencyManager.java:294)
> at
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1242)
> at
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1137)
> at
> org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:997)
> at
> org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1176)
> at
> org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:125)
> at
> org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990)
> at
> org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)
> at
> org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)
> at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4833) at
> org.apache.felix.framework.Felix.access$000(Felix.java:112) at
> org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:434) at
> org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:170)
> at
> org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:145)
> at
> org.eclipse.smarthome.core.thing.binding.BaseThingHandlerFactory.unregisterFirmwareUpdateHandler(BaseThingHandlerFactory.java:310)
> at
> org.eclipse.smarthome.core.thing.binding.BaseThingHandlerFactory.unregisterHandler(BaseThingHandlerFactory.java:277)
> at
> org.eclipse.smarthome.core.thing.internal.ThingManagerImpl.doUnregisterHandler(ThingManagerImpl.java:845)
> at
> org.eclipse.smarthome.core.thing.internal.ThingManagerImpl.unregisterHandler(ThingManagerImpl.java:835)
> at
> org.eclipse.smarthome.core.thing.internal.ThingManagerImpl.unregisterAndDisposeHandler(ThingManagerImpl.java:916)
> at
> org.eclipse.smarthome.core.thing.internal.ThingManagerImpl.thingRemoved(ThingManagerImpl.java:491)
> at
> org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.notifyTrackers(ThingRegistryImpl.java:218)
> at
> org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.notifyListenersAboutRemovedElement(ThingRegistryImpl.java:138)
> at
> org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.notifyListenersAboutRemovedElement(ThingRegistryImpl.java:54)
> at
> org.eclipse.smarthome.core.common.registry.AbstractRegistry.removed(AbstractRegistry.java:243)
> at
> org.eclipse.smarthome.core.common.registry.AbstractRegistry.removed(AbstractRegistry.java:55)
> at
> org.eclipse.smarthome.core.common.registry.AbstractProvider.notifyListeners(AbstractProvider.java:64)
> at
> org.eclipse.smarthome.core.common.registry.AbstractProvider.notifyListeners(AbstractProvider.java:80)
> at
> org.eclipse.smarthome.core.common.registry.AbstractProvider.notifyListenersAboutRemovedElement(AbstractProvider.java:88)
> at
> org.eclipse.smarthome.core.common.registry.AbstractManagedProvider.remove(AbstractManagedProvider.java:104)
> at
> org.eclipse.smarthome.core.common.registry.AbstractRegistry.remove(AbstractRegistry.java:342)
> at
> org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.forceRemove(ThingRegistryImpl.java:105)
> at
> org.eclipse.smarthome.core.thing.internal.ThingManagerImpl.lambda$notifyRegistryAboutForceRemove$12(ThingManagerImpl.java:1013)
> at
> com.qivicon.runtime.executors.impl.ScheduledExecutorServiceImpl$NamedRunnable.run(ScheduledExecutorServiceImpl.java:80)
> at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266) at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)FrameworkEvent error{code}
> The problem occurred when multiple injected services tried to be removed from
> the component's injection. It is highly likely because of the usage of
> TreeMap in such concurrent environment. Since TreeMap has never been written
> to be used in a concurrent environment, we should use ConcurrentSkipListMap
> instead as all the features of TreeMap have been introduced in
> ConcurrentSkipListMap and it is very much suitable for concurrent
> environment.
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)