Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 321734

Summary: live lock from multiple threads in ProjectPreferences.isAlreadyLoaded
Product: [Eclipse Project] Platform Reporter: Randall Theobald <rstheo>
Component: ResourcesAssignee: Platform-Resources-Inbox <platform-resources-inbox>
Status: CLOSED DUPLICATE QA Contact:
Severity: normal    
Priority: P3 CC: edwinc
Version: 3.4   
Target Milestone: ---   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Randall Theobald CLA 2010-08-04 10:45:14 EDT
Build Identifier: M20090211-1700

I am a performance analyst for an adopting product. I have come across an intermittent live lock a few times caused by non-synchronized accesses in multiple threads to

    org/eclipse/core/internal/resources/ProjectPreferences.isAlreadyLoaded(ProjectPreferences.java:436(Compiled Code))

Which accesses a HashSet in a non-synchronized way. Our product uses the IBM JDK 1.6.0 SR6 and this causes a live lock. Since the HashSet implementation is not synchronized, it is up to ProjectPreferences to synchronize access.


Reproducible: Sometimes

Steps to Reproduce:
1. Scenario where multiple threads call ProjectPreferences.isAlreadyLoaded(..) concurrently.
Comment 1 Randall Theobald CLA 2010-08-04 10:51:05 EDT
Here are the tops of the interesting callstacks at the time of the javacore (in livelock state):

"Worker-0 - ---------" J9VMThread:0x48D23300, j9thread_t:0x49116468, java/lang/Thread:0x05D30E28, state:CW, prio=5
       (native thread ID:0x4B8C, native priority:0x5, native policy:UNKNOWN)
      Java callstack:
          at java/util/HashMap.findNonNullKeyEntry(HashMap.java:526(Compiled Code))
          at java/util/HashMap.getEntry(HashMap.java:510(Compiled Code))
          at java/util/HashMap.containsKey(HashMap.java:431(Compiled Code))
          at java/util/HashSet.contains(HashSet.java:138(Compiled Code))
          at org/eclipse/core/internal/resources/ProjectPreferences.isAlreadyLoaded(ProjectPreferences.java:436(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.create(EclipsePreferences.java:302(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.getChild(EclipsePreferences.java:412(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.internalNode(EclipsePreferences.java:541(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.node(EclipsePreferences.java:662(Compiled Code))
          at org/eclipse/core/resources/ProjectScope.getNode(ProjectScope.java:67(Compiled Code))
          at org/eclipse/jdt/internal/core/JavaProject.getEclipsePreferences(JavaProject.java:1402(Compiled Code))
          at org/eclipse/jdt/internal/core/JavaProject.getOption(JavaProject.java:1561(Compiled Code))
          at org/eclipse/jdt/internal/core/JavaModelManager.determineIfOnClasspath(JavaModelManager.java:934(Compiled Code))
          at org/eclipse/jdt/internal/core/JavaModelManager.create(JavaModelManager.java:826)
          at org/eclipse/jdt/internal/core/JavaModelManager.create(JavaModelManager.java:756(Compiled Code))
          at org/eclipse/jdt/core/JavaCore.create(JavaCore.java:2438(Compiled Code))

"Worker-7" J9VMThread:0x488D0700, j9thread_t:0x4CB60BF8, java/lang/Thread:0x08E45D48, state:CW, prio=5
       (native thread ID:0x14B8, native priority:0x5, native policy:UNKNOWN)
      Java callstack:
          at java/util/HashMap.findNonNullKeyEntry(HashMap.java:525(Compiled Code))
          at java/util/HashMap.getEntry(HashMap.java:510(Compiled Code))
          at java/util/HashMap.containsKey(HashMap.java:431(Compiled Code))
          at java/util/HashSet.contains(HashSet.java:138(Compiled Code))
          at org/eclipse/core/internal/resources/ProjectPreferences.isAlreadyLoaded(ProjectPreferences.java:436(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.create(EclipsePreferences.java:302(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.getChild(EclipsePreferences.java:412(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.internalNode(EclipsePreferences.java:541(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.node(EclipsePreferences.java:662(Compiled Code))
          at org/eclipse/core/resources/ProjectScope.getNode(ProjectScope.java:67(Compiled Code))


"Java indexing" J9VMThread:0x48AFA300, j9thread_t:0x4CB60268, java/lang/Thread:0x06B561F8, state:B, prio=4
       (native thread ID:0x40EC, native priority:0x4, native policy:UNKNOWN)
      Java callstack:
          at org/eclipse/core/internal/preferences/EclipsePreferences.getChild(EclipsePreferences.java:399(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.internalNode(EclipsePreferences.java:541(Compiled Code))
          at org/eclipse/core/internal/preferences/EclipsePreferences.node(EclipsePreferences.java:662(Compiled Code))
          at org/eclipse/core/resources/ProjectScope.getNode(ProjectScope.java:67(Compiled Code))
          at org/eclipse/jdt/internal/core/JavaProject.getEclipsePreferences(JavaProject.java:1402(Compiled Code))
          at org/eclipse/jdt/internal/core/JavaProject.getOptions(JavaProject.java:1587)
          at org/eclipse/jdt/internal/core/search/indexing/IndexManager.getSourceElementParser(IndexManager.java:176)
          at org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.execute(IndexAllProject.java:203)
          at org/eclipse/jdt/internal/core/search/processing/JobManager.run(JobManager.java:397)
          at java/lang/Thread.run(Thread.java:736)
Comment 2 Randall Theobald CLA 2010-08-04 10:58:54 EDT
Looking at the code, it appears that the problem is that the methods synchronize on the instance of ProjectPreferences, but the 'loadedNodes' HashSet is static. The synchronization should be changed to lock on the 'loadedNodes' static HashSet.
Comment 3 Randall Theobald CLA 2010-08-04 10:59:45 EDT
This should be fixed in the 3.4 maintenance stream if possible.
Comment 4 John Arthorne CLA 2010-08-05 14:23:39 EDT
This is a duplicate and already fixed. See also bug 290189.

*** This bug has been marked as a duplicate of bug 158361 ***