aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2018-10-31 11:44:02 +0100
committerHarald Musum <musum@oath.com>2018-10-31 11:44:02 +0100
commit42198320795da41599b53a13d0bc69ee0c8401a4 (patch)
treee591910a3f7f1788505e5ae6fa37dc725ca0276d /node-admin
parent62b31ca20768c651737942f018f6c36c81645141 (diff)
Cache disk usage, check every 5 minutes
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java19
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java7
2 files changed, 23 insertions, 3 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 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<Long> 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<Long> 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<Long> 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