Bug 310159 - Hang in JavaModel.getExternalTarget(JavaModel.java:333)
Summary: Hang in JavaModel.getExternalTarget(JavaModel.java:333)
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.6   Edit
Hardware: PC Windows XP
: P3 major (vote)
Target Milestone: 3.6 RC1   Edit
Assignee: Jay Arthanareeswaran CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-04-22 13:09 EDT by Remy Suen CLA
Modified: 2010-05-17 12:06 EDT (History)
1 user (show)

See Also:
Olivier_Thomann: review+


Attachments
Thread dump (720.98 KB, text/plain)
2010-04-22 13:09 EDT, Remy Suen CLA
no flags Details
Workspace zip (456.31 KB, application/octet-stream)
2010-04-22 13:30 EDT, Remy Suen CLA
no flags Details
Proposed Fix (5.38 KB, patch)
2010-05-10 13:03 EDT, Jay Arthanareeswaran CLA
no flags Details | Diff
Proposed fix (6.60 KB, patch)
2010-05-10 15:55 EDT, Olivier Thomann CLA
no flags Details | Diff
Updated patch (6.71 KB, patch)
2010-05-11 12:07 EDT, Jay Arthanareeswaran CLA
Olivier_Thomann: review+
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Remy Suen CLA 2010-04-22 13:09:38 EDT
Created attachment 165801 [details]
Thread dump

I'm launching an inner Eclipse from the build #48 4.0 SDK. This happens intermittently. I have a habit of deleting everything in .metadata/.plugins/ except for the org.eclipse.core.resources folder of my target workspace. Maybe this is the cause.

I believe I was expanding my org.eclipse.ui plug-in project from 'Package Explorer' when this happened.
Comment 1 Olivier Thomann CLA 2010-04-22 13:16:22 EDT
Jay, please investigate.
Comment 2 Olivier Thomann CLA 2010-04-22 13:23:58 EDT
The problem comes from Worker-3:

3XMTHREADINFO      "Worker-3" (TID:0x22FC2E00, sys_thread_t:0x21EA6038, state:CW, native ID:0x00000B40) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269(Compiled Code))
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285)
4XESTACKTRACE          at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:117)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1914)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Project.open(Project.java:914)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Project.open(Project.java:984)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ExternalFoldersManager.openExternalFoldersProject(ExternalFoldersManager.java:177)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolders(ExternalFoldersManager.java:237(Compiled Code))
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolder(ExternalFoldersManager.java:226)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333)

The lock on ExternalFoldersManager.getFolder(..) does release the lock before being blocked on a wait.
Comment 3 Remy Suen CLA 2010-04-22 13:30:19 EDT
Created attachment 165810 [details]
Workspace zip

You can try and use this zipped workspace to reproduce the problem.

When I launch my inner it hangs at 30% trying to initialize the Java tooling. It seems once I try to expand one of my Java projects, JDT tries to invoke the same code so the UI thread also ends up hanging on getExternalTarget(IPath, boolean).

2XMFULLTHDDUMP Full thread dump J9 VM (J2RE 5.0 IBM J9 2.3 Windows XP x86-32 build 20090706_38445_lHdSMr, native threads):
3XMTHREADINFO      "main" (TID:0x210A4E00, sys_thread_t:0x00376B80, state:CW, native ID:0x00002370) prio=6
4XESTACKTRACE          at org/eclipse/swt/internal/win32/OS.WaitMessage(Native Method)
4XESTACKTRACE          at org/eclipse/swt/widgets/Display.sleep(Display.java:4526(Compiled Code))
4XESTACKTRACE          at org/eclipse/e4/ui/workbench/swt/internal/PartRenderingEngine$5.run(PartRenderingEngine.java:547)
4XESTACKTRACE          at org/eclipse/core/databinding/observable/Realm.runWithDefault(Realm.java:332)
4XESTACKTRACE          at org/eclipse/e4/ui/workbench/swt/internal/PartRenderingEngine.run(PartRenderingEngine.java:477)
4XESTACKTRACE          at org/eclipse/e4/workbench/ui/internal/E4Workbench.createAndRunUI(E4Workbench.java:101)
4XESTACKTRACE          at org/eclipse/ui/internal/Workbench$3.run(Workbench.java:533)
4XESTACKTRACE          at org/eclipse/core/databinding/observable/Realm.runWithDefault(Realm.java:332)
4XESTACKTRACE          at org/eclipse/ui/internal/Workbench.createAndRunWorkbench(Workbench.java:519)
4XESTACKTRACE          at org/eclipse/ui/PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
4XESTACKTRACE          at org/eclipse/ui/internal/ide/application/IDEApplication.start(IDEApplication.java:115)
4XESTACKTRACE          at org/eclipse/equinox/internal/app/EclipseAppHandle.run(EclipseAppHandle.java:196)
4XESTACKTRACE          at org/eclipse/core/runtime/internal/adaptor/EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
4XESTACKTRACE          at org/eclipse/core/runtime/internal/adaptor/EclipseAppLauncher.start(EclipseAppLauncher.java:79)
4XESTACKTRACE          at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:369)
4XESTACKTRACE          at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:179)
4XESTACKTRACE          at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method)
4XESTACKTRACE          at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
4XESTACKTRACE          at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
4XESTACKTRACE          at java/lang/reflect/Method.invoke(Method.java:618)
4XESTACKTRACE          at org/eclipse/equinox/launcher/Main.invokeFramework(Main.java:619)
4XESTACKTRACE          at org/eclipse/equinox/launcher/Main.basicRun(Main.java:574)
4XESTACKTRACE          at org/eclipse/equinox/launcher/Main.run(Main.java:1407)
4XESTACKTRACE          at org/eclipse/equinox/launcher/Main.main(Main.java:1383)
3XMTHREADINFO      "JIT Compilation Thread" (TID:0x210A5200, sys_thread_t:0x00376DD8, state:CW, native ID:0x0000264C) prio=11
3XMTHREADINFO      "Signal Dispatcher" (TID:0x210A5600, sys_thread_t:0x00377288, state:R, native ID:0x00002550) prio=5
4XESTACKTRACE          at com/ibm/misc/SignalDispatcher.waitForSignal(Native Method)
4XESTACKTRACE          at com/ibm/misc/SignalDispatcher.run(SignalDispatcher.java:84)
3XMTHREADINFO      "Gc Slave Thread" (TID:0x21640100, sys_thread_t:0x00377738, state:CW, native ID:0x00000420) prio=5
3XMTHREADINFO      "State Data Manager" (TID:0x21640500, sys_thread_t:0x21B7FF88, state:CW, native ID:0x00001300) prio=5
4XESTACKTRACE          at java/lang/Thread.sleep(Native Method)
4XESTACKTRACE          at java/lang/Thread.sleep(Thread.java:939)
4XESTACKTRACE          at org/eclipse/osgi/internal/baseadaptor/StateManager.run(StateManager.java:319)
4XESTACKTRACE          at java/lang/Thread.run(Thread.java:811)
3XMTHREADINFO      "Start Level Event Dispatcher" (TID:0x21640900, sys_thread_t:0x21B801E0, state:CW, native ID:0x0000260C) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:199)
4XESTACKTRACE          at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.getNextEvent(EventManager.java:397)
4XESTACKTRACE          at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.run(EventManager.java:333)
3XMTHREADINFO      "Framework Event Dispatcher" (TID:0x22060500, sys_thread_t:0x21B80438, state:CW, native ID:0x000026A8) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:199(Compiled Code))
4XESTACKTRACE          at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.getNextEvent(EventManager.java:397(Compiled Code))
4XESTACKTRACE          at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.run(EventManager.java:333)
3XMTHREADINFO      "Bundle File Closer" (TID:0x22060900, sys_thread_t:0x21B80690, state:CW, native ID:0x0000171C) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:199(Compiled Code))
4XESTACKTRACE          at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.getNextEvent(EventManager.java:397(Compiled Code))
4XESTACKTRACE          at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.run(EventManager.java:333)
3XMTHREADINFO      "Worker-JM" (TID:0x22060D00, sys_thread_t:0x21B808E8, state:CW, native ID:0x000027BC) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/InternalWorker.run(InternalWorker.java:58)
3XMTHREADINFO      "[Timer] - Main Queue Handler" (TID:0x22193A00, sys_thread_t:0x21B80B40, state:CW, native ID:0x000016A4) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/equinox/internal/util/impl/tpt/timer/TimerImpl.run(TimerImpl.java:141)
4XESTACKTRACE          at java/lang/Thread.run(Thread.java:811)
3XMTHREADINFO      "[ThreadPool Manager] - Idle Thread" (TID:0x22193E00, sys_thread_t:0x21D65008, state:CW, native ID:0x00000528) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:199)
4XESTACKTRACE          at org/eclipse/equinox/internal/util/impl/tpt/threadpool/Executor.run(Executor.java:106)
3XMTHREADINFO      "Worker-0" (TID:0x22194200, sys_thread_t:0x21D65260, state:B, native ID:0x000017F8) prio=5
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getTarget(JavaModel.java:319)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.getCalledFileNames(ClasspathEntry.java:949)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:920)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:907)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:1447)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2673)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2779)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.getResolvedClasspath(JavaProject.java:1915)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.computeExpandedClasspath(JavaProject.java:485)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.getExpandedClasspath(JavaProject.java:1527)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/builder/NameEnvironment.computeClasspathLocations(NameEnvironment.java:93)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/builder/NameEnvironment.<init>(NameEnvironment.java:41)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/builder/JavaBuilder.initializeBuilder(JavaBuilder.java:603)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/builder/JavaBuilder.build(JavaBuilder.java:167)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager$2.run(BuildManager.java:628)
4XESTACKTRACE          at org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:42)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager.basicBuild(BuildManager.java:171)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager.basicBuild(BuildManager.java:202)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager$1.run(BuildManager.java:254)
4XESTACKTRACE          at org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:42)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager.basicBuild(BuildManager.java:257)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager.basicBuildLoop(BuildManager.java:310)
4XESTACKTRACE          at org/eclipse/core/internal/events/BuildManager.build(BuildManager.java:342)
4XESTACKTRACE          at org/eclipse/core/internal/events/AutoBuildJob.doBuild(AutoBuildJob.java:140)
4XESTACKTRACE          at org/eclipse/core/internal/events/AutoBuildJob.run(AutoBuildJob.java:238)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54)
3XMTHREADINFO      "Worker-1" (TID:0x22CBEE00, sys_thread_t:0x21D654B8, state:CW, native ID:0x00001C14) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285)
4XESTACKTRACE          at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:117)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1914)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Project.open(Project.java:914)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Project.open(Project.java:984)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ExternalFoldersManager.openExternalFoldersProject(ExternalFoldersManager.java:177)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolders(ExternalFoldersManager.java:237)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolder(ExternalFoldersManager.java:226)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getTarget(JavaModel.java:319)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.getCalledFileNames(ClasspathEntry.java:949)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:920)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:907)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:1447)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2673)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2779)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.getResolvedClasspath(JavaProject.java:1915)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ProjectReferenceChange.updateProjectReferencesIfNecessary(ProjectReferenceChange.java:46)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ChangeClasspathOperation.classpathChanged(ChangeClasspathOperation.java:59)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/SetContainerOperation.executeOperation(SetContainerOperation.java:110)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModelOperation.run(JavaModelOperation.java:728)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1975)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModelOperation.runOperation(JavaModelOperation.java:793)
4XESTACKTRACE          at org/eclipse/jdt/core/JavaCore.setClasspathContainer(JavaCore.java:4842)
4XESTACKTRACE          at org/eclipse/jdt/internal/launching/JREContainerInitializer.initialize(JREContainerInitializer.java:69)
4XESTACKTRACE          at org/eclipse/jdt/internal/launching/LaunchingPlugin$VMChanges.rebind(LaunchingPlugin.java:298)
4XESTACKTRACE          at org/eclipse/jdt/internal/launching/LaunchingPlugin$VMChanges.access$0(LaunchingPlugin.java:263)
4XESTACKTRACE          at org/eclipse/jdt/internal/launching/LaunchingPlugin$1.run(LaunchingPlugin.java:251)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/BatchOperation.executeOperation(BatchOperation.java:39)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModelOperation.run(JavaModelOperation.java:728)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1975)
4XESTACKTRACE          at org/eclipse/jdt/core/JavaCore.run(JavaCore.java:4777)
4XESTACKTRACE          at org/eclipse/jdt/internal/launching/LaunchingPlugin$VMChanges.doit(LaunchingPlugin.java:255)
4XESTACKTRACE          at org/eclipse/jdt/internal/launching/LaunchingPlugin$JREUpdateJob.run(LaunchingPlugin.java:335)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54)
3XMTHREADINFO      "Worker-2" (TID:0x22CBF200, sys_thread_t:0x21D65710, state:CW, native ID:0x00002730) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285)
4XESTACKTRACE          at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:117)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1914)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1970)
4XESTACKTRACE          at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1957)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModelManager$19.run(JavaModelManager.java:4722)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54)
3XMTHREADINFO      "Finalizer thread" (TID:0x22CBF600, sys_thread_t:0x21E20D70, state:CW, native ID:0x00002640) prio=5
3XMTHREADINFO      "Java indexing" (TID:0x233A5200, sys_thread_t:0x21D65BC0, state:CW, native ID:0x00002578) prio=4
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:199)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/search/processing/JobManager.run(JobManager.java:381)
4XESTACKTRACE          at java/lang/Thread.run(Thread.java:811)
3XMTHREADINFO      "StackTrace Remote Thread" (TID:0x233A5A00, sys_thread_t:0x21E216D0, state:R, native ID:0x00002544) prio=10
4XESTACKTRACE          at com/ibm/jvm/Dump.JavaDump(Native Method)
3XMTHREADINFO      "Worker-4" (TID:0x24A8C000, sys_thread_t:0x21E21220, state:CW, native ID:0x00002678) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285)
4XESTACKTRACE          at org/eclipse/core/internal/utils/StringPoolJob.run(StringPoolJob.java:99)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54)
3XMTHREADINFO      "Worker-3" (TID:0x24A8C400, sys_thread_t:0x21E21478, state:B, native ID:0x000024F0) prio=5
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaModel.getTarget(JavaModel.java:319)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.getCalledFileNames(ClasspathEntry.java:949)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:920)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:907)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:1447)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2673)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2779)
4XESTACKTRACE          at org/eclipse/jdt/internal/core/JavaProject.getResolvedClasspath(JavaProject.java:1915)
4XESTACKTRACE          at org/eclipse/jdt/core/JavaCore.initializeAfterLoad(JavaCore.java:3496)
4XESTACKTRACE          at org/eclipse/jdt/internal/ui/InitializeAfterLoadJob$RealJob.run(InitializeAfterLoadJob.java:35)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54)
3XMTHREADINFO      "Worker-5" (TID:0x24A8C800, sys_thread_t:0x21E20FC8, state:CW, native ID:0x00002688) prio=5
4XESTACKTRACE          at java/lang/Object.wait(Native Method)
4XESTACKTRACE          at java/lang/Object.wait(Object.java:231)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/WorkerPool.sleep(WorkerPool.java:185)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/WorkerPool.startJob(WorkerPool.java:217)
4XESTACKTRACE          at org/eclipse/core/internal/jobs/Worker.run(Worker.java:50)
Comment 4 Jay Arthanareeswaran CLA 2010-05-10 09:56:09 EDT
I am unable to reproduce this bug. However, looking at the thread dump, this is what I figure might be the cause:

Worker-0 runs AutoBuildJob, which would have acquired lock on the workspace root and waiting to obtain a lock on ExternalFoldersManager. Worker-3 has the lock for ExternalFoldersManager but waiting for Worker-0 to finish so that it can open the external folders project.
Comment 5 Jay Arthanareeswaran CLA 2010-05-10 13:03:45 EDT
Created attachment 167759 [details]
Proposed Fix

The fix has two parts:
1) Created a singleton of ExternalFoldersManager to ensure the consistency of the map containing the external folders
2) Made the map a synchronized one

For this specific case, the first part alone would have been enough. But adding the second part to keep the synchronization only for the folders' map and not to the manager object itself.

Remy, can you please see if this addresses your concern?
Comment 6 Remy Suen CLA 2010-05-10 13:28:37 EDT
(In reply to comment #5)
> Remy, can you please see if this addresses your concern?

I was originally able to get the system to hang in addFolder(IPath) by
expanding my project while it was initializing the Java tooling but with the
patch, that either "doesn't happen" or happens too quickly that I don't even
have a chance to try to cause the hang. :o
Comment 7 Olivier Thomann CLA 2010-05-10 15:48:02 EDT
The only comment I have is regarding the getFolders() method.
Should not we initialize the folders instance variable only when it is properly initialized.
So put the synchronized map into a temporary variable and set it to the folders instance variable only before it returns.
Comment 8 Olivier Thomann CLA 2010-05-10 15:54:07 EDT
Why do we need the call getFolders() inside the private constructor of org.eclipse.jdt.internal.core.ExternalFoldersManager?
Should not we wait for the actual first call to getFolders() ?
Comment 9 Olivier Thomann CLA 2010-05-10 15:55:18 EDT
Created attachment 167803 [details]
Proposed fix

So we would end up with this patch. Jay, let me know what you think.
Comment 10 Frederic Fusier CLA 2010-05-10 17:02:48 EDT
(In reply to comment #9)
> Created an attachment (id=167803) [details]
> Proposed fix
> 
> So we would end up with this patch. Jay, let me know what you think.

+1 for this patch

I also agree with Olivier, that:
1) it's better to use a temporary map while getting the folders and only initialize the field in one shot at the end...
2) it's not necessary to initialize the folders before the getFolders() method is called, otherwise they will surely be an extra cost during the startup which is already a performance hot spot!
Comment 11 Jay Arthanareeswaran CLA 2010-05-11 02:38:01 EDT
(In reply to comment #7)
> The only comment I have is regarding the getFolders() method.
> Should not we initialize the folders instance variable only when it is properly
> initialized.

I agree. We can even delay the creation of the synchronized map - use a normal temporary map and create a synchronized map just before we assign it to the instance variable. I will make this small change to the patch.

(In reply to comment #8)
> Why do we need the call getFolders() inside the private constructor of
> org.eclipse.jdt.internal.core.ExternalFoldersManager?
> Should not we wait for the actual first call to getFolders() ?

The reason I had to put that was to avoid the race condition to the code that instantiates the folders' map. As we see in the thread dump, there are several threads in the start-up trying to access the folders manager and there is a good chance of a race condition and hence multiple execution of the code inside ExternalFoldersManager#getFolders is a possibility. Functionally this should not matter as the overwritten map should have the same contents. But it's better to avoid that.

Having said that, I do agree with the point of calling getFolders only when necessary. However, Looking at the code and practically speaking, the getFolders method will most probably be called at some point during the start-up. So, my concern is that the delayed but imminent call could lead us to a double invocation of the same. It looks like a trade-off we need to decide on.

Olivier, in any case, do we want to keep the private constructor just for the completion of the singleton? At this point, I don't see anyone else creating an instance other than JavaModelManager. So, it's only of academic interest.
Comment 12 Frederic Fusier CLA 2010-05-11 04:31:22 EDT
(In reply to comment #11)
> (In reply to comment #7)
> > The only comment I have is regarding the getFolders() method.
> > Should not we initialize the folders instance variable only when it is properly
> > initialized.
> 
> I agree. We can even delay the creation of the synchronized map - use a normal
> temporary map and create a synchronized map just before we assign it to the
> instance variable. I will make this small change to the patch.
> 
> (In reply to comment #8)
> > Why do we need the call getFolders() inside the private constructor of
> > org.eclipse.jdt.internal.core.ExternalFoldersManager?
> > Should not we wait for the actual first call to getFolders() ?
> 
> The reason I had to put that was to avoid the race condition to the code that
> instantiates the folders' map. As we see in the thread dump, there are several
> threads in the start-up trying to access the folders manager and there is a
> good chance of a race condition and hence multiple execution of the code inside
> ExternalFoldersManager#getFolders is a possibility. Functionally this should
> not matter as the overwritten map should have the same contents. But it's
> better to avoid that.
> 
> Having said that, I do agree with the point of calling getFolders only when
> necessary. However, Looking at the code and practically speaking, the
> getFolders method will most probably be called at some point during the
> start-up. So, my concern is that the delayed but imminent call could lead us to
> a double invocation of the same. It looks like a trade-off we need to decide
> on.
> 
As the getFolders will be well protected against race conditions with the patch I do still think that we should avoid to initialize the folders at the creation of the ExternalFoldersManager.

> Olivier, in any case, do we want to keep the private constructor just for the
> completion of the singleton? At this point, I don't see anyone else creating an
> instance other than JavaModelManager. So, it's only of academic interest.

I agree that it's only academic as we do not want the ExternalFoldersManager folders to be initialized in the constructor. Hence I let it unchanged until there's a real need to turn it as a singleton.
Comment 13 Olivier Thomann CLA 2010-05-11 10:43:10 EDT
(In reply to comment #11)
> I agree. We can even delay the creation of the synchronized map - use a normal
> temporary map and create a synchronized map just before we assign it to the
> instance variable. I will make this small change to the patch.
Please do that change and provide a new patch for review.

> Olivier, in any case, do we want to keep the private constructor just for the
> completion of the singleton? At this point, I don't see anyone else creating an
> instance other than JavaModelManager. So, it's only of academic interest.
No need for this as this is internal code.

Once the new patch is ready, we must review it one last time and release it.
Comment 14 Olivier Thomann CLA 2010-05-11 11:11:43 EDT
(In reply to comment #13)
> > Olivier, in any case, do we want to keep the private constructor just for the
> > completion of the singleton? At this point, I don't see anyone else creating an
> > instance other than JavaModelManager. So, it's only of academic interest.
> No need for this as this is internal code.
Since the default constructor is created anyway, there is no reason not to add it ourselves. At least it makes it clear that this should be treated as a singleton.
Comment 15 Jay Arthanareeswaran CLA 2010-05-11 12:07:51 EDT
Created attachment 167955 [details]
Updated patch

This patch contains the changes discussed.
Comment 16 Olivier Thomann CLA 2010-05-11 12:11:31 EDT
+1. Patch looks good.
Comment 17 Jay Arthanareeswaran CLA 2010-05-11 12:46:42 EDT
Released in HEAD for 3.6RC1.
Comment 18 Frederic Fusier CLA 2010-05-17 12:06:49 EDT
Verified for 3.6RC1 by code inspection but also by reporter (see comment 6).