diff options
author | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-09-25 09:23:24 +0200 |
---|---|---|
committer | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-09-25 09:23:24 +0200 |
commit | 032d45a7cdab3ab4f358ac0371a5d6b0eb57415a (patch) | |
tree | fba96b3e03c454f633b1aa2aa4a2b34a556fd91b /zkfacade | |
parent | ed06bab257cbaba2a2ea21df3d51f91d5ba6470c (diff) |
Add duration of acquire, in locked, and total
Diffstat (limited to 'zkfacade')
-rw-r--r-- | zkfacade/src/main/java/com/yahoo/vespa/curator/stats/LockInfo.java | 15 | ||||
-rw-r--r-- | zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockInfo.java | 6 |
2 files changed, 18 insertions, 3 deletions
diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/LockInfo.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/LockInfo.java index 00583311ae9..37481a6b1c7 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/LockInfo.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/LockInfo.java @@ -59,8 +59,20 @@ public class LockInfo { public Optional<Instant> getTimeTerminalStateWasReached() { return terminalStateInstant; } public Optional<String> getStackTrace() { return stackTrace; } + public Duration getDurationOfAcquire() { + return Duration.between(acquireInstant, lockAcquiredInstant.orElseGet(Instant::now)); + } + + public Duration getDurationWithLock() { + return lockAcquiredInstant + .map(start -> Duration.between(start, terminalStateInstant.orElseGet(Instant::now))) + .orElse(Duration.ZERO); + } + + public Duration getDuration() { return Duration.between(acquireInstant, terminalStateInstant.orElseGet(Instant::now)); } + /** Get time from just before trying to acquire lock to the time the terminal state was reached, or ZERO. */ - public Duration getTotalTime() { + public Duration getDurationInTerminalStateAndForPriorityQueue() { return terminalStateInstant.map(instant -> Duration.between(acquireInstant, instant)).orElse(Duration.ZERO); } @@ -74,6 +86,7 @@ public class LockInfo { var stackTrace = new StringBuilder(); StackTraceElement[] elements = thread.getStackTrace(); + // first stack frame is "java.lang.Thread(Thread.java:1606)" or "jdk.internal.misc.Unsafe(Unsafe.java:-2)"!? for (int i = 0; i < elements.length; ++i) { var element = elements[i]; stackTrace.append(element.getClassName()) diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockInfo.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockInfo.java index 2e4672841bf..0ca9377d360 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockInfo.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockInfo.java @@ -30,7 +30,8 @@ public class ThreadLockInfo { private static final int MAX_COMPLETED_LOCK_INFOS_SIZE = 5; /** Would have used a thread-safe priority queue. */ private static final Object completedLockInfosMonitor = new Object(); - private static final PriorityQueue<LockInfo> completedLockInfos = new PriorityQueue<>(Comparator.comparing(LockInfo::getTotalTime)); + private static final PriorityQueue<LockInfo> completedLockInfos = + new PriorityQueue<>(Comparator.comparing(LockInfo::getDurationInTerminalStateAndForPriorityQueue)); private static final ConcurrentHashMap<String, LockCounters> countersByLockPath = new ConcurrentHashMap<>(); @@ -126,7 +127,8 @@ public class ThreadLockInfo { if (completedLockInfos.size() < MAX_COMPLETED_LOCK_INFOS_SIZE) { lockInfo.fillStackTrace(); completedLockInfos.add(lockInfo); - } else if (lockInfo.getTotalTime().compareTo(completedLockInfos.peek().getTotalTime()) > 0) { + } else if (lockInfo.getDurationInTerminalStateAndForPriorityQueue() + .compareTo(completedLockInfos.peek().getDurationInTerminalStateAndForPriorityQueue()) > 0) { completedLockInfos.poll(); lockInfo.fillStackTrace(); completedLockInfos.add(lockInfo); |