Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 315286 - Deadlock initializing legacy J2EE EMF models
Summary: Deadlock initializing legacy J2EE EMF models
Status: RESOLVED FIXED
Alias: None
Product: WTP Java EE Tools
Classification: WebTools
Component: jst.j2ee (show other bugs)
Version: 3.2   Edit
Hardware: PC Windows XP
: P3 major with 1 vote (vote)
Target Milestone: 3.2.1   Edit
Assignee: Carl Anderson CLA
QA Contact: Chuck Bridgham CLA
URL:
Whiteboard:
Keywords:
: 290696 326272 (view as bug list)
Depends on:
Blocks: 319020
  Show dependency tree
 
Reported: 2010-06-01 15:38 EDT by Carl Anderson CLA
Modified: 2010-10-25 12:41 EDT (History)
3 users (show)

See Also:
cbridgha: review+


Attachments
Make the initialization directed (84.30 KB, patch)
2010-06-01 15:48 EDT, Carl Anderson CLA
no flags Details | Diff
Thread Dump from VisualVM (51.00 KB, text/plain)
2010-10-25 06:06 EDT, Stefan Cordes CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Carl Anderson CLA 2010-06-01 15:38:57 EDT
An adopter product is encountering the following deadlock:

3XMTHREADINFO      "ModalContext" J9VMThread:0x4BF32100, j9thread_t:0x4918AF98, java/lang/Thread:0x3E2B5CA0, state:CW, prio=6
3XMTHREADINFO1            (native thread ID:0x1868, native priority:0x6, native policy:UNKNOWN)
3XMTHREADINFO3           Java callstack:
4XESTACKTRACE                at java/lang/Object.wait(Native Method)
4XESTACKTRACE                at java/lang/Object.wait(Object.java:167(Compiled Code))
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:130(Compiled Code))
4XESTACKTRACE                at sun/misc/Unsafe.ensureClassInitialized(Native Method)
4XESTACKTRACE                at sun/reflect/UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25(Compiled Code))
4XESTACKTRACE                at sun/reflect/ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.acquireFieldAccessor(Field.java:912(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.getFieldAccessor(Field.java:901(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.get(Field.java:360)
4XESTACKTRACE                at org/eclipse/emf/ecore/plugin/RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageImpl$1.getEPackage(EPackageImpl.java:168)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
4XESTACKTRACE                at org/eclipse/jst/j2ee/taglib/internal/impl/TaglibPackageImpl.init(TaglibPackageImpl.java:173)
4XESTACKTRACE                at org/eclipse/jst/j2ee/taglib/internal/TaglibPackage.<clinit>(TaglibPackage.java:66)
4XESTACKTRACE                at java/lang/J9VMInternals.initializeImpl(Native Method)
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:200(Compiled Code))
4XESTACKTRACE                at org/eclipse/jst/j2ee/ejb/internal/impl/EjbPackageImpl.init(EjbPackageImpl.java:340)
4XESTACKTRACE                at org/eclipse/jst/j2ee/ejb/EjbPackage.<clinit>(EjbPackage.java:1916)
4XESTACKTRACE                at java/lang/J9VMInternals.initializeImpl(Native Method)
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:200(Compiled Code))
4XESTACKTRACE                at sun/misc/Unsafe.ensureClassInitialized(Native Method)
4XESTACKTRACE                at sun/reflect/UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25(Compiled Code))
4XESTACKTRACE                at sun/reflect/ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.acquireFieldAccessor(Field.java:912(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.getFieldAccessor(Field.java:901(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.get(Field.java:360)
4XESTACKTRACE                at org/eclipse/emf/ecore/plugin/RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
4XESTACKTRACE                at org/eclipse/jst/j2ee/common/internal/impl/CommonPackageImpl.init(CommonPackageImpl.java:315)
4XESTACKTRACE                at org/eclipse/jst/j2ee/common/CommonPackage.<clinit>(CommonPackage.java:243)
4XESTACKTRACE                at java/lang/J9VMInternals.initializeImpl(Native Method)
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:200(Compiled Code))
4XESTACKTRACE                at sun/misc/Unsafe.ensureClassInitialized(Native Method)
4XESTACKTRACE                at sun/reflect/UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25(Compiled Code))
4XESTACKTRACE                at sun/reflect/ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.acquireFieldAccessor(Field.java:912(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.getFieldAccessor(Field.java:901(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.get(Field.java:360)
4XESTACKTRACE                at org/eclipse/emf/ecore/plugin/RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
4XESTACKTRACE                at org/eclipse/jst/j2ee/client/internal/impl/ClientPackageImpl.init(ClientPackageImpl.java:98)
4XESTACKTRACE                at org/eclipse/jst/j2ee/client/ClientPackage.<clinit>(ClientPackage.java:187)
4XESTACKTRACE                at java/lang/J9VMInternals.initializeImpl(Native Method)
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:200(Compiled Code))
4XESTACKTRACE                at sun/misc/Unsafe.ensureClassInitialized(Native Method)
4XESTACKTRACE                at sun/reflect/UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25(Compiled Code))
4XESTACKTRACE                at sun/reflect/ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.acquireFieldAccessor(Field.java:912(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.getFieldAccessor(Field.java:901(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.get(Field.java:360)
4XESTACKTRACE                at org/eclipse/emf/ecore/plugin/RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
4XESTACKTRACE                at org/eclipse/jst/j2ee/application/internal/impl/ApplicationPackageImpl.init(ApplicationPackageImpl.java:123)
4XESTACKTRACE                at org/eclipse/jst/j2ee/application/ApplicationPackage.<clinit>(ApplicationPackage.java:271)
4XESTACKTRACE                at java/lang/J9VMInternals.initializeImpl(Native Method)
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:200(Compiled Code))
4XESTACKTRACE                at org/eclipse/jst/j2ee/internal/model/translator/application/ApplicationTranslator.<init>(ApplicationTranslator.java:43)



3XMTHREADINFO      "Link Indexer worker-0" J9VMThread:0x4BD45D00, j9thread_t:0x4918A86C, java/lang/Thread:0x3E35E0B8, state:CW, prio=2
3XMTHREADINFO1            (native thread ID:0x1BE0, native priority:0x2, native policy:UNKNOWN)
3XMTHREADINFO3           Java callstack:
4XESTACKTRACE                at java/lang/Object.wait(Native Method)
4XESTACKTRACE                at java/lang/Object.wait(Object.java:167(Compiled Code))
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:130(Compiled Code))
4XESTACKTRACE                at sun/misc/Unsafe.ensureClassInitialized(Native Method)
4XESTACKTRACE                at sun/reflect/UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25(Compiled Code))
4XESTACKTRACE                at sun/reflect/ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.acquireFieldAccessor(Field.java:912(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.getFieldAccessor(Field.java:901(Compiled Code))
4XESTACKTRACE                at java/lang/reflect/Field.get(Field.java:360)
4XESTACKTRACE                at org/eclipse/emf/ecore/plugin/RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageImpl$1.getEPackage(EPackageImpl.java:168)
4XESTACKTRACE                at org/eclipse/emf/ecore/impl/EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
4XESTACKTRACE                at org/eclipse/jst/j2ee/webapplication/internal/impl/WebapplicationPackageImpl.init(WebapplicationPackageImpl.java:351)
4XESTACKTRACE                at org/eclipse/jst/j2ee/webapplication/WebapplicationPackage.<clinit>(WebapplicationPackage.java:1230)
4XESTACKTRACE                at java/lang/J9VMInternals.initializeImpl(Native Method)
4XESTACKTRACE                at java/lang/J9VMInternals.initialize(J9VMInternals.java:200(Compiled Code))
4XESTACKTRACE                at org/eclipse/jst/j2ee/internal/model/translator/webapplication/WebAppTranslator.<clinit>(WebAppTranslator.java:43)
Comment 1 Carl Anderson CLA 2010-06-01 15:48:31 EDT
Created attachment 170687 [details]
Make the initialization directed

Simply put, instead of the initialization of any entry point causing everything to be initialized (which can deadlock if two initializations are waiting for each other), I am making the model initialization a directed initialization- each model element initializes all of the models it requires, and then it calls to J2EEInit(), which does a "bottom up" initialization of everything on a separate thread.

Note that during the initialization, which requires being in a constructor, it is illegal to call wait().  Calling sleep() can cause one thread to wait, but it will not allow re-entrance into the constructor that is already in progress.  Therefore, the full initialization should happen on its own thread, and still following the directed approach.  (I chose the order that is in there because it will initialize things at the lowest level first, which reduces the risk of another thread waiting for initialization- if most of the required models of a particular EMF model are already initialized, its initialization should be quick and will be less likely to wait.

The separate initialization is guarded to only happen once.
Comment 2 Chuck Bridgham CLA 2010-06-02 09:26:59 EDT
approved
Comment 3 Carl Anderson CLA 2010-06-02 22:17:14 EDT
*** Bug 290696 has been marked as a duplicate of this bug. ***
Comment 4 Carl Anderson CLA 2010-06-17 09:12:36 EDT
Committed to HEAD for WTP 3.2.1 and WTP 3.3
Comment 5 Carl Anderson CLA 2010-09-28 09:43:39 EDT
*** Bug 326272 has been marked as a duplicate of this bug. ***
Comment 6 Stefan Cordes CLA 2010-10-25 06:05:02 EDT
Still get the deadlock with
Version: Helios Service Release 1
Build id: 20100917-0705

See Eclipse-20100917-0705-Deadlock.txt
Monitor of EJBResourceImpl.getRootTranslator
never released.
Comment 7 Stefan Cordes CLA 2010-10-25 06:06:25 EDT
Created attachment 181626 [details]
Thread Dump from VisualVM
Comment 8 Carl Anderson CLA 2010-10-25 12:41:21 EDT
Stephan - please open a separate defect for your issue.  The problem that you are encountering comes from commonarchive, which needs to conform to the same rules as the J2EE models.  (And please attach the thread dump to that new bug.)