Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 458283

Summary: Deadlock when trying to save compare editor (EGit Merge Tool)
Product: [Eclipse Project] Platform Reporter: Markus Keller <markus.kell.r>
Component: RuntimeAssignee: platform-runtime-inbox <platform-runtime-inbox>
Status: CLOSED DUPLICATE QA Contact:
Severity: major    
Priority: P3 CC: juan.cadavid
Version: 4.5   
Target Milestone: ---   
Hardware: PC   
OS: Windows 7   
Whiteboard:
Attachments:
Description Flags
Stackdump none

Description Markus Keller CLA 2015-01-23 11:54:53 EST
Created attachment 250190 [details]
Stackdump

Eclipse SDK I20150120-0800
EGit 3.6.2.201501042013

Using EGit, I tried to revert a commit, but I ran into conflicts. I opened the EGit Merge Tool, resolved the conflict, and tried to save (Ctrl+S in the compare editor). The result was a deadlock where a modal "Progress Information" dialog was shown with message "The user operation is waiting for background work to complete". But the Cancel button was disabled and neither the dialog's close box nor the Esc key does anything.

Using an external debugger, I saw that the ModalContext thread called JobManager.beginRule(..), and the schedulingRule was the file I just tried to save.

The main thread already holds the workspace lock in Workspace.run(IWorkspaceRunnable, ISchedulingRule, int, IProgressMonitor) line: 2313	
and is caught in an endless readAndDispatch loop around ModalContext$ModalContextThread.block() line: 172

I think I've run into this before a few weeks ago, but I don't remember such a deadlock from older releases (Luna and before).

Workaround if you have an OSGi console (this loses the merged document, but at least lets you continue):
osgi> threads stop ModalContext


Relevant stacktraces:
"ModalContext" prio=6 tid=0x0000000016e76000 nid=0x5f8 in Object.wait() [0x00000000261be000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:503)
        at org.eclipse.core.internal.jobs.ThreadJob.waitForRun(ThreadJob.java:270)
        - locked <0x00000007c5b3c310> (a java.lang.Object)
        at org.eclipse.core.internal.jobs.ThreadJob.joinRun(ThreadJob.java:197)
        at org.eclipse.core.internal.jobs.ImplicitJobs.begin(ImplicitJobs.java:92)
        at org.eclipse.core.internal.jobs.JobManager.beginRule(JobManager.java:299)
        at org.eclipse.core.internal.resources.WorkManager.checkIn(WorkManager.java:118)
        at org.eclipse.core.internal.resources.Workspace.prepareOperation(Workspace.java:2251)
        at org.eclipse.core.internal.resources.File.setContents(File.java:359)
        at org.eclipse.core.internal.resources.File.setContents(File.java:470)
        at org.eclipse.egit.ui.internal.revision.ResourceEditableRevision$1.run(ResourceEditableRevision.java:60)
        at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:119)

"main" prio=6 tid=0x0000000002748000 nid=0x235c runnable [0x0000000002afb000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
        at org.eclipse.swt.widgets.Display.sleep(Display.java:4720)
        at org.eclipse.jface.operation.ModalContext$ModalContextThread.block(ModalContext.java:173)
        at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:387)
        at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:500)
        at org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog.run(ProgressMonitorJobsDialog.java:284)
        at org.eclipse.ui.internal.progress.ProgressManager.run(ProgressManager.java:1190)
        at org.eclipse.compare.internal.CompareContainer.run(CompareContainer.java:80)
        at org.eclipse.egit.ui.internal.revision.ResourceEditableRevision.setContent(ResourceEditableRevision.java:56)
        at org.eclipse.compare.internal.MergeViewerContentProvider.saveLeftContent(MergeViewerContentProvider.java:132)
        at org.eclipse.compare.contentmergeviewer.ContentMergeViewer.flushLeftSide(ContentMergeViewer.java:1215)
        at org.eclipse.compare.contentmergeviewer.TextMergeViewer.flushLeftSide(TextMergeViewer.java:5110)
        at org.eclipse.compare.contentmergeviewer.TextMergeViewer.flushContent(TextMergeViewer.java:5134)
        at org.eclipse.compare.contentmergeviewer.ContentMergeViewer.flush(ContentMergeViewer.java:1186)
        at org.eclipse.compare.CompareEditorInput.flushViewer(CompareEditorInput.java:1266)
        at org.eclipse.compare.CompareEditorInput.flushViewers(CompareEditorInput.java:1235)
        at org.eclipse.compare.CompareEditorInput.saveChanges(CompareEditorInput.java:1220)
        at org.eclipse.compare.internal.CompareEditor$5.execute(CompareEditor.java:542)
        at org.eclipse.ui.actions.WorkspaceModifyOperation$1.run(WorkspaceModifyOperation.java:108)
        at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313)
        at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:130)
        - locked <0x00000007d97ebc10> (a org.eclipse.compare.internal.CompareEditor$5)
        at org.eclipse.compare.internal.CompareEditor.doSave(CompareEditor.java:550)
        at org.eclipse.compare.internal.CompareEditor$CompareSaveable.doSave(CompareEditor.java:690)
        at org.eclipse.ui.Saveable.doSave(Saveable.java:216)
        at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:355)
        at org.eclipse.ui.internal.SaveableHelper$3.run(SaveableHelper.java:199)
        at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:283)
        at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:463)
        at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:371)
        at org.eclipse.ui.internal.WorkbenchWindow$13.run(WorkbenchWindow.java:2139)
        at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
        at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2135)
        at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:291)
        at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:269)
        at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:211)
        at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:146)
        at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3793)
        at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3807)
        at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:54)
        at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:295)
        at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:90)
        at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
        at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:247)
        at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:229)
        at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
        at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:149)
        at org.eclipse.core.commands.Command.executeWithChecks(Command.java:499)
        at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
        at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210)
        at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:286)
        at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:507)
        at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:558)
        at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:378)
        at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:324)
        at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:86)
...
Comment 1 Markus Keller CLA 2015-02-12 09:49:22 EST

*** This bug has been marked as a duplicate of bug 456758 ***