Bug 460220 - org.eclipse.egit.ui.internal.GitLabels.getStyledLabel depends on IO operations, which can hang the UI
Summary: org.eclipse.egit.ui.internal.GitLabels.getStyledLabel depends on IO operation...
Status: NEW
Alias: None
Product: EGit
Classification: Technology
Component: UI (show other bugs)
Version: 3.7   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-02-18 06:31 EST by EPP Error Reports CLA
Modified: 2015-02-18 06:59 EST (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 EPP Error Reports CLA 2015-02-18 06:31:10 EST
The following incident was reported via the automated error reporting:


    code:                   0
    plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
    message:                UI freeze of 1.2s at 13:55:30.215
    fingerprint:            71d07086
    exception class:        org.eclipse.recommenders.internal.stacktraces.rcp.StandInStacktraceProvider$StandInException
    exception message:      Stand-In Stacktrace supplied by Eclipse Stacktraces & Error Reporting Tool
    number of children:     2
    
    org.eclipse.recommenders.internal.stacktraces.rcp.StandInStacktraceProvider$StandInException: Stand-In Stacktrace supplied by Eclipse Stacktraces & Error Reporting Tool
    at org.eclipse.ui.internal.monitoring.DefaultUiFreezeEventLogger.log(DefaultUiFreezeEventLogger.java:94)
    at org.eclipse.ui.internal.monitoring.EventLoopMonitorThread.logEvent(EventLoopMonitorThread.java:794)
    at org.eclipse.ui.internal.monitoring.EventLoopMonitorThread.run(EventLoopMonitorThread.java:646)
   

---   

      code:                   0
      plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
      message:                Sample at 13:55:31.265 (+1.050s)
Thread 'main' tid=1 (RUNNABLE) [8 child-status duplicates removed by Error Reporting] [7 child-status duplicates removed by Error Reporting]
      fingerprint:            40eb6ffa
      exception class:        java.lang.Exception
      exception message:      Stack Trace
      number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Throwable.fillInStackTrace(Throwable.java:-2)
    at java.lang.Throwable.fillInStackTrace(Throwable.java:783)
    at java.lang.Throwable.<init>(Throwable.java:265)
    at java.lang.Exception.<init>(Exception.java:66)
    at java.io.IOException.<init>(IOException.java:58)
    at java.io.FileNotFoundException.<init>(FileNotFoundException.java:77)
    at java.io.FileInputStream.open(FileInputStream.java:-2)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at org.eclipse.jgit.util.IO.readSome(IO.java:100)
    at org.eclipse.jgit.internal.storage.file.RefDirectory.scanRef(RefDirectory.java:903)
    at org.eclipse.jgit.internal.storage.file.RefDirectory.readRef(RefDirectory.java:872)
    at org.eclipse.jgit.internal.storage.file.RefDirectory.getRef(RefDirectory.java:265)
    at org.eclipse.jgit.lib.Repository.getRef(Repository.java:911)
    at org.eclipse.jgit.lib.Repository.resolve(Repository.java:707)
    at org.eclipse.jgit.lib.Repository.resolve(Repository.java:384)
    at org.eclipse.egit.core.RepositoryUtil.mapCommitToRef(RepositoryUtil.java:169)
    at org.eclipse.egit.core.RepositoryUtil.getShortBranch(RepositoryUtil.java:446)
    at org.eclipse.egit.ui.internal.GitLabels.getStyledLabel(GitLabels.java:101)
    at org.eclipse.egit.ui.internal.GitLabels.getStyledLabelSafe(GitLabels.java:143)
    at org.eclipse.egit.ui.internal.staging.StagingView$47.run(StagingView.java:2283)
    at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:187)
    at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:145)
    at org.eclipse.swt.widgets.Display.syncExec(Display.java:4634)
    at org.eclipse.egit.ui.internal.staging.StagingView.syncExec(StagingView.java:2622)
    at org.eclipse.egit.ui.internal.staging.StagingView.reload(StagingView.java:2220)
    at org.eclipse.egit.ui.internal.commands.shared.AbstractRebaseCommandHandler$1$2.run(AbstractRebaseCommandHandler.java:159)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3793)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3431)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:648)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:592)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
   

---   

      code:                   0
      plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
      message:                Sample at 13:55:31.333 (+0.068s)
Thread 'main' tid=1 (RUNNABLE) [8 child-status duplicates removed by Error Reporting]
      fingerprint:            82924eb8
      exception class:        java.lang.Exception
      exception message:      Stack Trace
      number of children:     7
    
    java.lang.Exception: Stack Trace
    at java.io.FileInputStream.open(FileInputStream.java:-2)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at org.eclipse.jgit.util.IO.readSome(IO.java:100)
    at org.eclipse.jgit.internal.storage.file.RefDirectory.scanRef(RefDirectory.java:903)
    at org.eclipse.jgit.internal.storage.file.RefDirectory.readRef(RefDirectory.java:872)
    at org.eclipse.jgit.internal.storage.file.RefDirectory.getRef(RefDirectory.java:265)
    at org.eclipse.jgit.lib.Repository.getRef(Repository.java:911)
    at org.eclipse.jgit.lib.Repository.resolve(Repository.java:386)
    at org.eclipse.egit.core.RepositoryUtil.mapCommitToRef(RepositoryUtil.java:169)
    at org.eclipse.egit.core.RepositoryUtil.getShortBranch(RepositoryUtil.java:446)
    at org.eclipse.egit.ui.internal.GitLabels.getStyledLabel(GitLabels.java:101)
    at org.eclipse.egit.ui.internal.GitLabels.getStyledLabelSafe(GitLabels.java:143)
    at org.eclipse.egit.ui.internal.staging.StagingView$47.run(StagingView.java:2283)
    at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:187)
    at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:145)
    at org.eclipse.swt.widgets.Display.syncExec(Display.java:4634)
    at org.eclipse.egit.ui.internal.staging.StagingView.syncExec(StagingView.java:2622)
    at org.eclipse.egit.ui.internal.staging.StagingView.reload(StagingView.java:2220)
    at org.eclipse.egit.ui.internal.commands.shared.AbstractRebaseCommandHandler$1$2.run(AbstractRebaseCommandHandler.java:159)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3793)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3431)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:648)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:592)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'Thread-5' tid=44 (TIMED_WAITING)
        fingerprint:            ae0778db
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Thread.sleep(Thread.java:-2)
    at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker$UpdateCheckThread.run(UpdateChecker.java:68)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'Worker-9' tid=40 (TIMED_WAITING)
Waiting for: org.eclipse.ui.internal.Semaphore@3255fa90
Holding: java.util.concurrent.locks.ReentrantLock$FairSync@65c8e685
        fingerprint:            b96da159
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Object.wait(Object.java:-2)
    at org.eclipse.ui.internal.Semaphore.acquire(Semaphore.java:43)
    at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:164)
    at org.eclipse.swt.widgets.Display.syncExec(Display.java:4634)
    at org.eclipse.egit.ui.internal.staging.StagingView.syncExec(StagingView.java:2622)
    at org.eclipse.egit.ui.internal.staging.StagingView.reload(StagingView.java:2220)
    at org.eclipse.egit.ui.internal.staging.StagingView$2.indexDiffChanged(StagingView.java:429)
    at org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry.notifyListeners(IndexDiffCacheEntry.java:520)
    at org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry.access$9(IndexDiffCacheEntry.java:512)
    at org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry$4.run(IndexDiffCacheEntry.java:308)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'Java indexing' tid=29 (WAITING)
Waiting for: org.eclipse.jdt.internal.core.search.indexing.IndexManager@23a62d1d
        fingerprint:            7c705654
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Object.wait(Object.java:-2)
    at java.lang.Object.wait(Object.java:502)
    at org.eclipse.jdt.internal.core.search.processing.JobManager.run(JobManager.java:382)
    at java.lang.Thread.run(Thread.java:745)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'Worker-3' tid=28 (TIMED_WAITING)
Waiting for: org.eclipse.ui.internal.Semaphore@6617dbe5
        fingerprint:            6226ca41
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Object.wait(Object.java:-2)
    at org.eclipse.ui.internal.Semaphore.acquire(Semaphore.java:43)
    at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:164)
    at org.eclipse.swt.widgets.Display.syncExec(Display.java:4634)
    at org.eclipse.egit.ui.internal.commit.CommitEditorPage$7.run(CommitEditorPage.java:545)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'EMF Reference Cleaner' tid=19 (WAITING)
Waiting for: java.lang.ref.ReferenceQueue$Lock@1cebf4ce
        fingerprint:            25fbd6cf
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Object.wait(Object.java:-2)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:158)
    at org.eclipse.emf.common.util.CommonUtil$1ReferenceClearingQueuePollingThread.run(CommonUtil.java:70)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'Worker-JM' tid=18 (WAITING)
Waiting for: java.util.ArrayList@0eb7fc8b
        fingerprint:            71d460f9
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Object.wait(Object.java:-2)
    at org.eclipse.core.internal.jobs.InternalWorker.run(InternalWorker.java:59)
   

---   

        code:                   0
        plugin:                 org.eclipse.ui.monitoring_1.0.0.v20150124-1836
        message:                Thread 'org.eclipse.jdt.internal.ui.text.JavaReconciler' tid=180 (TIMED_WAITING)
Waiting for: org.eclipse.jface.text.reconciler.DirtyRegionQueue@4b72d6dd
        fingerprint:            aef3c7d6
        exception class:        java.lang.Exception
        exception message:      Stack Trace
        number of children:     0
    
    java.lang.Exception: Stack Trace
    at java.lang.Object.wait(Object.java:-2)
    at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:179)
   
  

General Information:

    reported-by:      Andrey Loskutov
    anonymous-id:     4abd2da0-a327-4475-a072-9c8e64dc6017
    eclipse-build-id: 4.5.0.I20150203-1300
    eclipse-product:  org.eclipse.epp.package.committers.product
    operating system: Linux 3.18.6.fc21 (x86_64) - gtk
    jre-version:      1.8.0_31-b13

The following plug-ins were present on the execution stack (*):
    1. org.eclipse.core.databinding.observable_1.4.1.v20140910-2107
    2. org.eclipse.core.databinding_1.4.100.v20141002-1314
    3. org.eclipse.core.jobs_3.7.0.v20150115-2226
    4. org.eclipse.core.runtime_3.10.0.v20150112-1422
    5. org.eclipse.e4.ui.workbench_1.3.0.v20150113-2327
    6. org.eclipse.e4.ui.workbench.swt_0.12.100.v20150114-0905
    7. org.eclipse.egit.core_3.7.0.201502031740-rc1
    8. org.eclipse.egit_3.7.0.201502031740-rc1
    9. org.eclipse.egit.ui_3.7.0.201502031740-rc1
    10. org.eclipse.emf.common_2.10.0.v20140514-1158
    11. org.eclipse.emf_2.6.0.v20140519-0339
    12. org.eclipse.equinox.app_1.3.200.v20130910-1609
    13. org.eclipse.equinox.launcher_1.3.0.v20140415-2008
    14. org.eclipse.equinox.p2.updatechecker_1.1.200.v20131119-0908
    15. org.eclipse.jdt.core_3.11.0.v20150126-2015
    16. org.eclipse.jdt_3.11.0.v20150203-1300
    17. org.eclipse.jface.text_3.10.0.v20150112-1146
    18. org.eclipse.jface_3.11.0.v20150121-1751
    19. org.eclipse.jgit_3.7.0.201502031740-rc1
    20. org.eclipse.swt_3.104.0.v20150203-2243
    21. org.eclipse.ui_3.107.0.v20150107-0903
    22. org.eclipse.ui.ide.application_1.0.600.v20150120-1542
    23. org.eclipse.ui.ide_3.10.100.v20150126-1117
    24. org.eclipse.ui.monitoring_1.0.0.v20150124-1836

Please note that:
* Messages, stacktraces, and nested status objects may be shortened.
* Bug fields like status, resolution, and whiteboard are sent
  back to reporters.
* The list of present bundles and their respective versions was
  calculated by package naming heuristics. This may or may not reflect reality.
  
Please visit http://goo.gl/MWFSff for further details. 


Thank you for your assistance.
Your friendly error-reports-inbox.
Comment 1 Alex Blewitt CLA 2015-02-18 06:34:19 EST
This looks like the call at https://github.com/eclipse/egit/blob/d93dd63d247f0d80de7dabef06a0a05e52a1f2b8/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitLabels.java#L101 is trying to resolve the string to use in the UI whilst resolving files on disk. Delays in IO will cause display errors in the UI. Ideally having some kind of asynchronous callback to update the style string when it's requested would be a way to avoid this problem.
Comment 2 Andrey Loskutov CLA 2015-02-18 06:59:09 EST
StagingView should never call any low level API from UI thread.

In this case the code below must be split and moved to a job + task to update widget:

form.setText(GitLabels.getStyledLabelSafe(repository).toString());

=>

// job to compute + Display.asyncExec() to update
computeAndUpdateRepoLabel(repo);