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

Reply via email to