diff options
author | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-09-24 17:05:54 +0200 |
---|---|---|
committer | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-09-24 17:05:54 +0200 |
commit | 731ec8fb898164b066b64d26019a74aa13b08710 (patch) | |
tree | df15f03ca164712d512a202b26d5e794135df17a /node-repository | |
parent | 88db94528ecbb96f88e30c5fa69ea9427e8ef0a7 (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.java | 32 |
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(); } |