Bug 46332 - [Jobs] UI no longer responsive after pressing ctrl-S
Summary: [Jobs] UI no longer responsive after pressing ctrl-S
Status: RESOLVED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Text (show other bugs)
Version: 3.0   Edit
Hardware: PC Windows 2000
: P2 normal (vote)
Target Milestone: 3.0 M7   Edit
Assignee: Dani Megert CLA
QA Contact:
URL:
Whiteboard:
Keywords:
: 46945 (view as bug list)
Depends on:
Blocks:
 
Reported: 2003-11-10 05:26 EST by Philipe Mulet CLA
Modified: 2004-01-26 13:13 EST (History)
4 users (show)

See Also:


Attachments
Patch with proposed fix to WorkspaceModifyOperation (2.72 KB, patch)
2003-11-12 16:40 EST, John Arthorne CLA
no flags Details | Diff
Source file (4.45 KB, text/plain)
2003-11-13 12:11 EST, John Arthorne CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Philipe Mulet CLA 2003-11-10 05:26:45 EST
Build 20031023

While tagging JDT Core projects as versions (in background), I went to modify 
my map file accordingly in parallel. As soon as pressed ctrl-S to save my 
edited map file, the busy cursor appeared and I couldn't do anything any 
longer; though this change has nothing to do with what is being tagged at the 
same time.

Furthermore, there is no explanation as to why my save action locked me until 
the tagging was completed.
Comment 1 Philipe Mulet CLA 2003-11-10 05:27:37 EST
Full thread dump Java HotSpot(TM) Client VM (1.4.1_01-b01 mixed mode):

"TimeoutOutputStream" daemon prio=5 tid=0x17F78C00 nid=0x774 runnable 
[1931f000..1931fd88]
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.BufferedOutputStream.flushBuffer
(BufferedOutputStream.java:69)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:127)
        - locked <030F2090> (a java.io.BufferedOutputStream)
        at 
org.eclipse.team.internal.core.streams.TimeoutOutputStream.writeUntilDone
(TimeoutOutputStream.java:272)
        at org.eclipse.team.internal.core.streams.TimeoutOutputStream.runThread
(TimeoutOutputStream.java:195)
        at org.eclipse.team.internal.core.streams.TimeoutOutputStream.access$0
(TimeoutOutputStream.java:193)
        at org.eclipse.team.internal.core.streams.TimeoutOutputStream$1.run
(TimeoutOutputStream.java:66)
        at java.lang.Thread.run(Thread.java:536)

"Worker-10" prio=5 tid=0x16E74E80 nid=0x7c0 in Object.wait() 
[191bf000..191bfd88]
        at java.lang.Object.wait(Native Method)
        - waiting on <03DFBA40> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:155)
        - locked <03DFBA40> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.startJob
(WorkerPool.java:181)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

"Worker-9" prio=5 tid=0x171EE210 nid=0x794 in Object.wait() [18f1f000..18f1fd88]
        at java.lang.Object.wait(Native Method)
        - waiting on <03DFBA40> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:155)
        - locked <03DFBA40> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.startJob
(WorkerPool.java:181)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

"Worker-8" prio=5 tid=0x16ED4888 nid=0x128 waiting on condition 
[18edf000..18edfd88]
        at java.lang.Thread.sleep(Native Method)
        at org.eclipse.ui.internal.progress.AnimationManager.animateLoop
(AnimationManager.java:318)
        at org.eclipse.ui.internal.progress.AnimationManager$3.run
(AnimationManager.java:467)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:62)

"Worker-6" prio=5 tid=0x17FE40F8 nid=0x3dc in Object.wait() [18e7f000..18e7fd88]
        at java.lang.Object.wait(Native Method)
        at org.eclipse.team.internal.core.streams.TimeoutOutputStream.syncCommit
(TimeoutOutputStream.java:170)
        at org.eclipse.team.internal.core.streams.TimeoutOutputStream.flush
(TimeoutOutputStream.java:151)
        - locked <030F20A8> (a 
org.eclipse.team.internal.core.streams.TimeoutOutputStream)
        at org.eclipse.team.internal.core.streams.PollingOutputStream.flush
(PollingOutputStream.java:120)
        at org.eclipse.team.internal.ccvs.core.connection.Connection.write
(Connection.java:225)
        at org.eclipse.team.internal.ccvs.core.connection.Connection.writeLine
(Connection.java:202)
        at org.eclipse.team.internal.ccvs.core.client.Session.sendEntry
(Session.java:679)
        at 
org.eclipse.team.internal.ccvs.core.client.AbstractStructureVisitor.sendFile
(AbstractStructureVisitor.java:173)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.visitFile
(FileStructureVisitor.java:47)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFile.accept
(EclipseFile.java:166)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.sendFiles
(FileStructureVisitor.java:113)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.visitFolder
(FileStructureVisitor.java:74)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFolder.accept
(EclipseFolder.java:149)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.sendManagedFolde
rs(FileStructureVisitor.java:87)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.visitFolder
(FileStructureVisitor.java:76)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFolder.accept
(EclipseFolder.java:149)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.sendManagedFolde
rs(FileStructureVisitor.java:87)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.visitFolder
(FileStructureVisitor.java:76)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFolder.accept
(EclipseFolder.java:149)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.sendManagedFolde
rs(FileStructureVisitor.java:87)
        at 
org.eclipse.team.internal.ccvs.core.client.FileStructureVisitor.visitFolder
(FileStructureVisitor.java:76)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFolder.accept
(EclipseFolder.java:149)
        at 
org.eclipse.team.internal.ccvs.core.client.AbstractStructureVisitor.visit
(AbstractStructureVisitor.java:255)
        at org.eclipse.team.internal.ccvs.core.client.Tag.sendLocalResourceState
(Tag.java:103)
        at org.eclipse.team.internal.ccvs.core.client.Command.doExecute
(Command.java:390)
        at org.eclipse.team.internal.ccvs.core.client.Command$1.run
(Command.java:335)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseSynchronizer.run
(EclipseSynchronizer.java:1379)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFolder$3.run
(EclipseFolder.java:300)
        at org.eclipse.core.internal.resources.Workspace.run
(Workspace.java:1555)
        at org.eclipse.team.internal.ccvs.core.resources.EclipseFolder.run
(EclipseFolder.java:297)
        at org.eclipse.team.internal.ccvs.core.client.Command.execute
(Command.java:346)
        at org.eclipse.team.internal.ccvs.core.client.Tag.execute(Tag.java:79)
        at org.eclipse.team.internal.ccvs.ui.operations.TagOperation.tag
(TagOperation.java:93)
        at org.eclipse.team.internal.ccvs.ui.operations.TagOperation.execute
(TagOperation.java:52)
        at 
org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation.execute
(RepositoryProviderOperation.java:63)
        at org.eclipse.team.internal.ccvs.ui.operations.CVSOperation.run
(CVSOperation.java:128)
        at 
org.eclipse.team.internal.ccvs.ui.operations.CVSNonblockingRunnableContext.run
(CVSNonblockingRunnableContext.java:47)
        at 
org.eclipse.team.internal.ccvs.ui.operations.CVSNonblockingRunnableContext$2.run
InWorkspace(CVSNonblockingRunnableContext.java:67)
        at org.eclipse.core.internal.resources.InternalWorkspaceJob.run
(InternalWorkspaceJob.java:37)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:62)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=2 tid=0x17208D18 
nid=0x394 runnable [17bff000..17bffd88]
        at java.lang.Object.wait(Native Method)
        - waiting on <04FE7928> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)
        at 
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run
(AbstractReconciler.java:161)
        - locked <04FE7928> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"Java indexing" daemon prio=4 tid=0x16DB6B98 nid=0x538 in Object.wait() 
[17b5f000..17b5fd88]
        at java.lang.Object.wait(Native Method)
        - waiting on <04E04280> (a 
org.eclipse.jdt.internal.core.search.indexing.IndexManager)
        at java.lang.Object.wait(Object.java:426)
        at org.eclipse.jdt.internal.core.search.processing.JobManager.run
(JobManager.java:331)
        - locked <04E04280> (a 
org.eclipse.jdt.internal.core.search.indexing.IndexManager)
        at java.lang.Thread.run(Thread.java:536)

"Signal Dispatcher" daemon prio=10 tid=0x008B31E0 nid=0x57c waiting on 
condition [0..0]

"Finalizer" daemon prio=9 tid=0x008B3FD0 nid=0x6e4 in Object.wait() 
[16c0f000..16c0fd88]
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
        - locked <03DA0138> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x008E6470 nid=0x42c in Object.wait() 
[16bcf000..16bcfd88]
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:426)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:113)
        - locked <03DA01A0> (a java.lang.ref.Reference$Lock)

"main" prio=7 tid=0x00234F08 nid=0x6f0 runnable [6e000..6fc40]
        at java.lang.Object.wait(Native Method)
        - waiting on <0310FC88> (a 
org.eclipse.core.internal.jobs.ImplicitJobs$ThreadJob)
        at org.eclipse.core.internal.jobs.ImplicitJobs$ThreadJob.joinRun
(ImplicitJobs.java:68)
        - locked <0310FC88> (a 
org.eclipse.core.internal.jobs.ImplicitJobs$ThreadJob)
        at org.eclipse.core.internal.jobs.ImplicitJobs.begin
(ImplicitJobs.java:198)
        at org.eclipse.core.internal.jobs.JobManager.beginRule
(JobManager.java:113)
        at org.eclipse.core.internal.resources.WorkManager.checkIn
(WorkManager.java:94)
        at org.eclipse.core.internal.resources.Workspace.prepareOperation
(Workspace.java:1520)
        at org.eclipse.core.internal.resources.Workspace.run
(Workspace.java:1552)
        at org.eclipse.core.internal.resources.Workspace.run
(Workspace.java:1572)
        at org.eclipse.ui.actions.WorkspaceModifyOperation.run
(WorkspaceModifyOperation.java:85)
        - locked <02A573A8> (a org.eclipse.ui.texteditor.AbstractTextEditor$18)
        at org.eclipse.ui.texteditor.AbstractTextEditor.performSaveOperation
(AbstractTextEditor.java:3190)
        at org.eclipse.ui.texteditor.AbstractTextEditor.doSave
(AbstractTextEditor.java:2970)
        at org.eclipse.ui.editors.text.TextEditor.doSave(TextEditor.java:129)
        at org.eclipse.ui.internal.EditorManager$11.run(EditorManager.java:1090)
        at org.eclipse.ui.internal.EditorManager$8.run(EditorManager.java:960)
        at org.eclipse.jface.operation.ModalContext.runInCurrentThread
(ModalContext.java:302)
        at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:252)
        at org.eclipse.jface.window.ApplicationWindow$1.run
(ApplicationWindow.java:444)
        at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:84)
        at org.eclipse.jface.window.ApplicationWindow.run
(ApplicationWindow.java:441)
        at org.eclipse.ui.internal.WorkbenchWindow.run
(WorkbenchWindow.java:1604)
        at org.eclipse.ui.internal.EditorManager.runProgressMonitorOperation
(EditorManager.java:966)
        at org.eclipse.ui.internal.EditorManager.savePart
(EditorManager.java:1095)
        at org.eclipse.ui.internal.WorkbenchPage.savePart
(WorkbenchPage.java:2381)
        at org.eclipse.ui.internal.WorkbenchPage.saveEditor
(WorkbenchPage.java:2393)
        at org.eclipse.ui.internal.SaveAction.run(SaveAction.java:57)
        at org.eclipse.jface.action.Action.runWithEvent(Action.java:842)
        at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection
(ActionContributionItem.java:547)
        at org.eclipse.jface.action.ActionContributionItem.access$4
(ActionContributionItem.java:494)
        at org.eclipse.jface.action.ActionContributionItem$6.handleEvent
(ActionContributionItem.java:466)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:847)
        at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2173)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1863)
        at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1579)
        at org.eclipse.ui.internal.Workbench.run(Workbench.java:1562)
        at org.eclipse.core.internal.boot.InternalBootLoader.run
(InternalBootLoader.java:858)
        at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461)
        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:324)
        at org.eclipse.core.launcher.Main.basicRun(Main.java:299)
        at org.eclipse.core.launcher.Main.run(Main.java:765)
        at org.eclipse.core.launcher.Main.main(Main.java:599)

"VM Thread" prio=5 tid=0x008E5B08 nid=0x3ec runnable

"VM Periodic Task Thread" prio=10 tid=0x00900668 nid=0x4d8 waiting on condition
"Suspend Checker Thread" prio=10 tid=0x009066C0 nid=0x64c runnable



Comment 2 Tod Creasey CLA 2003-11-10 11:21:58 EST
The TimeoutOutputStream from the Team support is on two Threads here. Moving 
to Team to investgate.

"Worker-6" prio=5 tid=0x17FE40F8 nid=0x3dc in Object.wait() 
[18e7f000..18e7fd88]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.team.internal.core.streams.TimeoutOutputStream.syncCommit
(TimeoutOutputStream.java:170)
        at org.eclipse.team.internal.core.streams.TimeoutOutputStream.flush
(TimeoutOutputStream.java:151)
        - locked <030F20A8> (a 



"TimeoutOutputStream" daemon prio=5 tid=0x17F78C00 nid=0x774 runnable 
[1931f000..1931fd88]
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.BufferedOutputStream.flushBuffer
(BufferedOutputStream.java:69)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:127)
        - locked <030F2090> (a java.io.BufferedOutputStream)
        at 
org.eclipse.team.internal.core.streams.TimeoutOutputStream.writeUntilDone
(TimeoutOutputStream.java:272)
Comment 3 John Arthorne CLA 2003-11-10 11:47:44 EST
The tag operation is using a fine-grained scheduling rule, but the editor save
operation is trying to lock the entire workspace.  Two things need to happen to
fix this:

1. Need a new variant of WorkspaceModifyOperation.run that takes a scheduling
rule (analagous to the new IWorkspace.run method with scheduling rule).

2. Text infrastructure needs to call new WorkspaceModifyOperation with a
fine-grained rule (the parent of the file being modified).

See bug 46151 for a more detailed discussion.
Comment 4 John Arthorne CLA 2003-11-12 16:40:22 EST
Created attachment 6754 [details]
Patch with proposed fix to WorkspaceModifyOperation

Since this requires new API it would be nice to get into M5.
Comment 5 John Arthorne CLA 2003-11-13 12:11:14 EST
Created attachment 6766 [details]
Source file
Comment 6 Tod Creasey CLA 2003-11-13 12:19:48 EST
Released Johns patch. Moving to Text so that they can take advantage of it.
Comment 7 Dani Megert CLA 2003-11-14 07:10:08 EST
We use WorkspaceModifyDelegatingOperation which extends WorkspaceModifyOperation
. In order to migrate we would need to get WorkspaceModifyDelegatingOperation
beefed up as well.
Comment 8 John Arthorne CLA 2003-11-14 10:00:11 EST
Didn't even think of that!  Tod, can you add the same constructor to
WorkspaceModifyDelegatingOperation that we added to WorkspaceModifyOperation
yesterday (taking a scheduling rule)?
Comment 9 Dani Megert CLA 2003-11-17 14:22:54 EST
We cannot fix this bug without help from J Core: when we specify a scheduling
rule upon save then it will throw an exception because we call J Core methods
(in this case it's commitWorkingCopy) which wants to lock the whole workspace
(see JavaElement.runOperation(...)).

Fixed the places where we have control (i.e. for text documents, validation,
synchronization, reverting).
Comment 10 Jerome Lanneluc CLA 2003-11-18 05:47:45 EST
Dani, what's the exception you're getting ? Are you suggesting that JDT Core 
should not use IWorkspace.run(IWorkspaceRunnable, IProgressMonitor) ?
Comment 11 Dani Megert CLA 2003-11-18 05:59:37 EST
Yes. We cannot acquire a lock which is finer grained than all the client code we
call. When we want to use the parent of the CU as scheduling rule to minimize
jobs  being blocked (waiting for others to finish) then all client code must use
same or finer grained locks otherwise there will be an IllegalArgumentException.

See also
- bug 46151
http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-core-home/documents/plan_concurrency_porting_guide.html
- bug: 46753
Comment 12 Jerome Lanneluc CLA 2003-11-18 07:19:04 EST
Need to change all the Java model operations to pass in a proper 
ISchedulingRule.
Estimate 1 to 2 weeks of work.
Comment 13 Dani Megert CLA 2003-11-18 08:21:39 EST
Do you have that many different scheduling rules? Isn't it the parent of the CU
for most of the operations? You could also do it step by step as we did it: pass
the workspace root per default and then migrate operation per operation. This
would allow you to start with the most important ones (i.e. those like commit
which give long waiting time and block the UI).
Comment 14 Philipe Mulet CLA 2003-11-18 08:56:39 EST
This is the migration story we have planned already. Though in some cases, we 
need to lock multiple resources at once, and it is slightly more tricky.

We will go for the simple ones first. Likely during M6.
Comment 15 Jerome Lanneluc CLA 2003-11-18 12:05:58 EST
According to the Responsive UI porting guide, Java model operation that 
create/modify/delete a resource should lock the parent's resource.
Comment 16 Dani Megert CLA 2003-11-19 06:22:37 EST
*** Bug 46945 has been marked as a duplicate of this bug. ***
Comment 17 Jerome Lanneluc CLA 2004-01-06 06:58:14 EST
Entered bug 49561 for the JDT Core part.
Comment 18 Jerome Lanneluc CLA 2004-01-06 08:34:39 EST
Bug 49561 is now fixed. Moving to JDT Text to implement the UI part.
Comment 19 Philipe Mulet CLA 2004-01-06 08:50:19 EST
Jerome, we also have a request for Java elements implement ISchedulingRule, 
could this be unified ? An operation could use the target element rule ?
Comment 20 Dani Megert CLA 2004-01-26 13:13:05 EST
Adapted to J Core changes. Now using fine grained rule upon save.
Available in builds > 20040126