From 44c957d851a04563052ce61a71ca9642646a42b5 Mon Sep 17 00:00:00 2001 From: Michiel Meeuwissen Date: Fri, 29 Nov 2024 12:37:13 +0100 Subject: [PATCH] May be a (delayed) lock on mid, might fix the issue. Presuming that it is some race condition. --- .../java/nl/vpro/util/locker/ObjectLocker.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/vpro-shared-util/src/main/java/nl/vpro/util/locker/ObjectLocker.java b/vpro-shared-util/src/main/java/nl/vpro/util/locker/ObjectLocker.java index eb178c3de..7d635aa50 100644 --- a/vpro-shared-util/src/main/java/nl/vpro/util/locker/ObjectLocker.java +++ b/vpro-shared-util/src/main/java/nl/vpro/util/locker/ObjectLocker.java @@ -227,7 +227,7 @@ public static LockHolderCloser acquireLock( locks.remove(key); continue; } - closer = new LockHolderCloser<>(nanoStart, locks, holder); + closer = new LockHolderCloser<>(nanoStart, locks, holder, true); if (holder.lock.isLocked() && !holder.lock.isHeldByCurrentThread()) { log.debug("There are already threads ({}) for {}, waiting", holder.lock.getQueueLength(), key); alreadyWaiting = true; @@ -327,7 +327,8 @@ private static void releaseLock( final @NonNull K key, final @NonNull String reason, final @NonNull Map> locks, - final @NonNull LockHolder lock) { + final @NonNull LockHolder lock, + final boolean checkIfCurrentThread) { synchronized (locks) { if (lock.lock.getHoldCount() == 1) { if (!lock.lock.hasQueuedThreads()) { @@ -342,7 +343,7 @@ private static void releaseLock( Slf4jHelper.log(log, duration.compareTo(lock.warnTime)> 0 ? Level.WARN : Level.DEBUG, "Released lock for {} ({}) in {}", key, reason, Duration.ofNanos(System.nanoTime() - nanoStart)); } - if (lock.lock.isHeldByCurrentThread()) { // MSE-4946 + if (! checkIfCurrentThread || lock.lock.isHeldByCurrentThread()) { // MSE-4946 HOLDS.get().remove(lock); lock.lock.unlock(); } else { @@ -456,19 +457,25 @@ public static class LockHolderCloser implements AutoClos final long nanoStart; + @With + final boolean checkIfCurrentThread; + final @NonNull Map> locks; + private LockHolderCloser( final long nanoStart, @NonNull Map> locks, - @NonNull LockHolder lockHolder) { + @NonNull LockHolder lockHolder, + final boolean checkIfCurrentThread) { this.nanoStart = nanoStart; this.locks = locks; this.lockHolder = lockHolder; + this.checkIfCurrentThread = checkIfCurrentThread; } @Override public void close() { - releaseLock(nanoStart, lockHolder.key, lockHolder.reason, locks, lockHolder); + releaseLock(nanoStart, lockHolder.key, lockHolder.reason, locks, lockHolder, checkIfCurrentThread); } }