Community
Participate
Working Groups
We observed a deadlock on Eclipse startup with the following stracktrace (excerpt): "Worker-16" #62 prio=5 os_prio=0 tid=0x00000000222dc000 nid=0x2e40 waiting for monitor entry [0x000000003737e000] java.lang.Thread.State: BLOCKED (on object monitor) at org.eclipse.wst.server.core.internal.Server.getModules(Server.java:2527) - waiting to lock <0x00000007292a4a58> (a java.lang.Object) at org.eclipse.m2e.wtp.overlay.internal.servers.OverlayResourceChangeListener.resourceChanged(OverlayResourceChangeListener.java:75) at org.eclipse.core.internal.events.NotificationManager$1.run(NotificationManager.java:299) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.NotificationManager.notify(NotificationManager.java:289) at org.eclipse.core.internal.events.NotificationManager.broadcastChanges(NotificationManager.java:152) at org.eclipse.core.internal.resources.Workspace.broadcastPostChange(Workspace.java:374) at org.eclipse.core.internal.resources.Workspace.endOperation(Workspace.java:1469) at org.eclipse.core.internal.resources.Resource.refreshLocal(Resource.java:1599) at org.eclipse.core.internal.refresh.RefreshJob.runInWorkspace(RefreshJob.java:163) at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) "main" #1 prio=6 os_prio=0 tid=0x000000000465e800 nid=0xf9c in Object.wait() [0x000000000014c000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) at org.eclipse.core.internal.jobs.Semaphore.acquire(Semaphore.java:39) - locked <0x0000000735702570> (a org.eclipse.core.internal.jobs.Semaphore) at org.eclipse.core.internal.jobs.OrderedLock.doAcquire(OrderedLock.java:170) at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:106) at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:82) at org.eclipse.core.internal.resources.WorkManager.checkIn(WorkManager.java:122) at org.eclipse.core.internal.resources.Workspace.prepareOperation(Workspace.java:2188) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2235) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267) at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:795) at org.eclipse.jdt.core.JavaCore.setClasspathVariables(JavaCore.java:5687) at org.eclipse.jdt.core.JavaCore.setClasspathVariable(JavaCore.java:5646) at org.eclipse.m2e.jdt.internal.BuildPathManager.setupVariables(BuildPathManager.java:726) at org.eclipse.m2e.jdt.internal.MavenClasspathVariableInitializer.initialize(MavenClasspathVariableInitializer.java:30) at org.eclipse.jdt.core.JavaCore.getClasspathVariable(JavaCore.java:3549) at org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities.getResolvedPathForArchiveComponent(J2EEProjectUtilities.java:905) at org.eclipse.jst.j2ee.internal.common.VirtualArchiveComponentAdapterFactory.getAdapter(VirtualArchiveComponentAdapterFactory.java:23) at org.eclipse.core.internal.runtime.AdapterManager.getAdapter(AdapterManager.java:294) at org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent.getAdapter(VirtualArchiveComponent.java:227) at org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent.getUnderlyingDiskFile(VirtualArchiveComponent.java:282) at org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent.getAdapter(VirtualArchiveComponent.java:215) at org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent.exists(VirtualArchiveComponent.java:194) at org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent.getReferences(VirtualComponent.java:440) at org.eclipse.jst.j2ee.componentcore.util.EARVirtualComponent.getHardReferences(EARVirtualComponent.java:89) at org.eclipse.jst.j2ee.componentcore.util.EARVirtualComponent.getReferences(EARVirtualComponent.java:192) at org.eclipse.jst.j2ee.internal.deployables.J2EEDeployableFactory.LEGACY_createBinaryModules(J2EEDeployableFactory.java:166) at org.eclipse.jst.j2ee.internal.deployables.J2EEDeployableFactory.createModuleDelegates(J2EEDeployableFactory.java:143) at org.eclipse.jst.j2ee.internal.deployables.J2EEDeployableFactory.createModules(J2EEDeployableFactory.java:91) at org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate.cacheModules(ProjectModuleFactoryDelegate.java:60) at org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate.findModule(ProjectModuleFactoryDelegate.java:279) at org.eclipse.wst.server.core.internal.ModuleFactory.findModule(ModuleFactory.java:208) at org.eclipse.wst.server.core.ServerUtil.getModule(ServerUtil.java:136) at org.eclipse.wst.server.core.internal.Server.getModulesWithoutLock(Server.java:2564) at org.eclipse.wst.server.core.internal.Server.getModules(Server.java:2527) - locked <0x00000007292a4a58> (a java.lang.Object) at org.jboss.ide.eclipse.as.ui.actions.ChangeTimeStampActionDelegate.getServers(ChangeTimeStampActionDelegate.java:150) at org.jboss.ide.eclipse.as.ui.actions.ChangeTimeStampActionDelegate.buildActions(ChangeTimeStampActionDelegate.java:112) at org.jboss.ide.eclipse.as.ui.actions.ChangeTimeStampActionDelegate.selectionChanged(ChangeTimeStampActionDelegate.java:69) at org.eclipse.ui.internal.PluginAction.refreshEnablement(PluginAction.java:206) at org.eclipse.ui.internal.PluginAction.selectionChanged(PluginAction.java:273) at org.eclipse.ui.internal.PluginAction.selectionChanged(PluginAction.java:297) at org.eclipse.ui.internal.e4.compatibility.SelectionService.notifyListeners(SelectionService.java:259) at org.eclipse.ui.internal.e4.compatibility.SelectionService.handleSelectionChanged(SelectionService.java:108) at org.eclipse.ui.internal.e4.compatibility.SelectionService.access$0(SelectionService.java:92) at org.eclipse.ui.internal.e4.compatibility.SelectionService$1.selectionChanged(SelectionService.java:67) at org.eclipse.e4.ui.internal.workbench.SelectionAggregator$2.run(SelectionAggregator.java:126) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.e4.ui.internal.workbench.SelectionAggregator.notifyListeners(SelectionAggregator.java:123) at org.eclipse.e4.ui.internal.workbench.SelectionAggregator.access$6(SelectionAggregator.java:121) at org.eclipse.e4.ui.internal.workbench.SelectionAggregator$7$1.run(SelectionAggregator.java:231) at org.eclipse.e4.core.contexts.RunAndTrack.runExternalCode(RunAndTrack.java:56) - locked <0x000000072ad27a10> (a org.eclipse.e4.ui.internal.workbench.SelectionAggregator$7) at org.eclipse.e4.ui.internal.workbench.SelectionAggregator$7.changed(SelectionAggregator.java:228) at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:114) at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:344) at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:359) at org.eclipse.e4.ui.internal.workbench.SelectionServiceImpl.setSelection(SelectionServiceImpl.java:31) at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.selectionChanged(CompatibilityPart.java:450) at org.eclipse.jface.viewers.Viewer$1.run(Viewer.java:158) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:50) at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173) at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:155) at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2191) at org.eclipse.jface.viewers.StructuredViewer.handleSelect(StructuredViewer.java:1229) at org.eclipse.jface.viewers.StructuredViewer$4.widgetSelected(StructuredViewer.java:1258) at org.eclipse.jface.util.OpenStrategy.fireSelectionEvent(OpenStrategy.java:242) at org.eclipse.jface.util.OpenStrategy.access$4(OpenStrategy.java:236) at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:405) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4236) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3824) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) at org.eclipse.equinox.launcher.Main.run(Main.java:1519) Both threads try to call org.eclipse.wst.server.core.internal.Server.getModules(), the main thread was first (and got the mutex), but the worker-thread runs in a workspace operation (refresh) and thus prevents the other Server.getModules() invocation from finishing. It's unfortunate that getModules() leads to lazy initialization of all kinds of things and eventually needing a workspace operation. To me, the easiest fix seems to be moving the server redeployment outside of the workspace operation (OverlayResourceChangeListener.resourceChanged()).