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

        

Reply via email to