Bug 221680 - Classpath gets reset randomly in headless mode
Summary: Classpath gets reset randomly in headless mode
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.4   Edit
Hardware: PC Windows XP
: P3 critical (vote)
Target Milestone: 3.4 M6   Edit
Assignee: Jerome Lanneluc CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-03-06 11:08 EST by Leonard Theivendra CLA
Modified: 2008-03-26 06:36 EDT (History)
1 user (show)

See Also:


Attachments
Proposed fix (12.53 KB, patch)
2008-03-07 05:07 EST, Jerome Lanneluc CLA
no flags Details | Diff
New proposed fix against V_836 (14.59 KB, patch)
2008-03-14 13:57 EDT, Jerome Lanneluc CLA
no flags Details | Diff
Last proposed fix against v_836 (14.04 KB, patch)
2008-03-15 12:58 EDT, Jerome Lanneluc CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Leonard Theivendra CLA 2008-03-06 11:08:19 EST
Build ID: 3.4 M5

Steps To Reproduce:
In an adaptor's headless eclipse 3.4 M5 based tool, after the classpath is set on a java project via JavaProject.setRawClasspath() on the main thread, sometimes it gets reset to a default set of four entries by a worker thread.  This is only reproducible on multi-core cpu machines where race conditions are more easily reproduced.

More information:
Inserting some trace info in JavaModelManager.PerProjectInfo.setClasspath(....), whenever the classpath gets reset, this worker thread is seen (note that the classpath before this thread came along had 100+ entries set previously via JavaProject.setRawClasspath()):

>>>>> JavaModelManager.PerProjectInfo.setClasspath():
          ::::: cp entry 0 = /depconvrt02/ejbModule[CPE_SOURCE][K_SOURCE][isExported:false]
          ::::: cp entry 1 = org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java[CPE_CONTAINER][K_SOURCE][isExported:false]
          ::::: cp entry 2 = org.eclipse.jst.j2ee.internal.module.container[CPE_CONTAINER][K_SOURCE][isExported:false]
          ::::: cp entry 3 = /depconvrt02/ImportedClasses[CPE_LIBRARY][K_BINARY][isExported:true]
      project = depconvrt02
      THREAD INFO: JavaModelManager.PerProjectInfo.setClasspath():
      Thread name = Worker-0, id = 13
          java.lang.Thread.getStackTraceImpl(Native Method)
          java.lang.Thread.getStackTrace(Thread.java:1039)
          org.eclipse.jdt.internal.core.JavaModelManager$PerProjectInfo.setClasspath(JavaModelManager.java:1150)
          org.eclipse.jdt.internal.core.JavaModelManager$PerProjectInfo.readAndCacheClasspath(JavaModelManager.java:1206)
          org.eclipse.jdt.internal.core.DeltaProcessor.readRawClasspath(DeltaProcessor.java:482)
          org.eclipse.jdt.internal.core.DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:340)
          org.eclipse.jdt.internal.core.DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:469)
          org.eclipse.jdt.internal.core.DeltaProcessor.resourceChanged(DeltaProcessor.java:1828)
          org.eclipse.jdt.internal.core.DeltaProcessingState.resourceChanged(DeltaProcessingState.java:390)
          org.eclipse.core.internal.events.NotificationManager$2.run(NotificationManager.java:282)
          org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
          org.eclipse.core.internal.events.NotificationManager.notify(NotificationManager.java:276)
          org.eclipse.core.internal.events.NotificationManager.broadcastChanges(NotificationManager.java:148)
          org.eclipse.core.internal.resources.Workspace.broadcastPostChange(Workspace.java:313)
          org.eclipse.core.internal.resources.Workspace.endOperation(Workspace.java:1022)
          org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1809)
          org.eclipse.core.internal.events.NotificationManager$NotifyJob.run(NotificationManager.java:39)
          org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Comment 1 Jerome Lanneluc CLA 2008-03-07 05:07:51 EST
Created attachment 91853 [details]
Proposed fix

Note there is no regression test as this is a race condition fix.
Comment 2 Jerome Lanneluc CLA 2008-03-14 13:37:34 EDT
Unfortunately this fix causes a deadlock between the main thread and the resource change notifier thread (Worker-0) as shown below:

"main" TID:0x0013C500, j9thread_t:0x00012BD4, state:B, prio=5  (native thread ID:0x12C8, native priority:0x5, native policy:UNKNOWN)
    at java/lang/Object.wait(Native Method)
    at java/lang/Object.wait(Object.java:196)
    at org/eclipse/core/internal/jobs/Semaphore.acquire(Semaphore.java:38)
    at org/eclipse/core/internal/jobs/OrderedLock.doAcquire(OrderedLock.java:169)
    at org/eclipse/core/internal/jobs/OrderedLock.acquire(OrderedLock.java:105)
    at org/eclipse/core/internal/jobs/OrderedLock.acquire(OrderedLock.java:82(Compiled Code))
    at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:118)
    at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1747)
    at org/eclipse/core/internal/resources/File.setContents(File.java:364)
    at org/eclipse/jdt/internal/core/JavaProject.setSharedProperty(JavaProject.java:2857)
    at org/eclipse/jdt/internal/core/JavaProject.writeFileEntries(JavaProject.java:2623)
    at org/eclipse/jdt/internal/core/JavaModelManager$7.run(JavaModelManager.java:1171)
    at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1800)
    at org/eclipse/jdt/internal/core/JavaModelManager$PerProjectInfo.writeAndCacheClasspath(JavaModelManager.java:1167)
    at org/eclipse/jdt/internal/core/SetClasspathOperation.executeOperation(SetClasspathOperation.java:61)
    at org/eclipse/jdt/internal/core/JavaModelOperation.run(JavaModelOperation.java:720)
    at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1800)
    at org/eclipse/jdt/internal/core/JavaModelOperation.runOperation(JavaModelOperation.java:785)
    at org/eclipse/jdt/internal/core/JavaProject.setRawClasspath(JavaProject.java:2787)
    at org/eclipse/jdt/internal/core/JavaProject.setRawClasspath(JavaProject.java:2818)

"Worker-0" TID:0x12303900, j9thread_t:0x0001D0D0, state:B, prio=5(native thread ID:0xC1C, native priority:0x5, native policy:UNKNOWN)
    at org/eclipse/jdt/internal/core/DeltaProcessor.readRawClasspath(DeltaProcessor.java:482)
    at org/eclipse/jdt/internal/core/DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:340)
    at org/eclipse/jdt/internal/core/DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:469)
    at org/eclipse/jdt/internal/core/DeltaProcessor.resourceChanged(DeltaProcessor.java:1828)
    at org/eclipse/jdt/internal/core/DeltaProcessingState.resourceChanged(DeltaProcessingState.java:390)
    at org/eclipse/core/internal/events/NotificationManager$2.run(NotificationManager.java:282)
    at org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:37)
    at org/eclipse/core/internal/events/NotificationManager.notify(NotificationManager.java:276)
    at org/eclipse/core/internal/events/NotificationManager.broadcastChanges(NotificationManager.java:148)
    at org/eclipse/core/internal/resources/Workspace.broadcastPostChange(Workspace.java:313)
    at org/eclipse/core/internal/resources/Workspace.endOperation(Workspace.java:1022)
    at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1809)
    at org/eclipse/core/internal/events/NotificationManager$NotifyJob.run(NotificationManager.java:39)
    at org/eclipse/core/internal/jobs/Worker.run(Worker.java:55)
Comment 3 Jerome Lanneluc CLA 2008-03-14 13:38:33 EDT
Comment on attachment 91853 [details]
Proposed fix

Marking proposed fix  obsolete since it causes a deadlock.
Comment 4 Jerome Lanneluc CLA 2008-03-14 13:57:08 EDT
Created attachment 92587 [details]
New proposed fix against V_836

This fix should avoid the deadlock problem.
Comment 5 Jerome Lanneluc CLA 2008-03-15 12:58:59 EDT
Created attachment 92624 [details]
Last proposed fix against v_836

The deadlock was still present in previous proposed fix. 
I verified that this fix doesn't have the deadlock problem.
Comment 6 Jerome Lanneluc CLA 2008-03-17 03:57:45 EDT
Fix released for 3.4M6
Comment 7 David Audel CLA 2008-03-26 06:36:40 EDT
Verified for 3.4M6.