diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-07-30 11:23:00 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-07-30 11:23:00 +0200 |
commit | 0f544a9e52731b15c45b29065a8aab47a46072b0 (patch) | |
tree | 0f0d62c1e0b09a8558e52e0cb8cd301217ddbb17 /node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java | |
parent | dd0fffa63ae9f5da15e2ea18ba879a356d15ea99 (diff) |
Report jstack for java cores
Diffstat (limited to 'node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java')
-rw-r--r-- | node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java index 2cddee6aa2a..6e5f65a5d48 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java @@ -77,10 +77,23 @@ public class CoreCollector { List<String> readBacktrace(NodeAgentContext context, Path coredumpPath, Path binPath, boolean allThreads) { String threads = allThreads ? "thread apply all bt" : "bt"; String[] command = {gdb.toString(), "-n", "-ex", threads, "-batch", binPath.toString(), coredumpPath.toString()}; + ProcessResult result = docker.executeCommandInContainerAsRoot(context, command); - if (result.getExitStatus() != 0) { + if (result.getExitStatus() != 0) throw new RuntimeException("Failed to read backtrace " + result + ", Command: " + Arrays.toString(command)); - } + + return Arrays.asList(result.getOutput().split("\n")); + } + + List<String> readJstack(NodeAgentContext context, Path coredumpPath, Path binPath) { + String[] command = isRunningVespa6(context) ? + new String[] {"jstack", binPath.toString(), coredumpPath.toString()} : + new String[] {"jhsdb", "jstack", "--exe", binPath.toString(), "--core", coredumpPath.toString()}; + + ProcessResult result = docker.executeCommandInContainerAsRoot(context, command); + if (result.getExitStatus() != 0) + throw new RuntimeException("Failed to read jstack " + result + ", Command: " + Arrays.toString(command)); + return Arrays.asList(result.getOutput().split("\n")); } @@ -96,11 +109,19 @@ public class CoreCollector { Path binPath = readBinPath(context, coredumpPath); data.put("bin_path", binPath.toString()); - data.put("backtrace", readBacktrace(context, coredumpPath, binPath, false)); - data.put("backtrace_all_threads", readBacktrace(context, coredumpPath, binPath, true)); + if (binPath.getFileName().toString().equals("java")) { + data.put("backtrace_all_threads", readJstack(context, coredumpPath, binPath)); + } else { + data.put("backtrace", readBacktrace(context, coredumpPath, binPath, false)); + data.put("backtrace_all_threads", readBacktrace(context, coredumpPath, binPath, true)); + } } catch (RuntimeException e) { context.log(logger, Level.WARNING, "Failed to extract backtrace", e); } return data; } + + private static boolean isRunningVespa6(NodeAgentContext context) { + return context.node().wantedVespaVersion().map(v -> v.getMajor() == 6).orElse(false); + } } |