summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@yahooinc.com>2022-09-01 20:58:32 +0200
committerValerij Fredriksen <valerijf@yahooinc.com>2022-09-01 20:58:32 +0200
commit34f234d09fb8d3575e53dc8442f29a73c48aea56 (patch)
tree178031d1133079934113df72815e543c06fae136 /node-admin
parentb716755b5b274f0f3454a9f5c0f6e33986ff6564 (diff)
Remove unnecessary indirection
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java15
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java23
2 files changed, 22 insertions, 16 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 0933f22dee3..b5a47e0b3be 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
@@ -26,7 +26,7 @@ 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("^Core was generated by `(?<path>.*?)'.$");
+ 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-11/root/bin/gdb";
@@ -40,19 +40,14 @@ public class CoreCollector {
this.container = container;
}
- String getGdbPath(NodeAgentContext context) {
- return GDB_PATH_RHEL8;
- }
-
String readBinPathFallback(NodeAgentContext context, ContainerPath coredumpPath) {
- String command = getGdbPath(context) + " -n -batch -core " + coredumpPath.pathInContainer() + " | grep \'^Core was generated by\'";
- String[] wrappedCommand = {"/bin/sh", "-c", command};
- CommandResult result = container.executeCommandInContainer(context, context.users().root(), wrappedCommand);
+ 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(wrappedCommand)));
+ asString(result), Arrays.toString(command)));
}
return matcher.group("path").split(" ")[0];
}
@@ -84,7 +79,7 @@ public class CoreCollector {
List<String> readBacktrace(NodeAgentContext context, ContainerPath coredumpPath, String binPath, boolean allThreads) {
String threads = allThreads ? "thread apply all bt" : "bt";
- String[] command = {getGdbPath(context), "-n", "-ex", "set print frame-arguments none",
+ 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);
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java
index c0bf6ebbeb3..ea73fd4af6f 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java
@@ -62,8 +62,20 @@ public class CoreCollectorTest {
assertEquals(TEST_BIN_PATH, coreCollector.readBinPath(context, TEST_CORE_PATH));
String fallbackResponse = "/response/from/fallback";
- mockExec(new String[]{"/bin/sh", "-c", GDB_PATH_RHEL8 + " -n -batch -core /tmp/core.1234 | grep '^Core was generated by'"},
- "Core was generated by `/response/from/fallback'.");
+ mockExec(new String[]{GDB_PATH_RHEL8, "-n", "-batch", "-core", "/tmp/core.1234"},
+ """
+ GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
+ Type “apropos word” to search for commands related to “word”…
+ Reading symbols from abc…(no debugging symbols found)…done.
+ [New LWP 23678]
+ Core was generated by `/response/from/fallback'. \s
+ Program terminated with signal SIGSEGV, Segmentation fault. \s
+ #0 0x0000000000400541 in main ()
+ #0 0x0000000000400541 in main ()
+ (gdb) bt
+ #0 0x0000000000400541 in main ()
+ (gdb)
+ """);
mockExec(cmd,
"/tmp/core.1234: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style");
assertEquals(fallbackResponse, coreCollector.readBinPath(context, TEST_CORE_PATH));
@@ -74,8 +86,7 @@ public class CoreCollectorTest {
@Test
void extractsBinaryPathUsingGdbTest() {
- final String[] cmd = new String[]{"/bin/sh", "-c",
- GDB_PATH_RHEL8 + " -n -batch -core /tmp/core.1234 | grep '^Core was generated by'"};
+ String[] cmd = new String[]{GDB_PATH_RHEL8, "-n", "-batch", "-core", "/tmp/core.1234"};
mockExec(cmd, "Core was generated by `/usr/bin/program-from-gdb --identity foo/search/cluster.content_'.");
assertEquals("/usr/bin/program-from-gdb", coreCollector.readBinPathFallback(context, TEST_CORE_PATH));
@@ -86,7 +97,7 @@ public class CoreCollectorTest {
fail("Expected not to be able to get bin path");
} catch (RuntimeException e) {
assertEquals("Failed to extract binary path from GDB, result: exit status 1, output 'Error 123', command: " +
- "[/bin/sh, -c, /opt/rh/gcc-toolset-11/root/bin/gdb -n -batch -core /tmp/core.1234 | grep '^Core was generated by']", e.getMessage());
+ "[/opt/rh/gcc-toolset-11/root/bin/gdb, -n, -batch, -core, /tmp/core.1234]", e.getMessage());
}
}
@@ -157,7 +168,7 @@ public class CoreCollectorTest {
mockExec(new String[]{"file", TEST_CORE_PATH.pathInContainer()},
"dump.core.5954: ELF 64-bit LSB core file x86-64, version 1 (SYSV), too many program header sections (33172)");
- mockExec(new String[]{"/bin/sh", "-c", GDB_PATH_RHEL8 + " -n -batch -core /tmp/core.1234 | grep '^Core was generated by'"},
+ mockExec(new String[]{GDB_PATH_RHEL8, "-n", "-batch", "-core", "/tmp/core.1234"},
"Core was generated by `" + JDK_PATH + " -Dconfig.id=default/container.11 -XX:+Pre'.");
String jstack = "jstack11";