[
https://issues.apache.org/jira/browse/JCR-2791?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jukka Zitting resolved JCR-2791.
--------------------------------
Resolution: Duplicate
Resolving as a duplicate of JCR-2699. I did a quick review of the relevant code
flows, and couldn't come up with any remaining deadlocks.
> Potential deadlock in LockManagerImpl
> -------------------------------------
>
> Key: JCR-2791
> URL: https://issues.apache.org/jira/browse/JCR-2791
> Project: Jackrabbit Content Repository
> Issue Type: Bug
> Components: jackrabbit-core
> Affects Versions: 2.0.0, 2.1.0, 2.1.1
> Reporter: Jukka Zitting
> Priority: Minor
>
> I have a deadlock case that consists of the following *three* threads
> blocking each other:
> Thread A - a writer that's waiting for a write lock on the SISM:
> - waiting on <0x29283ca6> (a
> EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$WriterLock)
> - locked <0x29283ca6> (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:1471)
> at
> org.apache.jackrabbit.core.state.SharedItemStateManager.access$200(SharedItemStateManager.java:112)
> at
> org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:555)
> at
> org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:1110)
> at
> org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1140)
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:351)
> at
> org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354)
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:326)
> at
> org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:328)
> at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1141)
> Thread B - a reader that's waiting for a read lock on the SISM:
> - waiting on <0x7d1d0717> (a
> EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$ReaderLock)
> - locked <0x7d1d0717> (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:1457)
> at
> org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:250)
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.getNodeState(LocalItemStateManager.java:107)
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.getItemState(LocalItemStateManager.java:172)
> at
> org.apache.jackrabbit.core.state.SessionItemStateManager.getItemState(SessionItemStateManager.java:200)
> at
> org.apache.jackrabbit.core.HierarchyManagerImpl.getItemState(HierarchyManagerImpl.java:152)
> at
> org.apache.jackrabbit.core.HierarchyManagerImpl.getPath(HierarchyManagerImpl.java:395)
> at
> org.apache.jackrabbit.core.CachingHierarchyManager.getPath(CachingHierarchyManager.java:232)
> at
> org.apache.jackrabbit.core.lock.LockManagerImpl.getPath(LockManagerImpl.java:856)
> at
> org.apache.jackrabbit.core.lock.LockManagerImpl.getLockInfo(LockManagerImpl.java:547)
> at
> org.apache.jackrabbit.core.lock.XALockManager.isLocked(XALockManager.java:158)
> at
> org.apache.jackrabbit.core.lock.SessionLockManager.isLocked(SessionLockManager.java:108)
> at org.apache.jackrabbit.core.NodeImpl.isLocked(NodeImpl.java:3325)
> Thread C - a writer that's delivering synchronous observation events to a
> LockManagerImpl instance:
> - waiting on <0x3fc267ca> (a
> org.apache.jackrabbit.core.state.LocalItemStateManager)
> - locked <0x3fc267ca> (a
> org.apache.jackrabbit.core.state.LocalItemStateManager)
> owned by Thread B
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.getItemState(LocalItemStateManager.java:167)
> at
> org.apache.jackrabbit.core.state.SessionItemStateManager.getItemState(SessionItemStateManager.java:200)
> at
> org.apache.jackrabbit.core.ItemManager.getItemData(ItemManager.java:390)
> at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:336)
> at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:615)
> at
> org.apache.jackrabbit.core.lock.LockManagerImpl.refresh(LockManagerImpl.java:1186)
> at
> org.apache.jackrabbit.core.lock.LockManagerImpl.nodeAdded(LockManagerImpl.java:1217)
> at
> org.apache.jackrabbit.core.lock.LockManagerImpl.onEvent(LockManagerImpl.java:1120)
> 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:765)
> at
> org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1140)
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:351)
> at
> org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354)
> at
> org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:326)
> at
> org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:328)
> at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1141)
> The problem here is that thread C is trying to deliver synchronous
> observation events (i.e. it's still holding a downgraded SISM lock) to the
> LockManagerImpl instance of the session used in thread B. The event handling
> code in LockManagerImpl uses the session-local LocalItemStateManager
> instance, whose monitor has already been entered by thread B. Thread B is
> being blocked by thread A and the writer preference nature of the SISM lock,
> and thread A can't proceed until thread C has released the SISM lock it's
> currently holding.
> The specific LocalItemStateManager synchronization block seen here has
> already been removed as a part of my JCR-2699 changes, so this specific
> deadlock can no longer occur with the latest trunk, but I'm still filing this
> issue at "Minor" priority as we should still review the above scenario for
> other potential deadlock issues. Ideally we'd either make the LockManagerImpl
> use normal instead of synchronous observation, or avoid ItemManager access in
> the LockManagerImpl event processing code.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.