This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 106477 - deadlock
Summary: deadlock
Status: CLOSED FIXED
Alias: None
Product: cnd
Classification: Unclassified
Component: Code Model (show other bugs)
Version: 5.x
Hardware: All All
: P1 blocker (vote)
Assignee: issues@cnd
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-06-13 12:16 UTC by Alexander Simon
Modified: 2007-11-30 15:59 UTC (History)
0 users

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexander Simon 2007-06-13 12:16:52 UTC
Found one Java-level deadlock:
=============================
"Code Model Request Processor: Following hyperlink":
 waiting to lock monitor 0x08147c5c (object 0x802ba9e8, a java.lang.Object),
 which is held by "Code Model Request Processor: Following hyperlink"
"Code Model Request Processor: Following hyperlink":
 waiting for ownable synchronizer 0x80f9e520, (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync),
 which is held by "Code Model Parser 2"
"Code Model Parser 2":
 waiting for ownable synchronizer 0x81330ba0, (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync),
 which is held by "Repository writer 0"
"Repository writer 0":
 waiting to lock monitor 0x081481d4 (object 0x87f9aca0, a java.util.ArrayList),
 which is held by "Code Model Parser 1"
"Code Model Parser 1":
 waiting for ownable synchronizer 0x80f9e520, (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync),
 which is held by "Code Model Parser 2"

Java stack information for the threads listed above:
===================================================
"Code Model Request Processor: Following hyperlink":
       at org.netbeans.modules.cnd.modelimpl.csm.core.ModelImpl.projects(ModelImpl.java:316)
       - waiting to lock <0x802ba9e8> (a java.lang.Object)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ModelImpl.findFile(ModelImpl.java:436)
       at org.netbeans.modules.cnd.modelutil.CsmUtilities.getCsmFile(CsmUtilities.java:262)
       at org.netbeans.modules.cnd.modelutil.CsmUtilities.getCsmFile(CsmUtilities.java:240)
       at org.netbeans.modules.cnd.modelutil.CsmUtilities.getCsmFile(CsmUtilities.java:219)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.findInclude(CsmIncludeHyperlinkProvider.java:86)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.findTargetObject(CsmIncludeHyperlinkProvider.java:72)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.goToInclude(CsmIncludeHyperlinkProvider.java:67)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.performAction(CsmIncludeHyperlinkProvider.java:60)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmAbstractHyperlinkProvider$1.run(CsmAbstractHyperlinkProvider.java:63)
       at org.netbeans.modules.cnd.modelimpl.csm.core.CodeModelRequestProcessor$1.run(CodeModelRequestProcessor.java:57)
       at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:499)
       at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:932)
"Code Model Request Processor: Following hyperlink":
       at sun.misc.Unsafe.park(Native Method)
       - parking to wait for  <0x80f9e520> (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync)
       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:712)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:842)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1162)
       at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:594)
       at org.netbeans.modules.cnd.repository.impl.SoftRefHybridRepository.get(SoftRefHybridRepository.java:71)
       at org.netbeans.modules.cnd.modelimpl.repository.RepositoryUtils.get(RepositoryUtils.java:58)
       at org.netbeans.modules.cnd.modelimpl.uid.KeyBasedUID.getObject(KeyBasedUID.java:46)
       at org.netbeans.modules.cnd.modelimpl.uid.KeyBasedUID.getObject(KeyBasedUID.java:37)
       at org.netbeans.modules.cnd.modelimpl.uid.UIDCsmConverter.UIDtoProject(UIDCsmConverter.java:85)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ModelImpl.projects(ModelImpl.java:320)
       - locked <0x802ba9e8> (a java.lang.Object)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ModelImpl.findFile(ModelImpl.java:436)
       at org.netbeans.modules.cnd.modelutil.CsmUtilities.getCsmFile(CsmUtilities.java:262)
       at org.netbeans.modules.cnd.modelutil.CsmUtilities.getCsmFile(CsmUtilities.java:240)
       at org.netbeans.modules.cnd.modelutil.CsmUtilities.getCsmFile(CsmUtilities.java:219)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.findInclude(CsmIncludeHyperlinkProvider.java:86)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.findTargetObject(CsmIncludeHyperlinkProvider.java:72)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.goToInclude(CsmIncludeHyperlinkProvider.java:67)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmIncludeHyperlinkProvider.performAction(CsmIncludeHyperlinkProvider.java:60)
       at
org.netbeans.modules.cnd.completion.cplusplus.hyperlink.CsmAbstractHyperlinkProvider$1.run(CsmAbstractHyperlinkProvider.java:63)
       at org.netbeans.modules.cnd.modelimpl.csm.core.CodeModelRequestProcessor$1.run(CodeModelRequestProcessor.java:57)
       at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:499)
       at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:932)
"Code Model Parser 2":
       at sun.misc.Unsafe.park(Native Method)
       - parking to wait for  <0x81330ba0> (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync)
       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:712)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:743)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1079)
       at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:807)
       at org.netbeans.modules.cnd.repository.sfs.DoubleFileStorage.remove(DoubleFileStorage.java:147)
       at
org.netbeans.modules.cnd.repository.disk.FilePerUnitDiskRepositoryImpl.remove(FilePerUnitDiskRepositoryImpl.java:108)
       at org.netbeans.modules.cnd.repository.disk.DiskRepositoryManager.remove(DiskRepositoryManager.java:152)
       at org.netbeans.modules.cnd.repository.impl.SoftRefRepository.remove(SoftRefRepository.java:119)
       at org.netbeans.modules.cnd.repository.impl.SoftRefHybridRepository.remove(SoftRefHybridRepository.java:87)
       at org.netbeans.modules.cnd.modelimpl.repository.RepositoryUtils.remove(RepositoryUtils.java:82)
       at org.netbeans.modules.cnd.modelimpl.repository.RepositoryUtils.remove(RepositoryUtils.java:94)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl._clearIncludes(FileImpl.java:376)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl._reparse(FileImpl.java:292)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl.reparse(FileImpl.java:270)
       - locked <0x83ee8368> (a java.lang.Object)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl.ensureParsed(FileImpl.java:222)
       - locked <0x83ee8368> (a java.lang.Object)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ParserThread.run(ParserThread.java:66)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ParserThreadManager$Wrapper.run(ParserThreadManager.java:60)
       at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:499)
       at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:932)
"Repository writer 0":
       at org.netbeans.modules.cnd.modelimpl.uid.UIDObjectFactory.copySyncCollection(UIDObjectFactory.java:155)
       - waiting to lock <0x87f9aca0> (a java.util.ArrayList)
       at org.netbeans.modules.cnd.modelimpl.uid.UIDObjectFactory.writeUIDCollection(UIDObjectFactory.java:82)
       at org.netbeans.modules.cnd.modelimpl.csm.ClassImpl.write(ClassImpl.java:473)
       at
org.netbeans.modules.cnd.repository.support.AbstractObjectFactory.writeSelfPersistent(AbstractObjectFactory.java:44)
       at org.netbeans.modules.cnd.modelimpl.csm.core.CsmObjectFactory.write(CsmObjectFactory.java:365)
       at org.netbeans.modules.cnd.repository.sfs.BufferedRWAccess.write(BufferedRWAccess.java:95)
       at org.netbeans.modules.cnd.repository.sfs.IndexedStorageFile.put(IndexedStorageFile.java:104)
       at org.netbeans.modules.cnd.repository.sfs.DoubleFileStorage.put(DoubleFileStorage.java:134)
       at
org.netbeans.modules.cnd.repository.disk.FilePerUnitDiskRepositoryImpl.write(FilePerUnitDiskRepositoryImpl.java:56)
       at org.netbeans.modules.cnd.repository.disk.DiskRepositoryManager.write(DiskRepositoryManager.java:123)
       - locked <0x80f25bb0> (a java.lang.String)
       at org.netbeans.modules.cnd.repository.queue.RepositoryWritingThread.run(RepositoryWritingThread.java:84)
       at org.netbeans.modules.cnd.repository.queue.RepositoryThreadManager$Wrapper.run(RepositoryThreadManager.java:62)
       at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:499)
       at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:932)
"Code Model Parser 1":
       at sun.misc.Unsafe.park(Native Method)
       - parking to wait for  <0x80f9e520> (a java.util.concurrent.locks.ReentrantReadWriteLock$FairSync)
       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:712)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:842)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1162)
       at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:594)
       at org.netbeans.modules.cnd.repository.impl.SoftRefHybridRepository.get(SoftRefHybridRepository.java:71)
       at org.netbeans.modules.cnd.modelimpl.repository.RepositoryUtils.get(RepositoryUtils.java:58)
       at org.netbeans.modules.cnd.modelimpl.uid.KeyBasedUID.getObject(KeyBasedUID.java:46)
       at org.netbeans.modules.cnd.modelimpl.uid.KeyBasedUID.getObject(KeyBasedUID.java:37)
       at org.netbeans.modules.cnd.modelimpl.uid.UIDCsmConverter.UIDtoIdentifiable(UIDCsmConverter.java:140)
       at org.netbeans.modules.cnd.modelimpl.uid.UIDCsmConverter.UIDsToList(UIDCsmConverter.java:130)
       at org.netbeans.modules.cnd.modelimpl.uid.UIDCsmConverter.UIDsToDeclarations(UIDCsmConverter.java:106)
       at org.netbeans.modules.cnd.modelimpl.csm.ClassImpl.getMembers(ClassImpl.java:336)
       - locked <0x87f9aca0> (a java.util.ArrayList)
       at org.netbeans.modules.cnd.modelimpl.csm.ClassImpl._clearMembers(ClassImpl.java:408)
       at org.netbeans.modules.cnd.modelimpl.csm.ClassImpl.dispose(ClassImpl.java:402)
       at org.netbeans.modules.cnd.modelimpl.csm.core.Utils.disposeAll(Utils.java:113)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl.disposeAll(FileImpl.java:349)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl._reparse(FileImpl.java:296)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl.reparse(FileImpl.java:270)
       - locked <0x83ee8818> (a java.lang.Object)
       at org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl.ensureParsed(FileImpl.java:222)
       - locked <0x83ee8818> (a java.lang.Object)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ParserThread.run(ParserThread.java:66)
       at org.netbeans.modules.cnd.modelimpl.csm.core.ParserThreadManager$Wrapper.run(ParserThreadManager.java:60)
       at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:499)
       at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:932)

Found 1 deadlock.
Comment 1 _ nzero2002 2007-06-13 13:53:06 UTC
The problem is the different order of lock requesting for different requests to the repository:
- remove: first, locks in code model are taken, then in the repository
- write (from the queue), first, the repository is locked, then code model (from the factory).

The solution is to put remove requests to the queue like it is done for put requests.
Comment 2 _ nzero2002 2007-06-13 14:22:40 UTC
IZ# 106477: remove requetsts are queued now. So the writing thread will do both write and remove. Not more necessary
keys (using single file repository and using threading ) are removed as well.
[The file was modified] 	1.1.2.5	repository/src/org/netbeans/modules/cnd/repository/disk/DiskRepositoryManager.java
[The file was modified] 	1.1.2.7.4.4	repository/src/org/netbeans/modules/cnd/repository/impl/SoftRefHybridRepository.java
[The file was modified] 	1.1.2.39.4.3	repository/src/org/netbeans/modules/cnd/repository/testbench/Stats.java