Bug 579964 - Decoration Calculation will interrupt UI thread
Summary: Decoration Calculation will interrupt UI thread
Status: RESOLVED FIXED
Alias: None
Product: EGit
Classification: Technology
Component: UI (show other bugs)
Version: 6.2   Edit
Hardware: PC Linux
: P3 normal (vote)
Target Milestone: 6.2   Edit
Assignee: Andrey Loskutov CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-05-19 09:25 EDT by Andrey Loskutov CLA
Modified: 2022-05-19 13:46 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrey Loskutov CLA 2022-05-19 09:25:42 EDT
Got a (prevented) deadlock error on startup using latest platform / egit versions as of today.

Looks like while egit decorator init in background thread it tries to call into UI via syncExec() but UI seem to be locked by other task. So deadlock prevention code interrupted UI operation (bad).

I have a fix.

!ENTRY org.eclipse.ui 4 4 2022-05-19 09:29:36.998
!MESSAGE To avoid deadlock while executing Display.syncExec() with argument: org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator$ChangeTrackingColorsAndFonts$$Lambda$987/0x0000000840bcb040@47d42394, thread Worker-8: Decoration Calculation will interrupt UI thread.
!SUBENTRY 1 org.eclipse.ui 4 4 2022-05-19 09:29:36.998
!MESSAGE Worker-8: Decoration Calculation thread is an instance of Worker or owns an ILock
!STACK 0
java.lang.IllegalStateException: Call stack for thread Worker-8: Decoration Calculation
	at java.management@11.0.10/sun.management.ThreadImpl.dumpThreads0(Native Method)
	at java.management@11.0.10/sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:485)
	at org.eclipse.ui.internal.UILockListener.reportInterruption(UILockListener.java:214)
	at org.eclipse.ui.internal.UILockListener.interruptUI(UILockListener.java:180)
	at org.eclipse.ui.internal.PendingSyncExec.waitUntilExecuted(PendingSyncExec.java:92)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:142)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:5911)
	at org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator$ChangeTrackingColorsAndFonts.reload(GitLightweightDecorator.java:338)
	at org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator$ChangeTrackingColorsAndFonts.<init>(GitLightweightDecorator.java:333)
	at org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator.<init>(GitLightweightDecorator.java:127)
	at java.base@11.0.10/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base@11.0.10/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base@11.0.10/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base@11.0.10/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:204)
	at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:920)
	at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:246)
	at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:63)
	at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:281)
	at org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition$1.run(LightweightDecoratorDefinition.java:123)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition.internalGetDecorator(LightweightDecoratorDefinition.java:119)
	at org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition.decorate(LightweightDecoratorDefinition.java:240)
	at org.eclipse.ui.internal.decorators.LightweightDecoratorManager$LightweightRunnable.run(LightweightDecoratorManager.java:105)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.ui.internal.decorators.LightweightDecoratorManager.decorate(LightweightDecoratorManager.java:360)
	at org.eclipse.ui.internal.decorators.LightweightDecoratorManager.getDecorations(LightweightDecoratorManager.java:346)
	at org.eclipse.ui.internal.decorators.DecorationScheduler$1.queue(DecorationScheduler.java:419)
	at org.eclipse.ui.internal.decorators.DecorationScheduler$1.run(DecorationScheduler.java:397)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
!SUBENTRY 1 org.eclipse.ui 4 4 2022-05-19 09:29:36.998
!MESSAGE UI thread waiting on a job or lock.
!STACK 0
java.lang.IllegalStateException: Call stack for thread main
	at java.base@11.0.10/java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.Semaphore.acquire(Semaphore.java:45)
	at org.eclipse.core.internal.jobs.OrderedLock.doAcquire(OrderedLock.java:172)
	at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:108)
	at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:85)
	at org.eclipse.core.internal.resources.WorkManager.checkIn(WorkManager.java:125)
	at org.eclipse.core.internal.resources.Workspace.prepareOperation(Workspace.java:2330)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2375)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2405)
	at org.eclipse.jdt.internal.core.JavaModelManager.initializeAllContainers(JavaModelManager.java:3091)
	at org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:2088)
	at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:3789)
	at org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:3270)
	at org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:3434)
	at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2519)
	at org.eclipse.jdt.internal.core.JavaProject.buildStructure(JavaProject.java:535)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:266)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:597)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:328)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:314)
	at org.eclipse.jdt.internal.core.JavaElement.getChildren(JavaElement.java:269)
	at org.eclipse.jdt.internal.core.JavaProject.getPackageFragmentRoots(JavaProject.java:2383)
	at org.eclipse.jdt.internal.ui.workingsets.DynamicSourcesWorkingSetUpdater.collectData(DynamicSourcesWorkingSetUpdater.java:266)
	at org.eclipse.jdt.internal.ui.workingsets.DynamicSourcesWorkingSetUpdater.restore(DynamicSourcesWorkingSetUpdater.java:305)
	at org.eclipse.ui.internal.WorkingSet.restoreWorkingSet(WorkingSet.java:154)
	at org.eclipse.ui.internal.AbstractWorkingSet.getElementsArray(AbstractWorkingSet.java:166)
	at org.eclipse.ui.internal.WorkingSet.equals(WorkingSet.java:98)
	at java.base@11.0.10/java.util.HashMap.getNode(HashMap.java:567)
	at java.base@11.0.10/java.util.HashMap.containsKey(HashMap.java:591)
	at java.base@11.0.10/java.util.HashSet.contains(HashSet.java:204)
	at org.eclipse.jdt.internal.ui.workingsets.DynamicSourcesWorkingSetUpdater.contains(DynamicSourcesWorkingSetUpdater.java:172)
	at org.eclipse.ui.internal.AbstractWorkingSetManager$8$1.run(AbstractWorkingSetManager.java:654)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.ui.internal.AbstractWorkingSetManager$8.runInUIThread(AbstractWorkingSetManager.java:650)
	at org.eclipse.ui.progress.UIJob.lambda$0(UIJob.java:95)
	at org.eclipse.ui.progress.UIJob$$Lambda$903/0x0000000840b29c40.run(Unknown Source)
	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:5000)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4480)
	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$154/0x0000000840330040.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 java.base@11.0.10/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base@11.0.10/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base@11.0.10/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base@11.0.10/java.lang.reflect.Method.invoke(Method.java:566)
	at app//org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
	at app//org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)
	at app//org.eclipse.equinox.launcher.Main.run(Main.java:1467)
	at app//org.eclipse.equinox.launcher.Main.main(Main.java:1440)
Comment 1 Eclipse Genie CLA 2022-05-19 09:32:19 EDT
New Gerrit change created: https://git.eclipse.org/r/c/egit/egit/+/193504