| Summary: | live lock from multiple threads in ProjectPreferences.isAlreadyLoaded | ||
|---|---|---|---|
| Product: | [Eclipse Project] Platform | Reporter: | Randall Theobald <rstheo> |
| Component: | Resources | Assignee: | 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: | |||
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)
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. This should be fixed in the 3.4 maintenance stream if possible. This is a duplicate and already fixed. See also bug 290189. *** This bug has been marked as a duplicate of bug 158361 *** |
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.