[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [dali-dev] comments on bug 243547 (today's deadlock)
|
Hi Brian, have you taken a look at Chuck's suggestions in
https://bugs.eclipse.org/bugs/show_bug.cgi?id=245573 ? He attached some
new traces too. Any thoughts on this and would it be useful for him to
create a patch? Sounds like GenericJpaModel can get into various deadlock
situations due to other classes being touched during operations in it's
sync blocks.
"Suggestion....
Remove the class synchonization around getJpaProject() if the project
doesn't
exist yet.
A separate Job lock can prevent multiple callers of getJpaProject() if no
project exists, and thus freeing up this lock for other calls like
synchFiles()
and javaElementChanged()
"GenericJpaModel$DefaultJpaProjectHolder.buildJpaProject" could be done on
a
separate Job
I can try creating a patch for this is you would like"
------------------------------------------
Leonard Theivendra
Websphere / IBM Software Solutions Toronto
email: theivend@xxxxxxxxxx
tel: (905) 413-3777 tie: 969-3777
fax: (905) 413-4920
Brian Vosburgh <brian.vosburgh@xxxxxxxxxx>
Sent by: dali-dev-bounces@xxxxxxxxxxx
08/28/2008 02:24 PM
Please respond to
"General Dali EJB ORM developer discussion." <dali-dev@xxxxxxxxxxx>
To
Eclipse Dali <dali-dev@xxxxxxxxxxx>
cc
Subject
[dali-dev] comments on bug 243547 (today's deadlock)
Here's my take on bug 243547. (Which was just closed, since the
SSE-related
deadlock seems to have been fixed. But Gary Karasiuk will probably open a
new bug
with the new deadlock, whose relevant stacktraces I've extracted from the
dump
and attached.)
Any comments, corrections, or insights are welcome.
Both threads are running the Dali validator.
I think(?) Worker-2 has locked the workspace while the Dali validator
deletes the
Dali-related markers. This causes the workspace to notify Dali that a
resource
has changed. The Dali listener is waiting for a lock on the Dali model
(GenericJpaModel) so it can forward the notification to the appropriate
JPA project.
Unfortunately, GenericJpaModel is already locked by Worker-5 (below).
In Worker-5, validation has triggered the (lazy) creation of a JPA
project, locking
the Dali model (GenericJpaModel) until the JPA project is built. This
creation also
triggers the loading of the DTP plug-in, which then loads and validates
the DTP drivers.
It looks like DTP has detected an error in one of the drivers and needs to
lock the
workspace so it can add the appropriate problem markers. Unfortunately,
the workspace
is already locked by Worker-2 (above).
The way we are doing things currently (which I've never really warmed up
to :-) )
doesn't really allow us to remove the validation markers asynchronously.
We
could investigate changing that.... Likewise, it might be difficult for
DTP to add its
problem markers asynchronously; but might merit investigation....
Rough notes:
Worker-2
JpaValidator
calls WorkbenchReporter.removeAllMessages(IValidator)
calls Workspace.deleteMarkers(IMarker[])
which notifies listeners that a resource has changed
waiting to call GenericJpaModel.synchronizeFiles(IProject, IResourceDelta)
which is locked by Worker-5
somewhere acquires a lock...
Worker-5
JpaValidator
calls JptCorePlugin to get the appropriate JPA project
locks and calls GenericJpaModel to get the JPA project
the JPA project is (lazily) built
triggers the loading of JptDbPlugin
builds the DTPConnectionProfileRepository
triggers the DTP InternalProfileManager to load the profiles
the properties of a DTP driver are invalid so...
DriverValidator tries to add a problem marker
WorkManager waits to lock the "primary workspace lock"
3XMTHREADINFO "Worker-2" TID:0x3210B200, j9thread_t:0x385EC750,
state:B, prio=5
3XMTHREADINFO1 (native thread ID:0x378, native priority:0x5,
native policy:UNKNOWN)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.synchronizeFiles(JpaModelManager.java:295)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.synchronizeFiles(JpaModelManager.java:275)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.synchronizeFiles(JpaModelManager.java:286)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.synchronizeFiles(JpaModelManager.java:272)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.resourcePostChange(JpaModelManager.java:264)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.resourceChanged(JpaModelManager.java:237)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager$ResourceChangeListener.resourceChanged(JpaModelManager.java:487)
4XESTACKTRACE at
org/eclipse/core/internal/events/NotificationManager$2.run(NotificationManager.java:288)
4XESTACKTRACE at
org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:37(Compiled Code))
4XESTACKTRACE at
org/eclipse/core/internal/events/NotificationManager.notify(NotificationManager.java:282)
4XESTACKTRACE at
org/eclipse/core/internal/events/NotificationManager.broadcastChanges(NotificationManager.java:148)
4XESTACKTRACE at
org/eclipse/core/internal/resources/Workspace.broadcastPostChange(Workspace.java:313)
4XESTACKTRACE at
org/eclipse/core/internal/resources/Workspace.endOperation(Workspace.java:1022)
4XESTACKTRACE at
org/eclipse/core/internal/resources/Workspace.deleteMarkers(Workspace.java:961)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/TaskListUtility.removeTaskSubset(TaskListUtility.java:428)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/TaskListUtility.removeAllTasks(TaskListUtility.java:406)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/TaskListUtility.removeAllTasks(TaskListUtility.java:402)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/operations/WorkbenchReporter.removeAllMessages(WorkbenchReporter.java:164)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/operations/WorkbenchReporter.removeAllMessages(WorkbenchReporter.java:544)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/operations/WorkbenchReporter.removeAllMessages(WorkbenchReporter.java:509)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/validation/JpaValidator.validate(JpaValidator.java:46)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/validation/JpaValidator.validateInJob(JpaValidator.java:77)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/operations/ValidatorJob.run(ValidatorJob.java:78)
4XESTACKTRACE at
org/eclipse/core/internal/jobs/Worker.run(Worker.java:55)
3XMTHREADINFO "Worker-5" TID:0x32119D00, j9thread_t:0x39E62C38,
state:CW, prio=1
3XMTHREADINFO1 (native thread ID:0x9FC, native priority:0x1,
native policy:UNKNOWN)
4XESTACKTRACE at java/lang/Object.wait(Native Method)
4XESTACKTRACE at java/lang/Object.wait(Object.java:196)
4XESTACKTRACE at
org/eclipse/core/internal/jobs/Semaphore.acquire(Semaphore.java:38)
4XESTACKTRACE at
org/eclipse/core/internal/jobs/OrderedLock.doAcquire(OrderedLock.java:169)
4XESTACKTRACE at
org/eclipse/core/internal/jobs/OrderedLock.acquire(OrderedLock.java:105(Compiled
Code))
4XESTACKTRACE at
org/eclipse/core/internal/jobs/OrderedLock.acquire(OrderedLock.java:82(Compiled
Code))
4XESTACKTRACE at
org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:118)
4XESTACKTRACE at
org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1747)
4XESTACKTRACE at
org/eclipse/core/internal/resources/Resource.createMarker(Resource.java:641)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/drivers/DriverValidator.addProblemMarker(DriverValidator.java:230)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/drivers/DriverValidator.isValid(DriverValidator.java:96)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/drivers/DriverValidator.isValid(DriverValidator.java:79)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/internal/InternalProfileManager.getDriverInstance(InternalProfileManager.java:1334)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/internal/InternalProfileManager.enableLocalDatabase(InternalProfileManager.java:1252)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/internal/InternalProfileManager.loadLocalRegisteredDatabases(InternalProfileManager.java:1211)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/internal/InternalProfileManager.loadProfiles(InternalProfileManager.java:928)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/internal/InternalProfileManager.getProfiles(InternalProfileManager.java:139)
4XESTACKTRACE at
org/eclipse/datatools/connectivity/ProfileManager.getProfiles(ProfileManager.java:46)
4XESTACKTRACE at
org/eclipse/jpt/db/internal/DTPConnectionProfileRepository.start(DTPConnectionProfileRepository.java:63)
4XESTACKTRACE at
org/eclipse/jpt/db/JptDbPlugin.start(JptDbPlugin.java:53)
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleContextImpl$2.run(BundleContextImpl.java:1009)
4XESTACKTRACE at
java/security/AccessController.doPrivileged(AccessController.java:251)
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleContextImpl.startActivator(BundleContextImpl.java:1003)
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleContextImpl.start(BundleContextImpl.java:984)
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleHost.startWorker(BundleHost.java:346)
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/AbstractBundle.start(AbstractBundle.java:265)
4XESTACKTRACE at
org/eclipse/osgi/framework/util/SecureAction.start(SecureAction.java:400)
4XESTACKTRACE at
org/eclipse/core/runtime/internal/adaptor/EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:111(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/baseadaptor/loader/ClasspathManager.findLocalClass(ClasspathManager.java:427(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.findLocalClass(DefaultClassLoader.java:193(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleLoader.findLocalClass(BundleLoader.java:368(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/SingleSourcePackage.loadClass(SingleSourcePackage.java:33(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleLoader.findClassInternal(BundleLoader.java:441(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleLoader.findClass(BundleLoader.java:397(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/framework/internal/core/BundleLoader.findClass(BundleLoader.java:385(Compiled
Code))
4XESTACKTRACE at
org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.loadClass(DefaultClassLoader.java:87(Compiled
Code))
4XESTACKTRACE at
java/lang/ClassLoader.loadClass(ClassLoader.java:609(Compiled Code))
4XESTACKTRACE at java/lang/J9VMInternals.verifyImpl(Native
Method)
4XESTACKTRACE at
java/lang/J9VMInternals.verify(J9VMInternals.java:72(Compiled Code))
4XESTACKTRACE at
java/lang/J9VMInternals.initialize(J9VMInternals.java:134(Compiled Code))
4XESTACKTRACE at
org/eclipse/jpt/core/internal/platform/GenericJpaFactory.buildJpaDataSource(GenericJpaFactory.java:226)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/GenericJpaProject.<init>(GenericJpaProject.java:141)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/platform/GenericJpaFactory.buildJpaProject(GenericJpaFactory.java:222)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/GenericJpaModel$DefaultJpaProjectHolder.buildJpaProject(GenericJpaModel.java:453)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/GenericJpaModel$DefaultJpaProjectHolder.jpaProject(GenericJpaModel.java:445)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/GenericJpaModel.getJpaProject(GenericJpaModel.java:84)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/JpaModelManager.getJpaProject(JpaModelManager.java:178)
4XESTACKTRACE at
org/eclipse/jpt/core/JptCorePlugin.getJpaProject(JptCorePlugin.java:157)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/validation/JpaValidator.validationMessages(JpaValidator.java:55)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/validation/JpaValidator.validate(JpaValidator.java:48)
4XESTACKTRACE at
org/eclipse/jpt/core/internal/validation/JpaValidator.validateInJob(JpaValidator.java:77)
4XESTACKTRACE at
org/eclipse/wst/validation/internal/operations/ValidatorJob.run(ValidatorJob.java:78)
4XESTACKTRACE at
org/eclipse/core/internal/jobs/Worker.run(Worker.java:55