From 42198320795da41599b53a13d0bc69ee0c8401a4 Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Wed, 31 Oct 2018 11:44:02 +0100 Subject: Cache disk usage, check every 5 minutes --- .../node/admin/maintenance/StorageMaintainer.java | 19 +++++++++++++++++-- .../node/admin/maintenance/StorageMaintainerTest.java | 7 ++++++- 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'node-admin') 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 00dd841efc6..713a6b23683 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 @@ -43,11 +43,16 @@ public class StorageMaintainer { private static final Logger logger = Logger.getLogger(StorageMaintainer.class.getName()); private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter .ofPattern("yyyyMMddHHmmss").withZone(ZoneOffset.UTC); + private static final Duration checkDiskUsageInterval = Duration.ofMinutes(5); private final DockerOperations dockerOperations; private final CoredumpHandler coredumpHandler; private final Path archiveContainerStoragePath; + private Instant lastDiskUsageCheck = Instant.EPOCH; + // We cache disk usage to avoid doing expensive disk operations so often + private Optional diskUsage = Optional.empty(); + public StorageMaintainer(DockerOperations dockerOperations, CoredumpHandler coredumpHandler, Path archiveContainerStoragePath) { this.dockerOperations = dockerOperations; this.coredumpHandler = coredumpHandler; @@ -174,11 +179,21 @@ public class StorageMaintainer { public Optional getDiskUsageFor(NodeAgentContext context) { Path containerDir = context.pathOnHostFromPathInNode("/"); try { - return Optional.of(getDiskUsedInBytes(containerDir)); + diskUsage = getDiskUsageFor(containerDir); } catch (Throwable e) { context.log(logger, LogLevel.WARNING, "Problems during disk usage calculations in " + containerDir.toAbsolutePath(), e); - return Optional.empty(); + diskUsage = Optional.empty(); + } + return diskUsage; + } + + Optional getDiskUsageFor(Path containerDir) throws IOException, InterruptedException { + Instant now = Instant.now(); + if (now.isAfter(lastDiskUsageCheck.plus(checkDiskUsageInterval))) { + diskUsage = Optional.of(getDiskUsedInBytes(containerDir)); + lastDiskUsageCheck = now; } + return diskUsage; } // Public for testing 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 d537cb40214..abd4e5b76cf 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 @@ -28,6 +28,7 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -198,9 +199,13 @@ public class StorageMaintainerTest { int writeSize = 10000; Files.write(folder.newFile().toPath(), new byte[writeSize]); - long usedBytes = storageMaintainer.getDiskUsedInBytes(folder.getRoot().toPath()); + long usedBytes = storageMaintainer.getDiskUsageFor(folder.getRoot().toPath()).get(); if (usedBytes * 4 < writeSize || usedBytes > writeSize * 4) fail("Used bytes is " + usedBytes + ", but wrote " + writeSize + " bytes, not even close."); + + // Write another file, since disk usage is cached it should not change + Files.write(folder.newFile().toPath(), new byte[writeSize]); + assertEquals(usedBytes, (long) storageMaintainer.getDiskUsageFor(folder.getRoot().toPath()).get()); } @Test -- cgit v1.2.3