You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Guillaume Nodet (JIRA)" <ji...@apache.org> on 2014/02/24 15:01:22 UTC

[jira] [Commented] (FELIX-3687) Deadlock potential from ServiceRegistry.unregisterService

    [ https://issues.apache.org/jira/browse/FELIX-3687?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13910320#comment-13910320 ] 

Guillaume Nodet commented on FELIX-3687:
----------------------------------------

If the registration is invalidated first, doesn't that mean that the service can't be acquired anymore ?
So there would be no difference from the patch in FELIX-4190 I think.

After the first synchronized blocks, no new clients can acquire a reference to the service, because the registration is not in the m_regsMap anymore.
The getUsingBundles method is already synchronized on this, so there's no need to hold any more lock afaik.

> Deadlock potential from ServiceRegistry.unregisterService
> ---------------------------------------------------------
>
>                 Key: FELIX-3687
>                 URL: https://issues.apache.org/jira/browse/FELIX-3687
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-4.0.3
>            Reporter: David Jencks
>         Attachments: FELIX-3687-1.diff
>
>
> At the end of unregisterService there's this block:
> {code}
>         // Now forcibly unget the service object for all stubborn clients.
>         synchronized (this)
>         {
>             Bundle[] clients = getUsingBundles(reg.getReference());
>             for (int i = 0; (clients != null) && (i < clients.length); i++)
>             {
>                 while (ungetService(clients[i], reg.getReference()))
>                     ; // Keep removing until it is no longer possible
>             }
>             ((ServiceRegistrationImpl) reg).invalidate();
>         }
> {code}
> Note the call to ungetService from within a synchronized block.  ungetService itself is very careful to release the lock before calling out to the service factory, however this call from unregisterService negates this care.
> This causes problems with DS with thread dumps like:
> {code}
> ThreadId: 16 : name: SCR Component Actor State: RUNNABLE
>   LockInfo: null LockOwnerId: -1 LockOwnerName: null
>   sun.management.ThreadImpl.dumpThreads0(Native Method)
>   sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:433)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.dumpThreads(AbstractComponentManager.java:294)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.logLockingInfo(AbstractComponentManager.java:240)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.releaseReadLock(AbstractComponentManager.java:222)
>   org.apache.felix.scr.impl.manager.ImmediateComponentManager.ungetService(ImmediateComponentManager.java:710)
>   org.apache.felix.framework.ServiceRegistrationImpl.ungetFactoryUnchecked(ServiceRegistrationImpl.java:349)
>   org.apache.felix.framework.ServiceRegistrationImpl.ungetService(ServiceRegistrationImpl.java:258)
>   org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:389)
>   org.apache.felix.framework.Felix.ungetService(Felix.java:3432)
>   org.apache.felix.framework.BundleContextImpl.ungetService(BundleContextImpl.java:486)
>   org.apache.felix.scr.impl.manager.DependencyManager.ungetService(DependencyManager.java:900)
>   org.apache.felix.scr.impl.manager.DependencyManager.unbind(DependencyManager.java:1138)
>   org.apache.felix.scr.impl.manager.DependencyManager.close(DependencyManager.java:970)
>   org.apache.felix.scr.impl.manager.ImmediateComponentManager.disposeImplementationObject(ImmediateComponentManager.java:276)
>   org.apache.felix.scr.impl.manager.ImmediateComponentManager.deleteComponent(ImmediateComponentManager.java:148)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$Active.ungetService(AbstractComponentManager.java:1718)
>   org.apache.felix.scr.impl.manager.ImmediateComponentManager.ungetService(ImmediateComponentManager.java:695)
>   org.apache.felix.framework.ServiceRegistrationImpl.ungetFactoryUnchecked(ServiceRegistrationImpl.java:349)
>   org.apache.felix.framework.ServiceRegistrationImpl.ungetService(ServiceRegistrationImpl.java:258)
>   org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:389)
> >>>>>>>>inside the lock  org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:158)
>   org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:127)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterComponentService(AbstractComponentManager.java:779)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$State.doDeactivate(AbstractComponentManager.java:1387)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$Satisfied.deactivate(AbstractComponentManager.java:1665)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:635)
>   org.apache.felix.scr.impl.manager.DependencyManager.serviceRemoved(DependencyManager.java:375)
>   org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:217)
>   org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
>   org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
>   org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
>   org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
>   org.apache.felix.framework.Felix.access$000(Felix.java:74)
>   org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:390)
>   org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:148)
>   org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:127)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterComponentService(AbstractComponentManager.java:779)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$State.doDeactivate(AbstractComponentManager.java:1387)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$Disabled.deactivate(AbstractComponentManager.java:1461)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:635)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$2.run(AbstractComponentManager.java:435)
>   org.apache.felix.scr.impl.ComponentActorThread.run(ComponentActorThread.java:98)
>   java.lang.Thread.run(Thread.java:680)
> ThreadId: 67 : name: pool-1-thread-49 State: BLOCKED
>   LockInfo: org.apache.felix.framework.ServiceRegistry@26d66426 LockOwnerId: 16 LockOwnerName: SCR Component Actor
>   org.apache.felix.framework.ServiceRegistry.getServiceReferences(ServiceRegistry.java:204)
>   org.apache.felix.framework.Felix.getServiceReferences(Felix.java:3310)
>   org.apache.felix.framework.Felix.getAllowedServiceReferences(Felix.java:3383)
>   org.apache.felix.framework.BundleContextImpl.getServiceReferences(BundleContextImpl.java:432)
>   org.apache.felix.scr.impl.manager.DependencyManager.getFrameworkServiceReferences(DependencyManager.java:658)
>   org.apache.felix.scr.impl.manager.DependencyManager.getFrameworkServiceReferences(DependencyManager.java:634)
>   org.apache.felix.scr.impl.manager.DependencyManager.enable(DependencyManager.java:551)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.enableDependencyManagers(AbstractComponentManager.java:1061)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.access$600(AbstractComponentManager.java:63)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager$Disabled.enable(AbstractComponentManager.java:1445)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:625)
>   org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:358)
>   org.apache.felix.scr.impl.config.ImmediateComponentHolder.enableComponents(ImmediateComponentHolder.java:384)
>   org.apache.felix.scr.impl.BundleComponentActivator.enableComponent(BundleComponentActivator.java:395)
>   org.apache.felix.scr.impl.manager.ComponentContextImpl.enableComponent(ComponentContextImpl.java:101)
>   test.scr.Main$EnableManager$1.run(Main.java:56)
>   java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>   java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>   java.lang.Thread.run(Thread.java:680)
> {code}



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)