Community
Participate
Working Groups
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.
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
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)
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.
Created attachment 6754 [details] Patch with proposed fix to WorkspaceModifyOperation Since this requires new API it would be nice to get into M5.
Created attachment 6766 [details] Source file
Released Johns patch. Moving to Text so that they can take advantage of it.
We use WorkspaceModifyDelegatingOperation which extends WorkspaceModifyOperation . In order to migrate we would need to get WorkspaceModifyDelegatingOperation beefed up as well.
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)?
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).
Dani, what's the exception you're getting ? Are you suggesting that JDT Core should not use IWorkspace.run(IWorkspaceRunnable, IProgressMonitor) ?
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
Need to change all the Java model operations to pass in a proper ISchedulingRule. Estimate 1 to 2 weeks of work.
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).
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.
According to the Responsive UI porting guide, Java model operation that create/modify/delete a resource should lock the parent's resource.
*** Bug 46945 has been marked as a duplicate of this bug. ***
Entered bug 49561 for the JDT Core part.
Bug 49561 is now fixed. Moving to JDT Text to implement the UI part.
Jerome, we also have a request for Java elements implement ISchedulingRule, could this be unified ? An operation could use the target element rule ?
Adapted to J Core changes. Now using fine grained rule upon save. Available in builds > 20040126