Bug 535074 - Deadlock due to OverlayResourceChangeListener
Summary: Deadlock due to OverlayResourceChangeListener
Status: UNCONFIRMED
Alias: None
Product: M2E-WTP
Classification: Technology
Component: overlay (show other bugs)
Version: 1.3.2   Edit
Hardware: PC Linux
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-05-24 11:32 EDT by Carsten Pfeiffer CLA
Modified: 2018-05-24 11:32 EDT (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Carsten Pfeiffer CLA 2018-05-24 11:32:18 EDT
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()).