[ https://issues.apache.org/jira/browse/IGNITE-21231?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Vyacheslav Koptilin reassigned IGNITE-21231: -------------------------------------------- Assignee: Kirill Sizov > HeapLockManager#locks method do not provide all acuired locks > ------------------------------------------------------------- > > Key: IGNITE-21231 > URL: https://issues.apache.org/jira/browse/IGNITE-21231 > Project: Ignite > Issue Type: Bug > Reporter: Vladislav Pyatkov > Assignee: Kirill Sizov > Priority: Major > Labels: ignite-3 > > h3. Motivation > If a lock key does not use the context id (_LockKey#contextId_ is _null_), it > does not appear in the iterator. Here is a test that demonstrates incorrect > behavior: > {code:title=AbstractLockManagerTest.java} > @Test > public void simpleTest() { > UUID txId1 = TestTransactionIds.newTransactionId(); > LockKey key = new LockKey(0); > lockManager.acquire(txId1, key, S).join(); > assertTrue(lockManager.locks(txId1).hasNext()); > } > {code} > h3. Definition of done > Despite the fact that the method is used only in tests, it has to work > correctly. All locks should be in the lock iterator. > h3. Issue details. > The real issue is way more serious than described in the motivation section. > HeapLockManager contains HeapUnboundedLockManager: > {code:title=HeapLockManager.java} > public HeapLockManager() { > this(new WaitDieDeadlockPreventionPolicy(), SLOTS, SLOTS, new > HeapUnboundedLockManager()); > } > {code} > And this is how {{HeapLockManager.acquire}} looks like: > {code:title=HeapLockManager.java} > public CompletableFuture<Lock> acquire(UUID txId, LockKey lockKey, LockMode > lockMode) { > if (lockKey.contextId() == null) { // Treat this lock as a hierarchy > lock. > return parentLockManager.acquire(txId, lockKey, lockMode); > } > ... > // the rest of the body is omitted > } > {code} > So if a lock key lacks context id, it is forwarded to parentLockManager. > Unfortunately, it is the only place where the forwarding is used, other > methods like release do not check context id. > Imagine the code > {code} > LockKey key = new LockKey(0); > lockManager.acquire(txId1, key, S).join(); > lockManager.release(txId1, key, S); > {code} > In this case the lock is present in the parentLockManager only and is not > released with {{lockManager.release}} > This test will fail > {code:title=HeapLockManagerTest.java} > @Test > public void simpleTest() { > LockKey key = new LockKey(0); > > UUID txId1 = TestTransactionIds.newTransactionId(); > lockManager.acquire(txId1, key, X).join(); > assertTrue(lockManager.isEmpty()); > lockManager.release(txId1, key, X); > UUID txId2 = TestTransactionIds.newTransactionId(); > lockManager.acquire(txId2, key, X).join(); > } > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)