From 2d76bd7d5701c70b06ee24fa5962dc6833ebb445 Mon Sep 17 00:00:00 2001 From: Ola Aunronning Date: Mon, 26 Feb 2024 14:05:59 +0100 Subject: Empty exclusive host metric considers deallocation time --- .../yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java | 7 +++++-- .../vespa/hosted/provision/maintenance/MetricsReporterTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java index b82d1809085..69ae4fddb63 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java @@ -397,13 +397,16 @@ public class MetricsReporter extends NodeRepositoryMaintainer { private void updateEmptyExclusiveHosts(NodeList nodes) { Instant now = nodeRepository().clock().instant(); - Duration minActivePeriod = Duration.ofMinutes(10); + Instant tenMinutesAgo = now.minus(Duration.ofMinutes(10)); int emptyHosts = nodes.parents().state(State.active) .matching(node -> (node.type() != NodeType.host && node.type().isHost()) || node.exclusiveToApplicationId().isPresent()) .matching(host -> host.history().hasEventBefore(History.Event.Type.activated, - now.minus(minActivePeriod))) + tenMinutesAgo)) .matching(host -> nodes.childrenOf(host).isEmpty()) + .matching(host -> host.hostEmptyAt() + .map(time -> time.isBefore(tenMinutesAgo)) + .orElse(true)) .size(); metric.set(ConfigServerMetrics.NODES_EMPTY_EXCLUSIVE.baseName(), emptyHosts, null); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index 152f743900b..75ebf376e9f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -360,6 +360,14 @@ public class MetricsReporterTest { metricsReporter.maintain(); assertEquals(hosts.size(), metric.values.get("nodes.emptyExclusive").intValue()); + // Hosts are not considered empty if children were just deallocated + tester.patchNodes(hosts, (host) -> host.withHostEmptyAt(tester.clock().instant())); + metricsReporter.maintain(); + assertEquals(0, metric.values.get("nodes.emptyExclusive").intValue()); + tester.clock().advance(Duration.ofMinutes(10)); + metricsReporter.maintain(); + assertEquals(hosts.size(), metric.values.get("nodes.emptyExclusive").intValue()); + // Deploy application ClusterSpec spec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("c1")).vespaVersion("1").build(); Capacity capacity = Capacity.from(new ClusterResources(4, 1, resources)); -- cgit v1.2.3