You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Tom Watson (Jira)" <ji...@apache.org> on 2021/08/09 12:42:00 UTC
[jira] [Resolved] (FELIX-6439) Synchronization Issue while
unbinding dynamic injected services
[ 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)