diff options
author | Ola Aunrønning <olaa@oath.com> | 2019-05-14 14:07:35 +0200 |
---|---|---|
committer | Ola Aunrønning <olaa@oath.com> | 2019-05-14 16:33:08 +0200 |
commit | 0209cdc6ed24bce69dfd3435fc7513f525b59d80 (patch) | |
tree | ba2beb682a3018a6f4bc10bdcd79e36c4c4657db /node-admin | |
parent | d15201a325696298a415b1c854bbda8a79ecc2fe (diff) |
Seed coredump id
Diffstat (limited to 'node-admin')
2 files changed, 36 insertions, 35 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java index 95964ec8e7f..60f4d532784 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java @@ -3,6 +3,8 @@ package com.yahoo.vespa.hosted.node.admin.maintenance.coredump; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableMap; +import com.yahoo.component.Version; +import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec; import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext; import com.yahoo.vespa.hosted.node.admin.task.util.file.FileFinder; import com.yahoo.vespa.hosted.node.admin.task.util.file.UnixPath; @@ -46,7 +48,6 @@ public class CoredumpHandler { private final CoredumpReporter coredumpReporter; private final Path crashPatchInContainer; private final Path doneCoredumpsPath; - private final Supplier<String> coredumpIdSupplier; /** * @param crashPathInContainer path inside the container where core dump are dumped @@ -54,21 +55,17 @@ public class CoredumpHandler { */ public CoredumpHandler(Terminal terminal, CoreCollector coreCollector, CoredumpReporter coredumpReporter, Path crashPathInContainer, Path doneCoredumpsPath) { - this(terminal, coreCollector, coredumpReporter, crashPathInContainer, doneCoredumpsPath, () -> UUID.randomUUID().toString()); - } - - CoredumpHandler(Terminal terminal, CoreCollector coreCollector, CoredumpReporter coredumpReporter, - Path crashPathInContainer, Path doneCoredumpsPath, Supplier<String> coredumpIdSupplier) { this.terminal = terminal; this.coreCollector = coreCollector; this.coredumpReporter = coredumpReporter; this.crashPatchInContainer = crashPathInContainer; this.doneCoredumpsPath = doneCoredumpsPath; - this.coredumpIdSupplier = coredumpIdSupplier; } public void converge(NodeAgentContext context, Supplier<Map<String, Object>> nodeAttributesSupplier) { + + UUID coredumpId = generateCoredumpId(context); Path containerCrashPathOnHost = context.pathOnHostFromPathInNode(crashPatchInContainer); Path containerProcessingPathOnHost = containerCrashPathOnHost.resolve(PROCESSING_DIRECTORY_NAME); @@ -79,16 +76,16 @@ public class CoredumpHandler { .deleteRecursively(); // Check if we have already started to process a core dump or we can enqueue a new core one - getCoredumpToProcess(containerCrashPathOnHost, containerProcessingPathOnHost) + getCoredumpToProcess(coredumpId, containerCrashPathOnHost, containerProcessingPathOnHost) .ifPresent(path -> processAndReportSingleCoredump(context, path, nodeAttributesSupplier)); } /** @return path to directory inside processing directory that contains a core dump file to process */ - Optional<Path> getCoredumpToProcess(Path containerCrashPathOnHost, Path containerProcessingPathOnHost) { + Optional<Path> getCoredumpToProcess(UUID coredumpId, Path containerCrashPathOnHost, Path containerProcessingPathOnHost) { return FileFinder.directories(containerProcessingPathOnHost).stream() .map(FileFinder.FileAttributes::path) .findAny() - .or(() -> enqueueCoredump(containerCrashPathOnHost, containerProcessingPathOnHost)); + .or(() -> enqueueCoredump(coredumpId, containerCrashPathOnHost, containerProcessingPathOnHost)); } /** @@ -97,7 +94,7 @@ public class CoredumpHandler { * * @return path to directory inside processing directory which contains the enqueued core dump file */ - Optional<Path> enqueueCoredump(Path containerCrashPathOnHost, Path containerProcessingPathOnHost) { + Optional<Path> enqueueCoredump(UUID coredumpID, Path containerCrashPathOnHost, Path containerProcessingPathOnHost) { return FileFinder.files(containerCrashPathOnHost) .match(nameStartsWith(".").negate()) .maxDepth(1) @@ -107,7 +104,7 @@ public class CoredumpHandler { .map(coredumpPath -> { UnixPath coredumpInProcessingDirectory = new UnixPath( containerProcessingPathOnHost - .resolve(coredumpIdSupplier.get()) + .resolve(coredumpID.toString()) .resolve(COREDUMP_FILENAME_PREFIX + coredumpPath.getFileName())); coredumpInProcessingDirectory.createParents(); return uncheck(() -> Files.move(coredumpPath, coredumpInProcessingDirectory.toPath())).getParent(); @@ -174,4 +171,12 @@ public class CoredumpHandler { .orElseThrow(() -> new IllegalStateException( "No coredump file found in processing directory " + coredumpProccessingDirectory)); } + + private UUID generateCoredumpId(NodeAgentContext context) { + NodeSpec nodeSpec = context.node(); + String hostname = nodeSpec.getParentHostname().orElse(nodeSpec.getHostname()); + String version = nodeSpec.getVespaVersion().orElse(Version.emptyVersion).toFullString(); + byte[] seed = (hostname + version).getBytes(); + return UUID.nameUUIDFromBytes(seed); + } } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java index 6d3a4dbb553..fa5ed169fbc 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.function.Supplier; +import java.util.UUID; import java.util.stream.Collectors; import static com.yahoo.yolean.Exceptions.uncheck; @@ -53,9 +53,8 @@ public class CoredumpHandlerTest { private final CoreCollector coreCollector = mock(CoreCollector.class); private final CoredumpReporter coredumpReporter = mock(CoredumpReporter.class); @SuppressWarnings("unchecked") - private final Supplier<String> coredumpIdSupplier = mock(Supplier.class); private final CoredumpHandler coredumpHandler = new CoredumpHandler(terminal, coreCollector, coredumpReporter, - crashPathInContainer, doneCoredumpsPath, coredumpIdSupplier); + crashPathInContainer, doneCoredumpsPath); @Test @@ -67,7 +66,9 @@ public class CoredumpHandlerTest { Files.setLastModifiedTime(Files.createFile(crashPathOnHost.resolve(".bash.core.431")), FileTime.from(Instant.now())); assertFolderContents(crashPathOnHost, ".bash.core.431"); - Optional<Path> enqueuedPath = coredumpHandler.enqueueCoredump(crashPathOnHost, processingDir); + UUID coredumpId = UUID.randomUUID(); + + Optional<Path> enqueuedPath = coredumpHandler.enqueueCoredump(coredumpId, crashPathOnHost, processingDir); assertEquals(Optional.empty(), enqueuedPath); // bash.core.431 finished writing... and 2 more have since been written @@ -75,30 +76,27 @@ public class CoredumpHandlerTest { Files.setLastModifiedTime(Files.createFile(crashPathOnHost.resolve("vespa-proton.core.119")), FileTime.from(Instant.now().minus(Duration.ofMinutes(10)))); Files.setLastModifiedTime(Files.createFile(crashPathOnHost.resolve("vespa-slobrok.core.673")), FileTime.from(Instant.now().minus(Duration.ofMinutes(5)))); - when(coredumpIdSupplier.get()).thenReturn("id-123").thenReturn("id-321"); - enqueuedPath = coredumpHandler.enqueueCoredump(crashPathOnHost, processingDir); - assertEquals(Optional.of(processingDir.resolve("id-123")), enqueuedPath); + enqueuedPath = coredumpHandler.enqueueCoredump(coredumpId, crashPathOnHost, processingDir); + assertEquals(Optional.of(processingDir.resolve(coredumpId.toString())), enqueuedPath); assertFolderContents(crashPathOnHost, "bash.core.431", "vespa-slobrok.core.673"); - assertFolderContents(processingDir, "id-123"); - assertFolderContents(processingDir.resolve("id-123"), "dump_vespa-proton.core.119"); - verify(coredumpIdSupplier, times(1)).get(); + assertFolderContents(processingDir, coredumpId.toString()); + assertFolderContents(processingDir.resolve(coredumpId.toString()), "dump_vespa-proton.core.119"); // Enqueue another - enqueuedPath = coredumpHandler.enqueueCoredump(crashPathOnHost, processingDir); - assertEquals(Optional.of(processingDir.resolve("id-321")), enqueuedPath); + enqueuedPath = coredumpHandler.enqueueCoredump(coredumpId, crashPathOnHost, processingDir); + assertEquals(Optional.of(processingDir.resolve(coredumpId.toString())), enqueuedPath); assertFolderContents(crashPathOnHost, "bash.core.431"); - assertFolderContents(processingDir, "id-123", "id-321"); - assertFolderContents(processingDir.resolve("id-321"), "dump_vespa-slobrok.core.673"); - verify(coredumpIdSupplier, times(2)).get(); + assertFolderContents(processingDir, coredumpId.toString()); + assertFolderContents(processingDir.resolve(coredumpId.toString()), "dump_vespa-proton.core.119", "dump_vespa-slobrok.core.673"); } @Test public void coredump_to_process_test() throws IOException { final Path crashPathOnHost = fileSystem.getPath("/home/docker/container-1/some/crash/path"); final Path processingDir = fileSystem.getPath("/home/docker/container-1/some/other/processing"); - + UUID coredumpId = UUID.randomUUID(); // Initially there are no core dumps - Optional<Path> enqueuedPath = coredumpHandler.enqueueCoredump(crashPathOnHost, processingDir); + Optional<Path> enqueuedPath = coredumpHandler.enqueueCoredump(coredumpId, crashPathOnHost, processingDir); assertEquals(Optional.empty(), enqueuedPath); // 3 core dumps occur @@ -107,14 +105,12 @@ public class CoredumpHandlerTest { Files.setLastModifiedTime(Files.createFile(crashPathOnHost.resolve("vespa-proton.core.119")), FileTime.from(Instant.now().minus(Duration.ofMinutes(10)))); Files.setLastModifiedTime(Files.createFile(crashPathOnHost.resolve("vespa-slobrok.core.673")), FileTime.from(Instant.now().minus(Duration.ofMinutes(5)))); - when(coredumpIdSupplier.get()).thenReturn("id-123"); - enqueuedPath = coredumpHandler.getCoredumpToProcess(crashPathOnHost, processingDir); - assertEquals(Optional.of(processingDir.resolve("id-123")), enqueuedPath); + enqueuedPath = coredumpHandler.getCoredumpToProcess(coredumpId, crashPathOnHost, processingDir); + assertEquals(Optional.of(processingDir.resolve(coredumpId.toString())), enqueuedPath); // Running this again wont enqueue new core dumps as we are still processing the one enqueued previously - enqueuedPath = coredumpHandler.getCoredumpToProcess(crashPathOnHost, processingDir); - assertEquals(Optional.of(processingDir.resolve("id-123")), enqueuedPath); - verify(coredumpIdSupplier, times(1)).get(); + enqueuedPath = coredumpHandler.getCoredumpToProcess(coredumpId, crashPathOnHost, processingDir); + assertEquals(Optional.of(processingDir.resolve(coredumpId.toString())), enqueuedPath); } @Test |