Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 321734 - live lock from multiple threads in ProjectPreferences.isAlreadyLoaded
Summary: live lock from multiple threads in ProjectPreferences.isAlreadyLoaded
Status: CLOSED DUPLICATE of bug 158361
Alias: None
Product: Platform
Classification: Eclipse Project
Component: Resources (show other bugs)
Version: 3.4   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Platform-Resources-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-08-04 10:45 EDT by Randall Theobald CLA
Modified: 2010-08-05 14:23 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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 ***