Amit Mondal created FELIX-6439:
----------------------------------

             Summary: 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


The following exception occurs when a component's dynamic injected services of 
same type are unbound.

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

Reply via email to