[
https://issues.apache.org/jira/browse/JCR-2865?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12984133#action_12984133
]
Jukka Zitting commented on JCR-2865:
------------------------------------
OK, thanks! See JCR-2828 for an earlier related issue, and JCR-2753 for a case
where the reentrancy requirement came up earlier.
In general I think we shouldn't use DefaultISMLocking as a generic read/write
lock in InternalVersionManagerBase, but I don't have a direct replacement in
mind.
> 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.