diff --git a/modules/platforms/cpp/tests/client-test/compute_test.cpp b/modules/platforms/cpp/tests/client-test/compute_test.cpp
index a7feaf9..a58762c 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 @@
     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 8c4cce4..a1222eb 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 @@
         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 @@
         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 @@
                 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 @@
                 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 @@
     @Override
     public boolean isEmpty() {
         for (LockState slot : slots) {
-            if (!slot.waiters.isEmpty()) {
+            if (slot.waitersCount() != 0) {
                 return false;
             }
         }
@@ -336,6 +309,25 @@
         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 @@
             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 @@
                 waiter.notifyLocked();
             }
 
-            return markedForRemove;
+            return key != null && waitersCount() == 0;
         }
 
         /**
@@ -557,7 +556,7 @@
                 waiter.notifyLocked();
             }
 
-            return markedForRemove;
+            return key != null && waitersCount() == 0;
         }
 
         /**
@@ -570,10 +569,6 @@
             waiters.remove(txId);
 
             if (waiters.isEmpty()) {
-                if (key != null) {
-                    markedForRemove = true;
-                }
-
                 return emptyList();
             }
 
