summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@verizonmedia.com>2020-09-24 17:05:54 +0200
committerHåkon Hallingstad <hakon@verizonmedia.com>2020-09-24 17:05:54 +0200
commit731ec8fb898164b066b64d26019a74aa13b08710 (patch)
treedf15f03ca164712d512a202b26d5e794135df17a /node-repository
parent88db94528ecbb96f88e30c5fa69ea9427e8ef0a7 (diff)
Also show the longest-living historical locks, with stack trace
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LocksResponse.java32
1 files changed, 20 insertions, 12 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LocksResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LocksResponse.java
index bc4401ee03a..502bd6f3cd7 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LocksResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/LocksResponse.java
@@ -55,19 +55,13 @@ public class LocksResponse extends HttpResponse {
threadLockInfoCursor.setString("lock-path", threadLockInfo.getLockPath());
List<LockInfo> lockInfos = threadLockInfo.getLockInfos();
- if (!lockInfos.isEmpty()) {
- Cursor lockInfosCursor = threadLockInfoCursor.setArray("locks");
- lockInfos.forEach(lockInfo -> {
- Cursor lockInfoCursor = lockInfosCursor.addObject();
- lockInfoCursor.setString("invoke-acquire-time", toString(lockInfo.getTimeAcquiredWasInvoked()));
- lockInfoCursor.setLong("reentrancy-hold-count-on-acquire", lockInfo.getThreadHoldCountOnAcquire());
- lockInfoCursor.setString("acquire-timeout", lockInfo.getAcquireTimeout().toString());
- lockInfo.getTimeLockWasAcquired().ifPresent(instant -> lockInfoCursor.setString("lock-acquired-time", toString(instant)));
- lockInfoCursor.setString("lock-state", lockInfo.getLockState().name());
- lockInfo.getTimeTerminalStateWasReached().ifPresent(instant -> lockInfoCursor.setString("terminal-state-time", toString(instant)));
- });
- }
+ Cursor lockInfosCursor = threadLockInfoCursor.setArray("locks");
+ lockInfos.forEach(lockInfo -> setLockInfo(lockInfosCursor.addObject(), lockInfo, false));
});
+
+ List<LockInfo> slowLockInfos = ThreadLockInfo.getSlowLockInfos();
+ Cursor slowLocksCursor = root.setArray("slow-locks");
+ slowLockInfos.forEach(lockInfo -> setLockInfo(slowLocksCursor.addObject(), lockInfo, true));
}
@Override
@@ -80,6 +74,20 @@ public class LocksResponse extends HttpResponse {
return "application/json";
}
+ private void setLockInfo(Cursor lockInfoCursor, LockInfo lockInfo, boolean includeThreadInfo) {
+ if (includeThreadInfo) {
+ lockInfoCursor.setString("thread-name", lockInfo.getThreadName());
+ lockInfoCursor.setString("lock-path", lockInfo.getLockPath());
+ }
+ lockInfoCursor.setString("invoke-acquire-time", toString(lockInfo.getTimeAcquiredWasInvoked()));
+ lockInfoCursor.setLong("reentrancy-hold-count-on-acquire", lockInfo.getThreadHoldCountOnAcquire());
+ lockInfoCursor.setString("acquire-timeout", lockInfo.getAcquireTimeout().toString());
+ lockInfo.getTimeLockWasAcquired().ifPresent(instant -> lockInfoCursor.setString("lock-acquired-time", toString(instant)));
+ lockInfoCursor.setString("lock-state", lockInfo.getLockState().name());
+ lockInfo.getTimeTerminalStateWasReached().ifPresent(instant -> lockInfoCursor.setString("terminal-state-time", toString(instant)));
+ lockInfo.getStackTrace().ifPresent(stackTrace -> lockInfoCursor.setString("stack-trace", stackTrace));
+ }
+
private static String toString(Instant time) {
return Instant.ofEpochMilli(time.toEpochMilli()).toString();
}