Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 335044 - Synchronize performs I/O on UI thread => can block UI for long periods
Summary: Synchronize performs I/O on UI thread => can block UI for long periods
Status: NEW
Alias: None
Product: EGit
Classification: Technology
Component: UI (show other bugs)
Version: 0.11   Edit
Hardware: PC All
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-01-21 13:50 EST by James Blackburn CLA
Modified: 2011-06-09 16:35 EDT (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description James Blackburn CLA 2011-01-21 13:50:49 EST
Eclipse EGit (Incubation)	0.11.0.201101211042	org.eclipse.egit.feature.group
  Eclipse EGit - Source (Incubation)	0.11.0.201101211042	org.eclipse.egit.source.feature.group
  Eclipse JGit (Incubation)	0.11.0.201101211040	org.eclipse.jgit.feature.group
  Eclipse JGit - Source (Incubation)	0.11.0.201101211040	org.eclipse.jgit.source.feature.group

I tried to start a synchronize, and the UI locked up:

I eventually gave up waiting and killed Eclipse.

"main" prio=6 tid=0000000013000800 nid=0xa07c7540 runnable [00000000bfffd000]
   java.lang.Thread.State: RUNNABLE
	at java.io.UnixFileSystem.list(Native Method)
	at java.io.File.list(File.java:973)
	at java.io.File.listFiles(File.java:1051)
	at org.eclipse.jgit.treewalk.FileTreeIterator.entries(FileTreeIterator.java:137)
	at org.eclipse.jgit.treewalk.FileTreeIterator.<init>(FileTreeIterator.java:127)
	at org.eclipse.jgit.treewalk.FileTreeIterator.createSubtreeIterator(FileTreeIterator.java:133)
	at org.eclipse.jgit.treewalk.AbstractTreeIterator.createSubtreeIterator(AbstractTreeIterator.java:499)
	at org.eclipse.jgit.treewalk.TreeWalk.enterSubtree(TreeWalk.java:893)
	at org.eclipse.jgit.treewalk.TreeWalk.next(TreeWalk.java:559)
	at org.eclipse.egit.ui.internal.synchronize.model.GitModelCache.getChildrenImpl(GitModelCache.java:126)
	at org.eclipse.egit.ui.internal.synchronize.model.GitModelObjectContainer.getChildren(GitModelObjectContainer.java:111)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitContainerMapping.<init>(GitContainerMapping.java:39)
	at org.eclipse.egit.ui.internal.synchronize.mapping.GitObjectMapping.create(GitObjectMapping.java:38)
	at org.eclipse.egit.ui.internal.factories.GitAdapterFactory.getAdapter(GitAdapterFactory.java:56)
	at org.eclipse.core.internal.adapter.AdapterFactoryProxy.getAdapter(AdapterFactoryProxy.java:80)
	at org.eclipse.core.internal.runtime.AdapterManager.getAdapter(AdapterManager.java:295)
	at org.eclipse.core.runtime.PlatformObject.getAdapter(PlatformObject.java:66)
	at org.eclipse.team.internal.ui.Utils.getResourceMapping(Utils.java:964)
	at org.eclipse.team.ui.mapping.SynchronizationContentProvider.isInScope(SynchronizationContentProvider.java:639)
	at org.eclipse.team.ui.mapping.SynchronizationContentProvider.getChildrenInScope(SynchronizationContentProvider.java:482)
	at org.eclipse.team.ui.mapping.SynchronizationContentProvider.getChildrenInContext(SynchronizationContentProvider.java:503)
	at org.eclipse.team.ui.mapping.SynchronizationContentProvider.internalGetChildren(SynchronizationContentProvider.java:131)
	at org.eclipse.team.ui.mapping.SynchronizationContentProvider.getElements(SynchronizationContentProvider.java:56)
	at org.eclipse.ui.internal.navigator.extensions.SafeDelegateTreeContentProvider.getElements(SafeDelegateTreeContentProvider.java:101)
	at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider$1.run(NavigatorContentServiceContentProvider.java:147)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.internalGetChildren(NavigatorContentServiceContentProvider.java:137)
	at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.getElements(NavigatorContentServiceContentProvider.java:112)
	at org.eclipse.jface.viewers.StructuredViewer.getRawChildren(StructuredViewer.java:989)
	at org.eclipse.jface.viewers.ColumnViewer.getRawChildren(ColumnViewer.java:703)
	at org.eclipse.jface.viewers.AbstractTreeViewer.getRawChildren(AbstractTreeViewer.java:1332)
	at org.eclipse.jface.viewers.TreeViewer.getRawChildren(TreeViewer.java:391)
	at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren(StructuredViewer.java:896)
	at org.eclipse.jface.viewers.AbstractTreeViewer.getSortedChildren(AbstractTreeViewer.java:601)
	at org.eclipse.jface.viewers.AbstractTreeViewer$1.run(AbstractTreeViewer.java:801)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:778)
	at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:644)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:749)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalInitializeTree(AbstractTreeViewer.java:1492)
	at org.eclipse.jface.viewers.TreeViewer.internalInitializeTree(TreeViewer.java:833)
	at org.eclipse.jface.viewers.AbstractTreeViewer$5.run(AbstractTreeViewer.java:1476)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1422)
	at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:403)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1383)
	at org.eclipse.jface.viewers.AbstractTreeViewer.inputChanged(AbstractTreeViewer.java:1469)
	at org.eclipse.team.internal.ui.mapping.CommonViewerAdvisor$NavigableCommonViewer.inputChanged(CommonViewerAdvisor.java:84)
	at org.eclipse.jface.viewers.ContentViewer.setInput(ContentViewer.java:280)
	at org.eclipse.jface.viewers.StructuredViewer.setInput(StructuredViewer.java:1669)
	at org.eclipse.team.internal.ui.mapping.CommonViewerAdvisor.setInitialInput(CommonViewerAdvisor.java:359)
	at org.eclipse.team.internal.ui.synchronize.AbstractSynchronizePage.createChangesViewer(AbstractSynchronizePage.java:132)
	at org.eclipse.team.internal.ui.synchronize.AbstractSynchronizePage.createControl(AbstractSynchronizePage.java:113)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.doCreatePage(SynchronizeView.java:246)
	at org.eclipse.ui.part.PageBookView.createPage(PageBookView.java:408)
	at org.eclipse.ui.part.PageBookView.partActivated(PageBookView.java:751)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView.display(SynchronizeView.java:449)
	at org.eclipse.team.internal.ui.synchronize.SynchronizeView$6.run(SynchronizeView.java:361)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
	- locked <0000000016a1eff0> (a org.eclipse.swt.widgets.RunnableLock)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3765)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3456)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
	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:369)
	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:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	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)

"VM Thread" prio=9 tid=000000001409fc00 nid=0xb062d000 runnable
Comment 1 James Blackburn CLA 2011-02-22 05:48:28 EST
Still seeing UI lockups when starting synchronize in 0.11.3:


"main" prio=10 tid=0x0000000040115000 nid=0x4155 runnable [0x0000000040227000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(Native Method)
        at java.io.FileInputStream.read(FileInputStream.java:177)
        at org.eclipse.jgit.treewalk.WorkingTreeIterator.computeHash(WorkingTreeIterator.java:753)
        at org.eclipse.jgit.treewalk.WorkingTreeIterator.idBufferBlob(WorkingTreeIterator.java:262)
        at org.eclipse.jgit.treewalk.WorkingTreeIterator.idBuffer(WorkingTreeIterator.java:232)
        at org.eclipse.jgit.treewalk.AbstractTreeIterator.getEntryObjectId(AbstractTreeIterator.java:399)
        at org.eclipse.jgit.treewalk.WorkingTreeIterator.contentCheck(WorkingTreeIterator.java:696)
        at org.eclipse.jgit.treewalk.WorkingTreeIterator.isModified(WorkingTreeIterator.java:668)
        at org.eclipse.jgit.treewalk.filter.IndexDiffFilter.include(IndexDiffFilter.java:171)
        at org.eclipse.jgit.treewalk.TreeWalk.next(TreeWalk.java:553)
        at org.eclipse.egit.ui.internal.synchronize.model.GitModelCache.getChildrenImpl(GitModelCache.java:125)
        at org.eclipse.egit.ui.internal.synchronize.model.GitModelObjectContainer.getChildren(GitModelObjectContainer.java:115)
        at org.eclipse.egit.ui.internal.synchronize.model.GitModelRepository.getChildrenImpl(GitModelRepository.java:159)
        at org.eclipse.egit.ui.internal.synchronize.model.GitModelRepository.getChildren(GitModelRepository.java:73)
        at org.eclipse.egit.ui.internal.synchronize.model.GitModelRoot.getChildrenImpl(GitModelRoot.java:59)
        at org.eclipse.egit.ui.internal.synchronize.model.GitModelRoot.getChildren(GitModelRoot.java:47)
        at org.eclipse.egit.ui.internal.synchronize.mapping.GitModelWorkbenchAdapter.getChildren(GitModelWorkbenchAdapter.java:29)
        at org.eclipse.ui.model.BaseWorkbenchContentProvider.getChildren(BaseWorkbenchContentProvider.java:64)
        at org.eclipse.ui.model.BaseWorkbenchContentProvider.getElements(BaseWorkbenchContentProvider.java:73)
        at org.eclipse.team.ui.mapping.SynchronizationContentProvider.getDelegateChildren(SynchronizationContentProvider.java:176)
        at org.eclipse.team.ui.mapping.SynchronizationContentProvider.internalGetChildren(SynchronizationContentProvider.java:121)
        at org.eclipse.team.ui.mapping.SynchronizationContentProvider.getElements(SynchronizationContentProvider.java:56)
        at org.eclipse.ui.internal.navigator.extensions.SafeDelegateTreeContentProvider.getElements(SafeDelegateTreeContentProvider.java:101)
Comment 2 Robert Munteanu CLA 2011-06-09 16:35:01 EDT
Without trying to get a stack trace, starting the sync process does cause the UI to freeze for a couple of seconds in 1.0 as well.