summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnstein Ressem <aressem@verizonmedia.com>2020-06-02 14:15:44 +0200
committerGitHub <noreply@github.com>2020-06-02 14:15:44 +0200
commit0ca803d1e89e79b0167e9fe545575356f6555ec5 (patch)
treecfab10cf87f08047338bbdb96db8f65e13f48566
parent6cb1e9f1981d9191ddc3e8a25585c6f121bb4d05 (diff)
parentb5edc4618c392546f4216fc2bea4a6bbc253de7c (diff)
Merge pull request #13447 from vespa-engine/aressem/allow-alternate-gdb-path
Allow gdb path based on image name.
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollector.java22
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java8
2 files changed, 21 insertions, 9 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 cdf5687d61a..9a1c01044f9 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
@@ -1,6 +1,7 @@
// Copyright 2018 Yahoo Holdings. 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.config.provision.DockerImage;
import com.yahoo.vespa.hosted.dockerapi.ProcessResult;
import com.yahoo.vespa.hosted.node.admin.docker.DockerOperations;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext;
@@ -11,6 +12,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
@@ -29,15 +31,14 @@ public class CoreCollector {
private static final Pattern FROM_PATH_PATTERN = Pattern.compile("^.* from '(?<path>.*?)'");
private final DockerOperations docker;
- private final Path gdb;
- public CoreCollector(DockerOperations docker, Path pathToGdbInContainer) {
+ public CoreCollector(DockerOperations docker) {
this.docker = docker;
- this.gdb = pathToGdbInContainer;
}
Path readBinPathFallback(NodeAgentContext context, Path coredumpPath) {
- String command = gdb + " -n -batch -core " + coredumpPath + " | grep \'^Core was generated by\'";
+ String command = GDBPath(context).toString()
+ + " -n -batch -core " + coredumpPath + " | grep \'^Core was generated by\'";
String[] wrappedCommand = {"/bin/sh", "-c", command};
ProcessResult result = docker.executeCommandInContainerAsRoot(context, wrappedCommand);
@@ -49,6 +50,17 @@ public class CoreCollector {
return Paths.get(matcher.group("path").split(" ")[0]);
}
+ Path GDBPath(NodeAgentContext context) {
+ Optional<DockerImage> image = context.node().currentDockerImage();
+
+ if (image.isPresent() && image.get().repository().endsWith("vespa/ci")) {
+ return context.pathInNodeUnderVespaHome("bin64/gdb");
+ }
+ else {
+ return Paths.get("/opt/rh/devtoolset-9/root/bin/gdb");
+ }
+ }
+
Path readBinPath(NodeAgentContext context, Path coredumpPath) {
String[] command = {"file", coredumpPath.toString()};
try {
@@ -76,7 +88,7 @@ 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()};
+ String[] command = {GDBPath(context).toString(), "-n", "-ex", threads, "-batch", binPath.toString(), coredumpPath.toString()};
ProcessResult result = docker.executeCommandInContainerAsRoot(context, command);
if (result.getExitStatus() != 0)
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 bcec01fe91d..f8d14eea996 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
@@ -21,10 +21,10 @@ import static org.mockito.Mockito.when;
* @author freva
*/
public class CoreCollectorTest {
- private final String GDB_PATH = "/my/path/to/gdb";
+ private final String GDB_PATH = "/opt/rh/devtoolset-9/root/bin/gdb";
private final String JDK_PATH = "/path/to/jdk/java";
private final DockerOperations docker = mock(DockerOperations.class);
- private final CoreCollector coreCollector = new CoreCollector(docker, Paths.get(GDB_PATH));
+ private final CoreCollector coreCollector = new CoreCollector(docker);
private final NodeAgentContext context = new NodeAgentContextImpl.Builder("container-123.domain.tld").build();
private final Path TEST_CORE_PATH = Paths.get("/tmp/core.1234");
@@ -85,7 +85,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: ProcessResult { exitStatus=1 output= errors=Error 123 }, command: " +
- "[/bin/sh, -c, /my/path/to/gdb -n -batch -core /tmp/core.1234 | grep '^Core was generated by']", e.getMessage());
+ "[/bin/sh, -c, /opt/rh/devtoolset-9/root/bin/gdb -n -batch -core /tmp/core.1234 | grep '^Core was generated by']", e.getMessage());
}
}
@@ -102,7 +102,7 @@ public class CoreCollectorTest {
fail("Expected not to be able to read backtrace");
} catch (RuntimeException e) {
assertEquals("Failed to read backtrace ProcessResult { exitStatus=1 output= errors=Failure }, Command: " +
- "[/my/path/to/gdb, -n, -ex, bt, -batch, /usr/bin/program, /tmp/core.1234]", e.getMessage());
+ "[/opt/rh/devtoolset-9/root/bin/gdb, -n, -ex, bt, -batch, /usr/bin/program, /tmp/core.1234]", e.getMessage());
}
}