Skip to content

Deadlock in ProvisioningAgent #937

@basilevs

Description

@basilevs

To reproduce shutdown Eclipse Platform before background startup completes. The error is intermittent.
Discovered by a test, that restarts the application immediately after workbench startup. Failed RCPTT build.

console.txt

!ENTRY org.eclipse.osgi 2 0 2025-08-29 22:25:33.380
!MESSAGE While loading class "org.eclipse.equinox.internal.p2.ui.ValidationDialogServiceUI", thread "Thread[#41,Worker-2: Deferred Early Start,5,main]" timed out waiting (30063ms) for thread "Thread[#67,Framework stop - Equinox Container: cf03d63d-e8f0-4178-8c00-4a17b155f4c7,6,main]" to finish starting bundle "org.eclipse.equinox.p2.ui_2.8.300.v20240207-1113 [241]". To avoid deadlock, thread "Thread[#41,Worker-2: Deferred Early Start,5,main]" is proceeding but "org.eclipse.equinox.internal.p2.ui.ValidationDialogServiceUI" may not be fully initialized.
!STACK 0
org.osgi.framework.BundleException: Unable to acquire the state change lock for the module: osgi.identity; type="osgi.bundle"; version:Version="2.8.300.v20240207-1113"; osgi.identity="org.eclipse.equinox.p2.ui"; singleton:="true" [id=241] STARTED [STOPPED]
	at org.eclipse.osgi.container.Module.lockStateChange(Module.java:373)
	at org.eclipse.osgi.container.Module.start(Module.java:447)
	at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:528)
	at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:122)
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:620)
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:348)
	at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:414)
	at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:520)
	at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:434)
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:174)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at org.eclipse.equinox.internal.p2.ui.ServiceUIComponent.createService(ServiceUIComponent.java:28)
	at org.eclipse.equinox.internal.p2.core.ProvisioningAgent.getService(ProvisioningAgent.java:74)
	at org.eclipse.oomph.setup.internal.core.util.SetupCoreUtil.<clinit>(SetupCoreUtil.java:159)
	at org.eclipse.oomph.setup.ui.recorder.RecorderManager.<clinit>(RecorderManager.java:121)
	at org.eclipse.oomph.setup.ui.SetupUIPlugin.performStartup(SetupUIPlugin.java:218)
	at org.eclipse.oomph.setup.ui.EarlyStartup.earlyStartup(EarlyStartup.java:23)
	at org.eclipse.oomph.internal.ui.EarlyStart.run(EarlyStart.java:119)
	at org.eclipse.oomph.internal.ui.EarlyStart$1.run(EarlyStart.java:98)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.util.concurrent.TimeoutException: Timeout after waiting 30 seconds to acquire the lock.
	at org.eclipse.osgi.container.Module.lockStateChange(Module.java:368)
	... 19 more
Caused by: org.eclipse.osgi.framework.util.ThreadInfoReport: Thread dump

ThreadId: 41 ThreadName: Worker-2: Deferred Early Start ThreadState: RUNNABLE
  Blocked On: org.eclipse.osgi.internal.container.EquinoxReentrantLock@2d421b29[Locked by thread Framework stop - Equinox Container: cf03d63d-e8f0-4178-8c00-4a17b155f4c7]
  Synchronizers Locked: none
  Monitors Locked: 
    java.util.Collections$SynchronizedMap@3a6ad9cd
  Stack Trace: 
    [email protected]/sun.management.ThreadImpl.dumpThreads0(Native Method)
    [email protected]/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:518)
    [email protected]/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:506)
    org.eclipse.osgi.framework.util.ThreadInfoReport.getThreadDump(ThreadInfoReport.java:30)
    org.eclipse.osgi.framework.util.ThreadInfoReport.<init>(ThreadInfoReport.java:23)
    org.eclipse.osgi.container.Module.lockStateChange(Module.java:370)
    org.eclipse.osgi.container.Module.start(Module.java:447)
    org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:528)
    org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:122)
    org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:620)
    org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:348)
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:414)
    org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:520)
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:434)
    org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:174)
    [email protected]/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
    org.eclipse.equinox.internal.p2.ui.ServiceUIComponent.createService(ServiceUIComponent.java:28)
    org.eclipse.equinox.internal.p2.core.ProvisioningAgent.getService(ProvisioningAgent.java:74)
    org.eclipse.oomph.setup.internal.core.util.SetupCoreUtil.<clinit>(SetupCoreUtil.java:159)
    org.eclipse.oomph.setup.ui.recorder.RecorderManager.<clinit>(RecorderManager.java:121)
    org.eclipse.oomph.setup.ui.SetupUIPlugin.performStartup(SetupUIPlugin.java:218)
    org.eclipse.oomph.setup.ui.EarlyStartup.earlyStartup(EarlyStartup.java:23)
    org.eclipse.oomph.internal.ui.EarlyStart.run(EarlyStart.java:119)
    org.eclipse.oomph.internal.ui.EarlyStart$1.run(EarlyStart.java:98)
    org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

ThreadId: 67 ThreadName: Framework stop - Equinox Container: cf03d63d-e8f0-4178-8c00-4a17b155f4c7 ThreadState: BLOCKED
  Blocked On: java.util.Collections$SynchronizedMap@3a6ad9cd LockOwnerId: 41 LockOwnerName: Worker-2: Deferred Early Start
  Synchronizers Locked: 
    java.util.concurrent.locks.ReentrantLock$NonfairSync@1091f5bf
    java.util.concurrent.locks.ReentrantLock$NonfairSync@48d78960
    java.util.concurrent.locks.ReentrantLock$NonfairSync@45a3780e
  Monitors Locked: 
    java.lang.Object@33f8177
  Stack Trace: 
    [email protected]/java.util.Collections$SynchronizedMap.get(Collections.java:2892)
    org.eclipse.equinox.internal.p2.core.ProvisioningAgent.removedService(ProvisioningAgent.java:177)
    org.osgi.util.tracker.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:973)
    org.osgi.util.tracker.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1)
    org.osgi.util.tracker.AbstractTracked.untrack(AbstractTracked.java:342)
    org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:915)
    org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:133)
    org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:985)
    org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151)
    org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:956)
    org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:890)
    org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:245)
    org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:952)
    org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:915)
    org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:140)
    org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterService(AbstractComponentManager.java:994)
    org.apache.felix.scr.impl.manager.AbstractComponentManager.doDeactivate(AbstractComponentManager.java:844)
    org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:825)
    org.apache.felix.scr.impl.manager.AbstractComponentManager.dispose(AbstractComponentManager.java:589)
    org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.disposeComponents(ConfigurableComponentHolder.java:722)
    org.apache.felix.scr.impl.BundleComponentActivator.dispose(BundleComponentActivator.java:492)
    org.apache.felix.scr.impl.Activator.disposeComponents(Activator.java:672)
    org.apache.felix.scr.impl.Activator.access$300(Activator.java:75)
    org.apache.felix.scr.impl.Activator$ScrExtension.destroy(Activator.java:510)
    org.apache.felix.scr.impl.AbstractExtender$1.run(AbstractExtender.java:216)
    [email protected]/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
    [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:317)
    org.apache.felix.scr.impl.AbstractExtender.destroyExtension(AbstractExtender.java:238)
    org.apache.felix.scr.impl.AbstractExtender.bundleChanged(AbstractExtender.java:132)
    org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:256)
    org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:972)
    org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151)
    org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:235)
    org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:134)
    org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:126)
    org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:229)
    org.eclipse.osgi.container.Module.publishEvent(Module.java:531)
    org.eclipse.osgi.container.Module.doStop(Module.java:693)
    org.eclipse.osgi.container.Module.stop(Module.java:554)
    org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.decStartLevel(ModuleContainer.java:2115)
    org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1985)
    org.eclipse.osgi.container.SystemModule.stopWorker(SystemModule.java:281)
    org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule.stopWorker(EquinoxBundle.java:222)
    org.eclipse.osgi.container.Module.doStop(Module.java:695)
    org.eclipse.osgi.container.Module.stop(Module.java:554)
    org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:212)
    org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:240)
    [email protected]/java.lang.Thread.runWith(Thread.java:1596)
    [email protected]/java.lang.Thread.run(Thread.java:1583)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions