[
https://issues.apache.org/jira/browse/JCR-2865?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12984052#action_12984052
]
codeparser commented on JCR-2865:
---------------------------------
The dead lock thread is as follows:
thread 1148 first time get read lock: InternalVersionManagerImpl line 324
second time get : InternalVersionImpl line 149
"Thread-1148" daemon prio=6 tid=0x4a409400 nid=0x15a0 in Object.wait()
[0x4d27f000..0x4d27fb94]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x099abc00> (a
org.apache.jackrabbit.core.state.DefaultISMLocking)
at java.lang.Object.wait(Object.java:485)
at
org.apache.jackrabbit.core.state.DefaultISMLocking.acquireReadLock(DefaultISMLocking.java:92)
- locked <0x099abc00> (a
org.apache.jackrabbit.core.state.DefaultISMLocking)
at
org.apache.jackrabbit.core.version.InternalVersionManagerBase.acquireReadLock(InternalVersionManagerBase.java:196)
at
org.apache.jackrabbit.core.version.InternalVersionImpl.getSuccessors(InternalVersionImpl.java:149)
at
org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.init(InternalVersionHistoryImpl.java:165)
- locked <0x03a6d180> (a
org.apache.jackrabbit.core.version.InternalVersionHistoryImpl)
at
org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.<init>(InternalVersionHistoryImpl.java:113)
at
org.apache.jackrabbit.core.version.InternalVersionManagerBase.createInternalVersionItem(InternalVersionManagerBase.java:806
at
org.apache.jackrabbit.core.version.InternalVersionManagerImpl.getItem(InternalVersionManagerImpl.java:329)
- locked <0x099abd08> (a
org.apache.commons.collections.map.ReferenceMap)
at
org.apache.jackrabbit.core.version.InternalXAVersionManager.getItem(InternalXAVersionManager.java:429)
at
org.apache.jackrabbit.core.version.InternalVersionManagerBase.getVersionHistory(InternalVersionManagerBase.java:134)
at
org.apache.jackrabbit.core.version.InternalXAVersionManager.getVersionHistory(InternalXAVersionManager.java:58)
at
org.apache.jackrabbit.core.version.InternalVersionManagerBase.checkin(InternalVersionManagerBase.java:583)
at
org.apache.jackrabbit.core.version.InternalXAVersionManager.checkin(InternalXAVersionManager.java:236)
at
org.apache.jackrabbit.core.version.VersionManagerImplBase.checkoutCheckin(VersionManagerImplBase.java:190)
at
org.apache.jackrabbit.core.VersionManagerImpl.access$1(VersionManagerImpl.java:1)
at
org.apache.jackrabbit.core.VersionManagerImpl$1.perform(VersionManagerImpl.java:121)
at
org.apache.jackrabbit.core.VersionManagerImpl$1.perform(VersionManagerImpl.java:1)
at
org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:200)
at
org.apache.jackrabbit.core.VersionManagerImpl.perform(VersionManagerImpl.java:95)
at
org.apache.jackrabbit.core.VersionManagerImpl.checkin(VersionManagerImpl.java:114)
at
org.apache.jackrabbit.core.VersionManagerImpl.checkin(VersionManagerImpl.java:100)
at org.apache.jackrabbit.core.NodeImpl.checkin(NodeImpl.java:2844)
at
com.vitria.modeling.repository.sapi.service.jcr.access.JcrAccessUtil.checkin(JcrAccessUtil.java:580)
at
com.vitria.modeling.repository.sapi.service.jcr.JcrLeaveNodeImpl.checkin(JcrLeaveNodeImpl.java:54)
at
com.vitria.modeling.repository.sapi.service.core.CoreModel.checkin(CoreModel.java:101)
at
com.vitria.modeling.repository.sapi.service.core.CoreModel.checkin(CoreModel.java:66)
at
com.vitria.modeling.repository.sapi.service.proxy.local.LocalModel.checkin(LocalModel.java:62)
at
com.vitria.modeling.repository.sapi.usecase.transaction.ModelModifier.action(DeadLockTest.java:197)
at
com.vitria.modeling.repository.sapi.usecase.transaction.AbstractTestThread.run(DeadLockTest.java:156)
> a dead lock in DefaultISMLocking
> --------------------------------
>
> Key: JCR-2865
> URL: https://issues.apache.org/jira/browse/JCR-2865
> Project: Jackrabbit Content Repository
> Issue Type: Bug
> Components: jackrabbit-core
> Affects Versions: 2.2.0
> Environment: winXP/JDK1.6
> Reporter: codeparser
> Attachments: trackReader.diff
>
>
> The jackrabbit 2.2 's org.apache.jackrabbit.core.state.DefaultISMLocking has
> a defect which will cause a dead lock in concurrent use cases.
> The use case is as follows:
> 1. Thread A apply a read lock, now there is an active reader hold the read
> lock.
> 2. Thread B apply a write lock, and then thread B will wait for thread A's
> reading end. You could see below code snippet from the Jackrabbit source.
> readerCount is the current active reader.
> writersWaiting++;
> while (writerId != null? !isSameThreadId(writerId, currentId) : readerCount >
> 0) {
> wait();
> }
> 3. Thread A apply another read lock, then it will wait too, since there is
> a writer is waiting. Then a dead lock happens.
> while (writerId != null? (writerCount > 0 && !isSameThreadId(writerId,
> currentId)): writersWaiting > 0) {
> wait();
> }
> Since the lock in DefaultISMLocking is global lock, so I think if a thread
> has already hold a reader lock, it could get the reader lock again. I create
> a fix with this idea.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.