aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@vespa.ai>2023-11-04 09:44:19 +0100
committerValerij Fredriksen <valerijf@vespa.ai>2023-11-04 09:44:44 +0100
commit808831f0b51fd4f85239e5659cc1fb8200c70994 (patch)
tree0017c10f1adcf750442fcd98a513fa52910155da /node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java
parentdf7854e4c340ea814ca5cdf128fc31828a4b543b (diff)
Reapply "Move node-admin"
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.java132
1 files changed, 0 insertions, 132 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
deleted file mode 100644
index 0028784eec8..00000000000
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.node.admin.maintenance.coredump;
-
-import com.yahoo.vespa.hosted.node.admin.configserver.cores.CoreDumpMetadata;
-import com.yahoo.vespa.hosted.node.admin.container.ContainerOperations;
-import com.yahoo.vespa.hosted.node.admin.nodeadmin.ConvergenceException;
-import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext;
-import com.yahoo.vespa.hosted.node.admin.task.util.file.UnixPath;
-import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerPath;
-import com.yahoo.vespa.hosted.node.admin.task.util.process.CommandResult;
-
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Takes in an uncompressed core dump and collects relevant metadata.
- *
- * @author freva
- */
-public class CoreCollector {
- private static final Logger logger = Logger.getLogger(CoreCollector.class.getName());
-
- private static final Pattern JAVA_HEAP_DUMP_PATTERN = Pattern.compile("java_pid.*\\.hprof$");
- private static final Pattern CORE_GENERATOR_PATH_PATTERN = Pattern.compile("(?m)^Core was generated by `(?<path>.*?)'\\.");
- private static final Pattern EXECFN_PATH_PATTERN = Pattern.compile("^.* execfn: '(?<path>.*?)'");
- private static final Pattern FROM_PATH_PATTERN = Pattern.compile("^.* from '(?<path>.*?)'");
- static final String GDB_PATH_RHEL8 = "/opt/rh/gcc-toolset-12/root/bin/gdb";
-
- private final ContainerOperations container;
-
- public CoreCollector(ContainerOperations container) {
- this.container = container;
- }
-
- String readBinPathFallback(NodeAgentContext context, ContainerPath coredumpPath) {
- String[] command = {GDB_PATH_RHEL8, "-n", "-batch", "-core", coredumpPath.pathInContainer()};
- CommandResult result = container.executeCommandInContainer(context, context.users().root(), command);
-
- Matcher matcher = CORE_GENERATOR_PATH_PATTERN.matcher(result.getOutput());
- if (! matcher.find()) {
- throw ConvergenceException.ofError(String.format("Failed to extract binary path from GDB, result: %s, command: %s",
- asString(result), Arrays.toString(command)));
- }
- return matcher.group("path").split(" ")[0];
- }
-
- String readBinPath(NodeAgentContext context, ContainerPath coredumpPath) {
- String[] command = {"file", coredumpPath.pathInContainer()};
- try {
- CommandResult result = container.executeCommandInContainer(context, context.users().root(), command);
- if (result.getExitCode() != 0) {
- throw ConvergenceException.ofError("file command failed with " + asString(result));
- }
-
- Matcher execfnMatcher = EXECFN_PATH_PATTERN.matcher(result.getOutput());
- if (execfnMatcher.find()) {
- return execfnMatcher.group("path").split(" ")[0];
- }
-
- Matcher fromMatcher = FROM_PATH_PATTERN.matcher(result.getOutput());
- if (fromMatcher.find()) {
- return fromMatcher.group("path").split(" ")[0];
- }
- } catch (RuntimeException e) {
- context.log(logger, Level.WARNING, String.format("Failed getting bin path, command: %s. " +
- "Trying fallback instead", Arrays.toString(command)), e);
- }
-
- return readBinPathFallback(context, coredumpPath);
- }
-
- List<String> readBacktrace(NodeAgentContext context, ContainerPath coredumpPath, String binPath, boolean allThreads) {
- String threads = allThreads ? "thread apply all bt" : "bt";
- String[] command = {GDB_PATH_RHEL8, "-n", "-ex", "set print frame-arguments none",
- "-ex", threads, "-batch", binPath, coredumpPath.pathInContainer()};
-
- CommandResult result = container.executeCommandInContainer(context, context.users().root(), command);
- if (result.getExitCode() != 0)
- throw ConvergenceException.ofError("Failed to read backtrace " + asString(result) + ", Command: " + Arrays.toString(command));
-
- return List.of(result.getOutput().split("\n"));
- }
-
- List<String> readJstack(NodeAgentContext context, ContainerPath coredumpPath, String binPath) {
- String[] command = {"jhsdb", "jstack", "--exe", binPath, "--core", coredumpPath.pathInContainer()};
-
- CommandResult result = container.executeCommandInContainer(context, context.users().root(), command);
- if (result.getExitCode() != 0)
- throw ConvergenceException.ofError("Failed to read jstack " + asString(result) + ", Command: " + Arrays.toString(command));
-
- return List.of(result.getOutput().split("\n"));
- }
-
- CoreDumpMetadata collect(NodeAgentContext context, ContainerPath coredumpPath) {
- var metadata = new CoreDumpMetadata()
- .setCreated(new UnixPath(coredumpPath).getLastModifiedTime());
-
- if (JAVA_HEAP_DUMP_PATTERN.matcher(coredumpPath.getFileName().toString()).find()) {
- metadata.setType(CoreDumpMetadata.Type.JVM_HEAP)
- .setBinPath("java")
- .setBacktrace(List.of("Heap dump, no backtrace available"));
- return metadata;
- }
-
- try {
- String binPath = context.paths().underVespaHome("").resolve(readBinPath(context, coredumpPath)).pathInContainer();
- metadata.setType(CoreDumpMetadata.Type.CORE_DUMP).setBinPath(binPath);
-
- if (Path.of(binPath).getFileName().toString().equals("java")) {
- metadata.setBacktraceAllThreads(readJstack(context, coredumpPath, binPath));
- } else {
- metadata.setBacktrace(readBacktrace(context, coredumpPath, binPath, false));
- metadata.setBacktraceAllThreads(readBacktrace(context, coredumpPath, binPath, true));
- }
- } catch (ConvergenceException e) {
- context.log(logger, Level.WARNING, "Failed to extract backtrace: " + e.getMessage());
- } catch (RuntimeException e) {
- context.log(logger, Level.WARNING, "Failed to extract backtrace", e);
- }
- return metadata;
- }
-
- private String asString(CommandResult result) {
- return "exit status " + result.getExitCode() + ", output '" + result.getOutput() + "'";
- }
-
-}