summaryrefslogtreecommitdiffstats
path: root/zkfacade
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@verizonmedia.com>2020-09-25 09:23:24 +0200
committerHåkon Hallingstad <hakon@verizonmedia.com>2020-09-25 09:23:24 +0200
commit032d45a7cdab3ab4f358ac0371a5d6b0eb57415a (patch)
treefba96b3e03c454f633b1aa2aa4a2b34a556fd91b /zkfacade
parented06bab257cbaba2a2ea21df3d51f91d5ba6470c (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.java15
-rw-r--r--zkfacade/src/main/java/com/yahoo/vespa/curator/stats/ThreadLockInfo.java6
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);