[ https://issues.apache.org/jira/browse/JCR-2890?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12994359#comment-12994359 ]
Jukka Zitting commented on JCR-2890: ------------------------------------ Note that at least this specific deadlock scenario can not occur with the FineGrainedISMLocking strategy, since it never blocks incoming readers when there are writers waiting for the lock. > Deadlock in acl.EntryCollector / ItemManager > -------------------------------------------- > > Key: JCR-2890 > URL: https://issues.apache.org/jira/browse/JCR-2890 > Project: Jackrabbit Content Repository > Issue Type: Bug > Components: jackrabbit-core > Affects Versions: 2.2.4 > Reporter: Jukka Zitting > > Here's another three-way deadlock that we've encountered: > * Thread A holds a downgraded SISM write lock and is about to start > delivering observation events to synchronous listeners > * Thread B wants to write something and blocks waiting for the SISM write > lock (since A holds the lock) > * Thread C wants to read something and blocks waiting for the SISM read lock > (since B waits for the lock) > Normally such a scenario is handled without any problems, but there's a > problem if the session used by thread C has a synchronous observation > listener that attempts to read something from the repository during event > delivery. In this case the following can happen: > * Thread C holds the ItemManager synchronization lock higher up in the call > chain > * Observation listener code called by thread A attempts to read something > from the repository, and blocks trying to acquire the ItemManager > synchronization lock (since C holds it) > In principle such a scenario should never happen as an observation listener > (much less a synchronous one) should never try to use the session that might > already be in use by another thread. > Unfortunately the EntryCollector class in > o.a.j.core.security.authorization.acl does not follow this guideline, which > leads to the deadlock as shown below: > Thread A: > "127.0.0.1 [1297191119365] POST /bin/wcmcommand HTTP/1.0" nid=1179 > state=BLOCKED > - waiting on <0x11c329fd> (a org.apache.jackrabbit.core.ItemManager) > - locked <0x11c329fd> (a org.apache.jackrabbit.core.ItemManager) > owned by 127.0.0.1 [1297191138443] POST /bin/wcmcommand HTTP/1.0 id=67 > at org.apache.jackrabbit.core.ItemManager.getNode(ItemManager.java:653) > at org.apache.jackrabbit.core.ItemManager.getNode(ItemManager.java:605) > at org.apache.jackrabbit.core.SessionImpl.getNode(SessionImpl.java:1406) > at > org.apache.jackrabbit.core.security.authorization.acl.EntryCollector.onEvent(EntryCollector.java:253) > at > org.apache.jackrabbit.core.observation.EventConsumer.consumeEvents(EventConsumer.java:246) > at > org.apache.jackrabbit.core.observation.ObservationDispatcher.dispatchEvents(ObservationDispatcher.java:214) > at > org.apache.jackrabbit.core.observation.EventStateCollection.dispatch(EventStateCollection.java:475) > at > org.apache.jackrabbit.core.state.SharedItemStateManager$Update.end(SharedItemStateManager.java:786) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1488) > at > org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:349) > at > org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354) > at > org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:324) > at > org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:328) > at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1141) > at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:920) > Thread B: > "Thread-2438" nid=2582 state=WAITING > - waiting on <0x166e790e> (a > EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$WriterLock) > - locked <0x166e790e> (a > EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$WriterLock) > at java.lang.Object.wait(Native Method) > at java.lang.Object.wait(Object.java:485) > at > EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$WriterLock.acquire(Unknown > Source) > at > org.apache.jackrabbit.core.state.DefaultISMLocking$WriteLockImpl.<init>(DefaultISMLocking.java:76) > at > org.apache.jackrabbit.core.state.DefaultISMLocking$WriteLockImpl.<init>(DefaultISMLocking.java:70) > at > org.apache.jackrabbit.core.state.DefaultISMLocking.acquireWriteLock(DefaultISMLocking.java:64) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.acquireWriteLock(SharedItemStateManager.java:1808) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.access$200(SharedItemStateManager.java:112) > at > org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:565) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:1458) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1488) > at > org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:349) > at > org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354) > at > org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:324) > at > org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:328) > at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1141) > at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:920) > Thread C: > "127.0.0.1 [1297191138443] POST /bin/wcmcommand HTTP/1.0" nid=67 state=WAITING > - waiting on <0xf820edb> (a > EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$ReaderLock) > - locked <0xf820edb> (a > EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$ReaderLock) > at java.lang.Object.wait(Native Method) > at java.lang.Object.wait(Object.java:485) > at > EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$ReaderLock.acquire(Unknown > Source) > at > org.apache.jackrabbit.core.state.DefaultISMLocking$ReadLockImpl.<init>(DefaultISMLocking.java:102) > at > org.apache.jackrabbit.core.state.DefaultISMLocking$ReadLockImpl.<init>(DefaultISMLocking.java:96) > at > org.apache.jackrabbit.core.state.DefaultISMLocking.acquireReadLock(DefaultISMLocking.java:53) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.acquireReadLock(SharedItemStateManager.java:1794) > at > org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257) > at > org.apache.jackrabbit.core.state.LocalItemStateManager.getNodeState(LocalItemStateManager.java:107) > at > org.apache.jackrabbit.core.state.LocalItemStateManager.getItemState(LocalItemStateManager.java:171) > at > org.apache.jackrabbit.core.state.SessionItemStateManager.getItemState(SessionItemStateManager.java:200) > at > org.apache.jackrabbit.core.ItemManager.getItemData(ItemManager.java:391) > at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:337) > at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:638) > at > org.apache.jackrabbit.core.security.authorization.acl.ACLProvider$AclPermissions.canRead(ACLProvider.java:507) > - locked java.lang.Object@6ad9b475 > at > org.apache.jackrabbit.core.security.DefaultAccessManager.canRead(DefaultAccessManager.java:251) > at > org.apache.jackrabbit.core.query.lucene.QueryResultImpl.isAccessGranted(QueryResultImpl.java:374) > at > org.apache.jackrabbit.core.query.lucene.QueryResultImpl.collectScoreNodes(QueryResultImpl.java:353) > at > org.apache.jackrabbit.core.query.lucene.QueryResultImpl.getResults(QueryResultImpl.java:310) > at > org.apache.jackrabbit.core.query.lucene.SingleColumnQueryResult.<init>(SingleColumnQueryResult.java:70) > at > org.apache.jackrabbit.core.query.lucene.QueryImpl.execute(QueryImpl.java:133) > at org.apache.jackrabbit.core.query.QueryImpl.execute(QueryImpl.java:127) -- This message is automatically generated by JIRA. - For more information on JIRA, see: http://www.atlassian.com/software/jira