This is an automated email from the ASF dual-hosted git repository. sanpwc pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 9036b30bef IGNITE-22054 Fix ItMultipleLocksTest#test (#3632) 9036b30bef is described below commit 9036b30befc3b8434a51cda94efa8d036413693f Author: Alexander Lapin <lapin1...@gmail.com> AuthorDate: Fri Apr 19 18:56:18 2024 +0300 IGNITE-22054 Fix ItMultipleLocksTest#test (#3632) --- .../cpp/tests/client-test/compute_test.cpp | 2 +- .../ignite/internal/tx/impl/HeapLockManager.java | 75 ++++++++++------------ 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/modules/platforms/cpp/tests/client-test/compute_test.cpp b/modules/platforms/cpp/tests/client-test/compute_test.cpp index a7feaf9efc..a58762c712 100644 --- a/modules/platforms/cpp/tests/client-test/compute_test.cpp +++ b/modules/platforms/cpp/tests/client-test/compute_test.cpp @@ -458,7 +458,7 @@ TEST_F(compute_test, job_execution_status_executing) { EXPECT_EQ(job_state::EXECUTING, status->state); } -TEST_F(compute_test, job_execution_status_completed) { +TEST_F(compute_test, DISABLED_job_execution_status_completed) { const std::int32_t sleep_ms = 1; auto execution = m_client.get_compute().submit({get_node(1)}, {}, SLEEP_JOB, {sleep_ms}, {}); diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java index 8c4cce4c10..a1222eb00a 100644 --- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java +++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java @@ -189,17 +189,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP LockState state = lockState(lock.lockKey()); if (state.tryRelease(lock.txId())) { - locks.compute(lock.lockKey(), (k, v) -> { - // Mapping may already change. - if (v != state || !v.markedForRemove) { - return v; - } - - // markedForRemove state should be cleared on entry reuse to avoid race. - v.key = null; - empty.add(v); - return null; - }); + locks.compute(lock.lockKey(), (k, v) -> adjustLockState(state, v)); } } @@ -215,16 +205,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP LockState state = lockState(lockKey); if (state.tryRelease(txId, lockMode)) { - locks.compute(lockKey, (k, v) -> { - // Mapping may already change. - if (v != state || !v.markedForRemove) { - return v; - } - - v.key = null; - empty.add(v); - return null; - }); + locks.compute(lockKey, (k, v) -> adjustLockState(state, v)); } } @@ -237,16 +218,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP if (state.tryRelease(txId)) { LockKey key = state.key; // State may be already invalidated. if (key != null) { - locks.compute(key, (k, v) -> { - // Mapping may already change. - if (v != state || !v.markedForRemove) { - return v; - } - - v.key = null; - empty.add(v); - return null; - }); + locks.compute(key, (k, v) -> adjustLockState(state, v)); } } } @@ -293,6 +265,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP v = empty.poll(); if (v == null) { res[0] = slots[index]; + assert !res[0].markedForRemove; } else { v.markedForRemove = false; v.key = k; @@ -324,7 +297,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP @Override public boolean isEmpty() { for (LockState slot : slots) { - if (!slot.waiters.isEmpty()) { + if (slot.waitersCount() != 0) { return false; } } @@ -336,6 +309,25 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP return fireEvent(LockEvent.LOCK_CONFLICT, params).thenApply(v -> false); } + @Nullable + private LockState adjustLockState(LockState state, LockState v) { + // Mapping may already change. + if (v != state) { + return v; + } + + synchronized (v.waiters) { + if (v.waiters.isEmpty()) { + v.markedForRemove = true; + v.key = null; + empty.add(v); + return null; + } else { + return v; + } + } + } + /** * A lock state. */ @@ -425,8 +417,15 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP return new IgniteBiTuple<>(waiter.fut, waiter.lockMode()); } - public synchronized int waitersCount() { - return waiters.size(); + /** + * Returns waiters count. + * + * @return waiters count. + */ + public int waitersCount() { + synchronized (waiters) { + return waiters.size(); + } } /** @@ -523,7 +522,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP waiter.notifyLocked(); } - return markedForRemove; + return key != null && waitersCount() == 0; } /** @@ -557,7 +556,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP waiter.notifyLocked(); } - return markedForRemove; + return key != null && waitersCount() == 0; } /** @@ -570,10 +569,6 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP waiters.remove(txId); if (waiters.isEmpty()) { - if (key != null) { - markedForRemove = true; - } - return emptyList(); }