summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2018-08-09 11:37:26 +0200
committerValerij Fredriksen <valerijf@oath.com>2018-08-09 11:37:26 +0200
commitcd4acc9f99c7d2eaebebdaa1bd07ca708af95944 (patch)
tree32340cbfbccd617c317e5cffb9cee444de994b35 /node-admin
parente8149e9763c7cd85dbf77ce3169c8d0a36060563 (diff)
Make it possible to set CoredumpHandler for StorageMaintainer to use
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java51
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java1
2 files changed, 41 insertions, 11 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
index 383c025e2cb..c83b454db15 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
@@ -20,9 +20,11 @@ import com.yahoo.vespa.hosted.node.admin.component.Environment;
import com.yahoo.vespa.hosted.node.admin.task.util.file.IOExceptionUtil;
import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger;
import com.yahoo.vespa.hosted.node.admin.util.SecretAgentCheckConfig;
+import com.yahoo.vespa.hosted.node.admin.maintenance.coredump.CoredumpHandler;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -31,6 +33,7 @@ import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -54,14 +57,23 @@ public class StorageMaintainer {
private final DockerOperations dockerOperations;
private final ProcessExecuter processExecuter;
private final Environment environment;
+ private final Optional<CoredumpHandler> coredumpHandler;
private final Clock clock;
private final Map<ContainerName, MaintenanceThrottler> maintenanceThrottlerByContainerName = new ConcurrentHashMap<>();
- public StorageMaintainer(DockerOperations dockerOperations, ProcessExecuter processExecuter, MetricReceiverWrapper metricReceiver, Environment environment, Clock clock) {
+ public StorageMaintainer(DockerOperations dockerOperations, ProcessExecuter processExecuter,
+ MetricReceiverWrapper metricReceiver, Environment environment, Clock clock) {
+ this(dockerOperations, processExecuter, metricReceiver, environment, null, clock);
+ }
+
+ public StorageMaintainer(DockerOperations dockerOperations, ProcessExecuter processExecuter,
+ MetricReceiverWrapper metricReceiver, Environment environment,
+ CoredumpHandler coredumpHandler, Clock clock) {
this.dockerOperations = dockerOperations;
this.processExecuter = processExecuter;
this.environment = environment;
+ this.coredumpHandler = Optional.ofNullable(coredumpHandler);
this.clock = clock;
Dimensions dimensions = new Dimensions.Builder().add("role", "docker").build();
@@ -295,17 +307,38 @@ public class StorageMaintainer {
MaintainerExecutor maintainerExecutor = new MaintainerExecutor();
addHandleCoredumpsCommand(maintainerExecutor, containerName, node);
-
maintainerExecutor.execute();
+
getMaintenanceThrottlerFor(containerName).updateNextHandleCoredumpsTime();
}
+ /**
+ * Will either schedule coredump execution in the given maintainerExecutor or run coredump handling
+ * directly if {@link #coredumpHandler} is set.
+ */
private void addHandleCoredumpsCommand(MaintainerExecutor maintainerExecutor, ContainerName containerName, NodeSpec node) {
- if (!environment.getCoredumpFeedEndpoint().isPresent()) {
+ final Path coredumpsPath = environment.pathInNodeAdminFromPathInNode(
+ containerName, environment.pathInNodeUnderVespaHome("var/crash"));
+ final Map<String, Object> nodeAttributes = getCoredumpNodeAttributes(node);
+ if (coredumpHandler.isPresent()) {
+ try {
+ coredumpHandler.get().processAll(coredumpsPath, nodeAttributes);
+ } catch (IOException e) {
+ throw new UncheckedIOException("Failed to process coredumps", e);
+ }
+ } else {
// Core dump handling is disabled.
- return;
+ if (!environment.getCoredumpFeedEndpoint().isPresent()) return;
+
+ maintainerExecutor.addJob("handle-core-dumps")
+ .withArgument("coredumpsPath", coredumpsPath)
+ .withArgument("doneCoredumpsPath", environment.pathInNodeAdminToDoneCoredumps())
+ .withArgument("attributes", nodeAttributes)
+ .withArgument("feedEndpoint", environment.getCoredumpFeedEndpoint().get());
}
+ }
+ private Map<String, Object> getCoredumpNodeAttributes(NodeSpec node) {
Map<String, Object> attributes = new HashMap<>();
attributes.put("hostname", node.getHostname());
attributes.put("parent_hostname", environment.getParentHostHostname());
@@ -321,13 +354,7 @@ public class StorageMaintainer {
attributes.put("application", owner.getApplication());
attributes.put("instance", owner.getInstance());
});
-
- maintainerExecutor.addJob("handle-core-dumps")
- .withArgument("doneCoredumpsPath", environment.pathInNodeAdminToDoneCoredumps())
- .withArgument("coredumpsPath", environment.pathInNodeAdminFromPathInNode(
- containerName, environment.pathInNodeUnderVespaHome("var/crash")))
- .withArgument("feedEndpoint", environment.getCoredumpFeedEndpoint().get())
- .withArgument("attributes", attributes);
+ return Collections.unmodifiableMap(attributes);
}
/**
@@ -448,6 +475,8 @@ public class StorageMaintainer {
}
void execute() {
+ if (jobs.isEmpty()) return;
+
String args;
try {
args = objectMapper.writeValueAsString(jobs);
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
index 5abdd0d5d01..7e6cc6b773f 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
@@ -43,6 +43,7 @@ public class StorageMaintainerTest {
.system("main")
.pathResolver(new PathResolver())
.cloud("mycloud")
+ .coredumpFeedEndpoint("http://domain.tld/docid")
.build();
private final DockerOperations docker = mock(DockerOperations.class);
private final ProcessExecuter processExecuter = mock(ProcessExecuter.class);