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

Bug 363003

Summary: Eclipse hangs after opening sync view in the "changesets" mode with lots of modified files
Product: [Technology] EGit Reporter: Andrey Loskutov <loskutov>
Component: UIAssignee: Project Inbox <egit.ui-inbox>
Status: NEW --- QA Contact:
Severity: major    
Priority: P3 CC: remy.suen
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:

Description Andrey Loskutov CLA 2011-11-06 17:20:04 EST
Build Identifier: 3.7.1

I've checked out swt projects required to patch/build SWT on GTK 64 bit. To debug SWT with 64 bit, one have to modify lot of files (~800) as described on SWT FAQ.

Now to the point: the sync view was opened initially in the "workspace" mode, where files were shown in a tree like structure. This worked so far, until I've made one commit including one single file, and switched to the "Changesets" mode. The commit caused Eclipse to load 2 from 4 CPU's (bug 358898).

After closing sync viea and a restart (required to avoid heavy load described in bug 358898), I've just opened sync view again. This made my UI frozen forever (> 10 minutes), with now 3 from 4 CPU cores loaded.

The stack trace is below.

Reproducible: Always

Steps to Reproduce:
"main" prio=10 tid=0x0000000000b08800 nid=0x318e runnable [0x00007f4c7479a000]
   java.lang.Thread.State: RUNNABLE
	at org.eclipse.core.internal.watson.ElementTree.includes(ElementTree.java:527)
	- locked <0x000000078a5820d8> (a org.eclipse.core.internal.watson.ElementTree)
	at org.eclipse.core.internal.resources.Workspace.getResourceInfo(Workspace.java:1768)
	at org.eclipse.core.internal.localstore.FileSystemResourceManager.getStoreRoot(FileSystemResourceManager.java:528)
	at org.eclipse.core.internal.localstore.FileSystemResourceManager.locationFor(FileSystemResourceManager.java:754)
	at org.eclipse.core.internal.resources.Resource.getLocation(Resource.java:1116)
	at org.eclipse.core.internal.localstore.FileSystemResourceManager.resourceForLocation(FileSystemResourceManager.java:285)
	at org.eclipse.core.internal.localstore.FileSystemResourceManager.fileForLocation(FileSystemResourceManager.java:472)
	at org.eclipse.core.internal.resources.WorkspaceRoot.getFileForLocation(WorkspaceRoot.java:137)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForFile(GitContainerMapping.java:69)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:62)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.getTraversals(GitContainerMapping.java:47)
	at org.eclipse.team.internal.ui.Utils.getResources(Utils.java:644)
	at org.eclipse.team.internal.ui.Utils.getResources(Utils.java:630)
	at org.eclipse.team.internal.ui.Utils.getContributedResources(Utils.java:669)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView$2.getContributedResourceOrResourceVariant(SynchronizeView.java:798)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView$2.equals(SynchronizeView.java:818)
	at org.eclipse.jface.viewers.CustomHashtable.keyEquals(CustomHashtable.java:277)
	at org.eclipse.jface.viewers.CustomHashtable.get(CustomHashtable.java:239)
	at org.eclipse.jface.viewers.StructuredViewer.findItems(StructuredViewer.java:816)
	at org.eclipse.jface.viewers.StructuredViewer.findItem(StructuredViewer.java:780)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalGetWidgetToSelect(AbstractTreeViewer.java:1732)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1620)
	at org.eclipse.jface.viewers.AbstractTreeViewer.setSelectionToWidget(AbstractTreeViewer.java:2507)
	at org.eclipse.ui.navigator.CommonViewer.setSelectionToWidget(CommonViewer.java:446)
	at org.eclipse.jface.viewers.StructuredViewer.setSelectionToWidget(StructuredViewer.java:1767)
	at org.eclipse.jface.viewers.AbstractTreeViewer.setSelectionToWidget(AbstractTreeViewer.java:2947)
	at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1723)
	at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1139)
	at org.eclipse.ui.navigator.CommonViewer.setSelection(CommonViewer.java:377)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.showInput(SynchronizeView.java:896)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.editorActivated(SynchronizeView.java:881)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.setLinkingEnabled(SynchronizeView.java:838)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.createOpenAndLinkWithEditorHelper(SynchronizeView.java:481)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.display(SynchronizeView.java:451)
	at org.eclipse.team.internal.ui.synchronize.RefreshUserNotificationPolicy$1.run(RefreshUserNotificationPolicy.java:49)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
	- locked <0x000000078afcf6a0> (a org.eclipse.swt.widgets.RunnableLock)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Comment 1 Andrey Loskutov CLA 2011-11-06 17:22:33 EST
P.S. egit version is from latest available nightly build
org.eclipse.egit.core_1.2.0.201111041821.jar
org.eclipse.egit.ui_1.2.0.201111041821.jar
org.eclipse.egit_1.2.0.201111041821.jar
Comment 2 Andrey Loskutov CLA 2011-11-06 17:37:35 EST
P.P.S: Any work with the sync view is impossible - it will end up in the same stack trace with the CPU loaded for minutes on each single click (until one switches the view back to the "Workspace" model).

So even activating the already opened sync view causes Eclipse hangs for a minute:

"main" prio=10 tid=0x0000000000b08800 nid=0x318e runnable [0x00007f4c74799000]
   java.lang.Thread.State: RUNNABLE
	at org.eclipse.core.internal.localstore.FileSystemResourceManager.resourceForLocation(FileSystemResourceManager.java:286)
	at org.eclipse.core.internal.localstore.FileSystemResourceManager.fileForLocation(FileSystemResourceManager.java:472)
	at org.eclipse.core.internal.resources.WorkspaceRoot.getFileForLocation(WorkspaceRoot.java:137)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForFile(GitContainerMapping.java:69)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:62)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.createTraversalForContainer(GitContainerMapping.java:60)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.getTraversals(GitContainerMapping.java:47)
	at org.eclipse.ui.internal.views.markers.MarkerResourceUtil.addResources(MarkerResourceUtil.java:332)
	at org.eclipse.ui.internal.views.markers.MarkerContentGenerator.internalUpdateSelectedElements(MarkerContentGenerator.java:879)
	at org.eclipse.ui.internal.views.markers.MarkerContentGenerator.updateSelectedResource(MarkerContentGenerator.java:895)
	at org.eclipse.ui.internal.views.markers.ExtendedMarkersView$ViewerPageSelectionListener.selectionChanged(ExtendedMarkersView.java:1771)
	at org.eclipse.ui.internal.AbstractSelectionService.firePostSelection(AbstractSelectionService.java:179)
	at org.eclipse.ui.internal.AbstractSelectionService.setActivePart(AbstractSelectionService.java:289)
	at org.eclipse.ui.internal.WorkbenchPagePartList.fireActivePartChanged(WorkbenchPagePartList.java:60)
	at org.eclipse.ui.internal.PartList.setActivePart(PartList.java:136)
Comment 3 Dariusz Luksza CLA 2012-05-08 16:45:02 EDT
Since version 1.2 I've made huge improvements in synchornize view performance and memory usage, could you please check how latest nightly build behaves in this use case ?
Comment 4 Andrey Loskutov CLA 2012-05-08 17:06:11 EDT
(In reply to comment #3)
> Since version 1.2 I've made huge improvements in synchornize view performance
> and memory usage, could you please check how latest nightly build behaves in
> this use case ?

Hi Dariusz,
I've given up on EGit because of the terrible performance on large projects, so now I do not have my old workspace anymore and will definitely not be able to reproduce it.

To reproduce, you can clone SWT project as described in SWT FAQ, change each second file and try to use sync view.