aboutsummaryrefslogtreecommitdiffstats
path: root/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java
diff options
context:
space:
mode:
Diffstat (limited to 'zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java')
-rw-r--r--zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java42
1 files changed, 35 insertions, 7 deletions
diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java
index beda7eaa142..24305539be5 100644
--- a/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java
+++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockStats.java
@@ -5,8 +5,8 @@ import com.yahoo.vespa.curator.Lock;
import java.time.Duration;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedDeque;
@@ -113,8 +113,8 @@ public class ThreadLockStats {
}
/** Mutable method (see class doc) */
- public void preRelease(String debug) {
- withLastLockAttempt(lockAttempt -> {
+ public void preRelease(String path, String debug) {
+ withLastLockAttemptFor(path, lockAttempt -> {
// Note on the order of these two statement: Same concerns apply here as in lockAcquired().
if (!lockAttempt.isReentry()) {
@@ -126,13 +126,13 @@ public class ThreadLockStats {
}
/** Mutable method (see class doc) */
- public void postRelease() {
- removeLastLockAttempt(LockAttempt::postRelease);
+ public void postRelease(String lockPath) {
+ removeLastLockAttemptFor(lockPath, LockAttempt::postRelease);
}
/** Mutable method (see class doc) */
- public void releaseFailed() {
- removeLastLockAttempt(LockAttempt::releaseFailed);
+ public void releaseFailed(String lockPath) {
+ removeLastLockAttemptFor(lockPath, LockAttempt::releaseFailed);
}
/** Mutable method (see class doc) */
@@ -240,4 +240,32 @@ public class ThreadLockStats {
LockStats.getGlobal().maybeSample(lockAttempt);
}
+
+ private void withLastLockAttemptFor(String lockPath, Consumer<LockAttempt> consumer) {
+ Iterator<LockAttempt> lockAttemptIterator = lockAttemptsStack.descendingIterator();
+ while (lockAttemptIterator.hasNext()) {
+ LockAttempt lockAttempt = lockAttemptIterator.next();
+ if (lockAttempt.getLockPath().equals(lockPath)) {
+ consumer.accept(lockAttempt);
+ return;
+ }
+ }
+
+ logger.warning("Unable to find any lock attempts for " + lockPath);
+ }
+
+ private void removeLastLockAttemptFor(String lockPath, Consumer<LockAttempt> consumer) {
+ Iterator<LockAttempt> lockAttemptIterator = lockAttemptsStack.descendingIterator();
+ while (lockAttemptIterator.hasNext()) {
+ LockAttempt lockAttempt = lockAttemptIterator.next();
+ if (lockAttempt.getLockPath().equals(lockPath)) {
+ lockAttemptIterator.remove();
+ consumer.accept(lockAttempt);
+ LockStats.getGlobal().maybeSample(lockAttempt);
+ return;
+ }
+ }
+
+ logger.warning("Unable to remove last lock attempt as no locks were found for " + lockPath);
+ }
}