[ 
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.

Reply via email to