Skip to content

Race condition with Marker info when modifying code and expanding element in Problems view #2219

@trancexpress

Description

@trancexpress

One of our automated tests ran into this exception:

!ENTRY org.eclipse.core.resources 4 376 2025-10-27 16:00:47.252
!MESSAGE Marker id 6922 not found.
!STACK 0
java.lang.IllegalStateException
 at org.eclipse.core.internal.resources.Marker.checkInfo(Marker.java:71)
 at org.eclipse.core.internal.resources.Marker.getType(Marker.java:228)
 at org.eclipse.ui.texteditor.MarkerUtilities.getMarkerType(MarkerUtilities.java:259)
 at org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.internalHasResolutions(CorrectionMarkerResolutionGenerator.java:338)
 at org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.hasResolutions(CorrectionMarkerResolutionGenerator.java:327)
 at org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry.hasResolution(MarkerHelpRegistry.java:263)
 at org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry.hasResolutions(MarkerHelpRegistry.java:236)
 at org.eclipse.ui.views.markers.MarkerField.annotateImage(MarkerField.java:86)
 at org.eclipse.ui.internal.views.markers.MarkerProblemSeverityAndMessageField.update(MarkerProblemSeverityAndMessageField.java:83)
 at org.eclipse.ui.internal.views.markers.MarkerColumnLabelProvider.update(MarkerColumnLabelProvider.java:54)
 at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:149)
 at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:999)
 at org.eclipse.ui.internal.views.markers.MarkersTreeViewer.doUpdateItem(MarkersTreeViewer.java:62)
 at org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:156)
 at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
 at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:169)
 at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1072)
 at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:426)
 at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
 at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:169)
 at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2111)
 at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:892)
 at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:870)
 at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:612)
 at org.eclipse.jface.viewers.AbstractTreeViewer.internalCustomizedExpandToLevel(AbstractTreeViewer.java:1855)
 at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpandToLevel(AbstractTreeViewer.java:1886)
 at org.eclipse.jface.viewers.AbstractTreeViewer.expandToLevel(AbstractTreeViewer.java:1167)
 at org.eclipse.jface.viewers.AbstractTreeViewer.expandToLevel(AbstractTreeViewer.java:1138)
 at org.eclipse.ui.internal.views.markers.ExtendedMarkersView.reexpandCategories(ExtendedMarkersView.java:1175)
 at org.eclipse.ui.internal.views.markers.UIUpdateJob.runInUIThread(UIUpdateJob.java:107)
 at org.eclipse.ui.progress.UIJob.lambda$0(UIJob.java:148)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:5079)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4548)

When debugging, I can reproduce the following two stack traces on the same ResourceInfo object:

"main" #1 [95302] prio=6 os_prio=0 cpu=10069.24ms elapsed=369.49s tid=0x00007f55cc01ae40 nid=95302 runnable  [0x00007f55d25fa000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.core.internal.resources.ResourceInfo.getMarkers(ResourceInfo.java:196)
        at org.eclipse.core.internal.resources.MarkerManager.findMarkerInfo(MarkerManager.java:274)
        at org.eclipse.core.internal.resources.Marker.getInfo(Marker.java:211)
        at org.eclipse.core.internal.resources.Marker.getType(Marker.java:227)
        at org.eclipse.ui.texteditor.MarkerUtilities.getMarkerType(MarkerUtilities.java:259)
        at org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.internalHasResolutions(CorrectionMarkerResolutionGenerator.java:338)
        at org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.hasResolutions(CorrectionMarkerResolutionGenerator.java:327)
        at org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry.hasResolution(MarkerHelpRegistry.java:263)
        at org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry.hasResolutions(MarkerHelpRegistry.java:236)
        at org.eclipse.ui.views.markers.MarkerField.annotateImage(MarkerField.java:86)
        at org.eclipse.ui.internal.views.markers.MarkerProblemSeverityAndMessageField.update(MarkerProblemSeverityAndMessageField.java:83)
        at org.eclipse.ui.internal.views.markers.MarkerColumnLabelProvider.update(MarkerColumnLabelProvider.java:54)
        at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:149)
        at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:999)
        at org.eclipse.ui.internal.views.markers.MarkersTreeViewer.doUpdateItem(MarkersTreeViewer.java:62)
        at org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:156)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
        at org.eclipse.ui.internal.JFaceUtil$$Lambda/0x00007f55541bbc70.run(Unknown Source)
        at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:169)
        at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1072)
        at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:426)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
        at org.eclipse.ui.internal.JFaceUtil$$Lambda/0x00007f55541bbc70.run(Unknown Source)
        at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:169)
        at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2111)
        at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:892)
        at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:870)
        at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:612)
        at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:817)
        at org.eclipse.jface.viewers.AbstractTreeViewer.handleTreeExpand(AbstractTreeViewer.java:1601)
        at org.eclipse.jface.viewers.TreeViewer.handleTreeExpand(TreeViewer.java:905)
        at org.eclipse.jface.viewers.AbstractTreeViewer$3.treeExpanded(AbstractTreeViewer.java:1613)
        at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:170)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91)
        at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5889)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1665)
        at org.eclipse.swt.widgets.Tree.gtk_test_expand_row(Tree.java:2600)
        at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2668)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:6202)
        at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_do_event(Native Method)
        at org.eclipse.swt.widgets.Display.eventProc(Display.java:1624)
        at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4542)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1147)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1038)
        at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
        at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:677)
        at org.eclipse.ui.internal.Workbench$$Lambda/0x00007f55541dfd48.run(Unknown Source)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
        at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
        at java.lang.invoke.DirectMethodHandle$Holder.invokeStatic([email protected]/DirectMethodHandle$Holder)
        at java.lang.invoke.LambdaForm$MH/0x00007f5554016800.invoke([email protected]/LambdaForm$MH)
        at java.lang.invoke.LambdaForm$MH/0x00007f5554016c00.invokeExact_MT([email protected]/LambdaForm$MH)
        at jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl([email protected]/DirectMethodHandleAccessor.java:155)
        at jdk.internal.reflect.DirectMethodHandleAccessor.invoke([email protected]/DirectMethodHandleAccessor.java:103)
        at java.lang.reflect.Method.invoke([email protected]/Method.java:580)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1387)
"Worker-15: Building" #128 [98667] prio=5 os_prio=0 cpu=18.10ms elapsed=130.64s tid=0x00007f544c004410 nid=98667 at breakpoint [0x00007f54b34fa000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.core.internal.resources.ResourceInfo.setMarkers(ResourceInfo.java:389)
        at org.eclipse.core.internal.resources.MarkerManager.basicRemoveMarkers(MarkerManager.java:201)
        at org.eclipse.core.internal.resources.MarkerManager.recursiveRemoveMarkers(MarkerManager.java:496)
        at org.eclipse.core.internal.resources.MarkerManager.removeMarkers(MarkerManager.java:551)
        at org.eclipse.core.internal.resources.Resource.deleteMarkers(Resource.java:870)
        at org.eclipse.jdt.internal.core.builder.JavaBuilder.removeProblemsFor(JavaBuilder.java:147)
        at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.updateProblemsFor(IncrementalImageBuilder.java:873)
        at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.acceptResult(AbstractImageBuilder.java:178)
        at org.eclipse.jdt.internal.compiler.Compiler.processCompiledUnits(Compiler.java:501)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:358)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:309)
        at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:486)
        at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.compile(IncrementalImageBuilder.java:387)
        at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:377)
        at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.incrementalBuildLoop(IncrementalImageBuilder.java:207)
        at org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.build(IncrementalImageBuilder.java:164)
        at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildDeltas(JavaBuilder.java:330)
        at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:247)
        at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1109)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:299)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:355)
        at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:449)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:452)
        at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:564)
        at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:512)
        at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:594)
        at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:208)
        at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:309)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

Letting the AutoBuildJob thread finish, then letting the main thread finish, results in:

!ENTRY org.eclipse.core.resources 4 376 2025-10-29 16:51:21.855
!MESSAGE Marker id 60 not found.
!STACK 0
java.lang.IllegalStateException
	at org.eclipse.core.internal.resources.Marker.checkInfo(Marker.java:71)
	at org.eclipse.core.internal.resources.Marker.getType(Marker.java:228)
	at org.eclipse.ui.texteditor.MarkerUtilities.getMarkerType(MarkerUtilities.java:259)
	at org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.internalHasResolutions(CorrectionMarkerResolutionGenerator.java:338)
	at org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.hasResolutions(CorrectionMarkerResolutionGenerator.java:327)
	at org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry.hasResolution(MarkerHelpRegistry.java:263)
	at org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry.hasResolutions(MarkerHelpRegistry.java:236)
	at org.eclipse.ui.views.markers.MarkerField.annotateImage(MarkerField.java:86)
	at org.eclipse.ui.internal.views.markers.MarkerProblemSeverityAndMessageField.update(MarkerProblemSeverityAndMessageField.java:83)
	at org.eclipse.ui.internal.views.markers.MarkerColumnLabelProvider.update(MarkerColumnLabelProvider.java:54)
	at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:149)
	at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:999)
	at org.eclipse.ui.internal.views.markers.MarkersTreeViewer.doUpdateItem(MarkersTreeViewer.java:62)
	at org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:156)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:169)
	at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1072)
	at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:426)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:169)
	at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2111)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:892)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:870)
	at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:612)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:817)
	at org.eclipse.jface.viewers.AbstractTreeViewer.handleTreeExpand(AbstractTreeViewer.java:1601)
	at org.eclipse.jface.viewers.TreeViewer.handleTreeExpand(TreeViewer.java:905)
	at org.eclipse.jface.viewers.AbstractTreeViewer$3.treeExpanded(AbstractTreeViewer.java:1613)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:170)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5889)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1656)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1682)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1665)
	at org.eclipse.swt.widgets.Tree.gtk_test_expand_row(Tree.java:2600)
	at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2668)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:6202)
	at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_do_event(Native Method)
	at org.eclipse.swt.widgets.Display.eventProc(Display.java:1624)
	at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4542)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1147)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1038)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:677)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1387)

To reproduce:

  1. Debug Eclipse in a new workspace.
  2. In the debuggee, create a Java project with a source file:
package test;

public class TestClass {

	public static void main(String[] args) {
//		int x;
	}

}
  1. Set a breakpoint at the return line of: org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator.internalHasResolutions(IMarker)
  2. Set a conditional breakpoint at the start of: org.eclipse.core.internal.resources.ResourceInfo.setMarkers(MarkerSet), the condition is: value == null
  3. In the debuggee, comment in the line: // int x;
  4. In the debuggee, comment out the same line, this will hit the breakpoint in: ResourceInfo.setMarkers()
  5. In the debuggee, expand the only collapsed row, this will hit the breakpoint in: CorrectionMarkerResolutionGenerator
  6. Set a breakpoint at: org.eclipse.core.internal.resources.ResourceInfo.getMarkers(boolean)
  7. Resume the main thread that is in CorrectionMarkerResolutionGenerator, this will hit the breakpoint in: ResourceInfo.getMarkers()
  8. You should now see the two stack traces from above, on the same object.
  9. Step over in the AutoBuildJob thread.
  10. Resume the main thread.
  11. Observe logged error.

See screen recording:

vokoscreenNG-2025-10-29_17-05-53.mp4

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions