eclipse-platform / eclipse.platform

https://eclipse.dev/eclipse/
Eclipse Public License 2.0
75 stars 108 forks source link

TextMergeViewer deadlock #282

Open jukzi opened 1 year ago

jukzi commented 1 year ago

My eclipse IDE just stuck. I had a git pull which reported a change in "build.properties" and "MANIFEST.MF". I opened compare viewer and used "replace with" in Git stating view for both files. Swt Thread "main" waits for a worker thread that contrary waits that something in SWT finished = deadlock:

2022-11-23 11:53:26 Full thread dump OpenJDK 64-Bit Server VM (17.0.5+8 mixed mode, sharing):

"main" #1 prio=6 os_prio=0 cpu=76359.38ms elapsed=3218.47s tid=0x000001f661ecc910 nid=0x590c waiting for monitor entry  [0x0000003e654fd000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.eclipse.core.internal.filebuffers.SynchronizableDocument.getModificationStamp(SynchronizableDocument.java:151)
        - waiting to lock <0x000000075e6b4548> (a java.lang.Object)
        at org.eclipse.text.undo.DocumentUndoManager$UndoableTextChange.canUndo(DocumentUndoManager.java:163)
        at org.eclipse.core.commands.operations.DefaultOperationHistory.canUndo(DefaultOperationHistory.java:269)
        at org.eclipse.text.undo.DocumentUndoManager.undoable(DocumentUndoManager.java:835)
        at org.eclipse.jface.text.TextViewerUndoManager.undoable(TextViewerUndoManager.java:348)
        at org.eclipse.jface.text.TextViewer.canDoOperation(TextViewer.java:3886)
        at org.eclipse.jface.text.source.SourceViewer.canDoOperation(SourceViewer.java:816)
        at org.eclipse.compare.internal.MergeSourceViewer$TextOperationAction.isEnabled(MergeSourceViewer.java:139)
        at org.eclipse.compare.internal.MergeSourceViewer$TextOperationAction.update(MergeSourceViewer.java:144)
        at org.eclipse.compare.internal.MergeSourceViewer.updateContentDependantActions(MergeSourceViewer.java:818)
        at org.eclipse.compare.internal.MergeSourceViewer$$Lambda$2457/0x00000008023456f0.run(Unknown Source)
        at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
        at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132)
        - locked <0x00000007b16f92c8> (a org.eclipse.swt.widgets.RunnableLock)
        at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4043)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3648)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)
        at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
        at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644)
        at org.eclipse.ui.internal.Workbench$$Lambda$180/0x0000000800db70a0.run(Unknown Source)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156)
        at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@17.0.5/Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@17.0.5/NativeMethodAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17.0.5/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@17.0.5/Method.java:568)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1467)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1440)

"Worker-33: Building" #350 prio=5 os_prio=0 cpu=22296.88ms elapsed=1838.26s tid=0x000001f65d401aa0 nid=0xcf4 waiting on condition  [0x0000003e6a7fd000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@17.0.5/Native Method)
        - parking to wait for  <0x00000007b16530c8> (a java.util.concurrent.Semaphore$NonfairSync)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.5/LockSupport.java:252)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@17.0.5/AbstractQueuedSynchronizer.java:717)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(java.base@17.0.5/AbstractQueuedSynchronizer.java:1074)
        at java.util.concurrent.Semaphore.tryAcquire(java.base@17.0.5/Semaphore.java:415)
        at org.eclipse.ui.internal.PendingSyncExec.acquire(PendingSyncExec.java:39)
        at org.eclipse.ui.internal.PendingSyncExec.waitUntilExecuted(PendingSyncExec.java:88)
        at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:142)
        at org.eclipse.swt.widgets.Display.syncExec(Display.java:4790)
        at org.eclipse.compare.internal.Utilities.firePropertyChange(Utilities.java:182)
        at org.eclipse.compare.internal.Utilities.firePropertyChange(Utilities.java:169)
        at org.eclipse.compare.contentmergeviewer.ContentMergeViewer.fireDirtyState(ContentMergeViewer.java:1181)
        at org.eclipse.compare.contentmergeviewer.ContentMergeViewer.setLeftDirty(ContentMergeViewer.java:1197)
        at org.eclipse.compare.contentmergeviewer.TextMergeViewer.updateDirtyState(TextMergeViewer.java:3290)
        at org.eclipse.compare.contentmergeviewer.TextMergeViewer$ContributorInfo.elementDirtyStateChanged(TextMergeViewer.java:1049)
        at org.eclipse.ui.editors.text.TextFileDocumentProvider$FileBufferListener.dirtyStateChanged(TextFileDocumentProvider.java:305)
        at org.eclipse.core.internal.filebuffers.TextFileBufferManager$3.run(TextFileBufferManager.java:670)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
        at org.eclipse.core.internal.filebuffers.TextFileBufferManager.fireDirtyStateChanged(TextFileBufferManager.java:667)
        at org.eclipse.core.internal.filebuffers.ResourceTextFileBuffer$DocumentListener.documentChanged(ResourceTextFileBuffer.java:82)
        at org.eclipse.jface.text.AbstractDocument.doFireDocumentChanged2(AbstractDocument.java:748)
        at org.eclipse.jface.text.AbstractDocument.doFireDocumentChanged(AbstractDocument.java:717)
        at org.eclipse.jface.text.AbstractDocument.doFireDocumentChanged(AbstractDocument.java:701)
        at org.eclipse.jface.text.AbstractDocument.fireDocumentChanged(AbstractDocument.java:775)
        at org.eclipse.jface.text.AbstractDocument.replace(AbstractDocument.java:1100)
        at org.eclipse.core.internal.filebuffers.SynchronizableDocument.replace(SynchronizableDocument.java:176)
        - locked <0x000000075e6b4548> (a java.lang.Object)
        at org.eclipse.jface.text.AbstractDocument.replace(AbstractDocument.java:1118)
        at org.eclipse.core.internal.filebuffers.SynchronizableDocument.replace(SynchronizableDocument.java:164)
        - locked <0x000000075e6b4548> (a java.lang.Object)
        at org.eclipse.text.edits.ReplaceEdit.performDocumentUpdating(ReplaceEdit.java:79)
        at org.eclipse.text.edits.TextEdit.traverseDocumentUpdating(TextEdit.java:920)
        at org.eclipse.text.edits.TextEdit.traverseDocumentUpdating(TextEdit.java:913)
        at org.eclipse.text.edits.TextEditProcessor.executeDo(TextEditProcessor.java:196)
        at org.eclipse.text.edits.TextEdit.dispatchPerformEdits(TextEdit.java:742)
        at org.eclipse.text.edits.TextEditProcessor.performEdits(TextEditProcessor.java:158)
        at org.eclipse.text.edits.TextEdit.apply(TextEdit.java:714)
        at org.eclipse.text.edits.TextEdit.apply(TextEdit.java:738)
        at org.eclipse.pde.internal.ui.util.PDEModelUtility.generateModelEdits(PDEModelUtility.java:342)
        at org.eclipse.pde.internal.ui.util.PDEModelUtility.modifyModel(PDEModelUtility.java:279)
        at org.eclipse.pde.ds.internal.annotations.DSAnnotationCompilationParticipant.updateProject(DSAnnotationCompilationParticipant.java:467)
        at org.eclipse.pde.ds.internal.annotations.DSAnnotationCompilationParticipant.buildFinished(DSAnnotationCompilationParticipant.java:411)
        at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:251)
        at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1020)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:247)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:303)
        at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:392)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:395)
        at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:506)
        at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:454)
        at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:536)
        at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:161)
        at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:255)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

Already reported in: https://bugs.eclipse.org/bugs/show_bug.cgi?id=519002 [wontfix] https://bugs.eclipse.org/bugs/show_bug.cgi?id=319198 [wontfix]

jukzi commented 1 year ago

Can we just change syncExec to asyncExec in org.eclipse.compare.internal.Utilities.firePropertyChange()? (as suggested in https://bugs.eclipse.org/bugs/show_bug.cgi?id=319198#c4)

vogella commented 1 year ago

Can we just change syncExec to asyncExec in org.eclipse.compare.internal.Utilities.firePropertyChange()? (as suggested in https://bugs.eclipse.org/bugs/show_bug.cgi?id=319198#c4)

Would be nice to try that approach, any open compare editor seems to slow down the ide. I tend to close them frequently to avoid sluggish UI.

jukzi commented 1 year ago

I can not reproduce the Error, so i don't know if its fixed by this change :-( I only remember the issue involved an open merge view on MANIFEST.MF, a conflicting change in git, enabled "DS-annotations" and a class that was changed by one of the commits which was annotated @Component - which would create a line Service-Component: "OSGI-INF/projecrt.MyClass.xml" in the MANIFEST.

iloveeclipse commented 1 year ago

reopening because #283 caused regression in #464 and will be reverted.