diff options
author | jonmv <venstad@gmail.com> | 2023-05-26 09:59:08 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-05-26 10:38:45 +0200 |
commit | cdd9d7bb5fcdb154f6cc9fa129d3a65e22f7a63a (patch) | |
tree | 5357447d4050a410cfd7cf3de44d12a93855d2a1 /node-repository | |
parent | 3c3458a27beb1167d2b5d28898b3e13f44e0b8a0 (diff) |
Add empty-host-ttl to deployment spec
Diffstat (limited to 'node-repository')
3 files changed, 14 insertions, 7 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java index 1e378c80f90..f62e019e408 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java @@ -58,6 +58,7 @@ public class ApplicationSerializer { private static final String suggestedKey = "suggested"; private static final String clusterInfoKey = "clusterInfo"; private static final String bcpDeadlineKey = "bcpDeadline"; + private static final String hostTTLKey = "hostTTL"; private static final String bcpGroupInfoKey = "bcpGroupInfo"; private static final String queryRateKey = "queryRateKey"; private static final String growthRateHeadroomKey = "growthRateHeadroomKey"; @@ -234,12 +235,14 @@ public class ApplicationSerializer { private static void toSlime(ClusterInfo clusterInfo, Cursor clusterInfoObject) { clusterInfoObject.setLong(bcpDeadlineKey, clusterInfo.bcpDeadline().toMinutes()); + if ( ! clusterInfo.hostTTL().isZero()) clusterInfoObject.setLong(hostTTLKey, clusterInfo.hostTTL().toMillis()); } private static ClusterInfo clusterInfoFromSlime(Inspector clusterInfoObject) { if ( ! clusterInfoObject.valid()) return ClusterInfo.empty(); ClusterInfo.Builder builder = new ClusterInfo.Builder(); builder.bcpDeadline(Duration.ofMinutes(clusterInfoObject.field(bcpDeadlineKey).asLong())); + builder.hostTTL(Duration.ofMillis(clusterInfoObject.field(hostTTLKey).asLong())); return builder.build(); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java index 9de4b8768b2..2a6e5a0d1e7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java @@ -510,11 +510,10 @@ public class HostCapacityMaintainerTest { tester.provisioningTester.makeReadyHosts(2, new NodeResources(1, 1, 1, 1)).activateTenantHosts(); List<Node> hosts = tester.nodeRepository.nodes().list(Node.State.active).asList(); Node host1 = hosts.get(0); + Node host2 = hosts.get(1); tester.nodeRepository.nodes().write(host1.withHostTTL(Duration.ofDays(1)), () -> { }); + tester.nodeRepository.nodes().write(host2.withHostTTL(Duration.ofHours(1)), () -> { }); Node host11 = tester.addNode("host1-1", Optional.of(host1.hostname()), NodeType.tenant, State.active, DynamicProvisioningTester.tenantApp); - Node host2 = hosts.get(1); - tester.nodeRepository.nodes().write(host2.withHostTTL(Duration.ofDays(1)), () -> { }); - Node host21 = tester.addNode("host2-1", Optional.of(host2.hostname()), NodeType.tenant, State.active, ApplicationId.from("t", "a", "i")); // Host is not marked for deprovisioning by maintainer, because child is present tester.maintain(); @@ -537,14 +536,19 @@ public class HostCapacityMaintainerTest { assertEquals(Optional.of(clock.instant().truncatedTo(ChronoUnit.MILLIS)), tester.nodeRepository.nodes().node(host1.hostname()).get().hostEmptyAt()); - // Some time passes, but not enough for host to be deprovisioned + // Some time passes, but not enough for host1 to be deprovisioned clock.advance(Duration.ofDays(1).minusSeconds(1)); tester.maintain(); assertFalse(tester.nodeRepository.nodes().node(host1.hostname()).get().status().wantToDeprovision()); assertEquals(Optional.of(clock.instant().minus(Duration.ofDays(1).minusSeconds(1)).truncatedTo(ChronoUnit.MILLIS)), tester.nodeRepository.nodes().node(host1.hostname()).get().hostEmptyAt()); + assertTrue(tester.nodeRepository.nodes().node(host2.hostname()).get().status().wantToDeprovision()); + assertTrue(tester.nodeRepository.nodes().node(host2.hostname()).get().status().wantToRetire()); + assertEquals(State.active, tester.nodeRepository.nodes().node(host2.hostname()).get().state()); + assertEquals(Optional.of(clock.instant().minus(Duration.ofDays(1).minusSeconds(1)).truncatedTo(ChronoUnit.MILLIS)), + tester.nodeRepository.nodes().node(host2.hostname()).get().hostEmptyAt()); - // Some more time passes, but child is reactivated, rendering the host non-empty again + // Some more time passes, but child is reactivated on host1, rendering the host non-empty again clock.advance(Duration.ofDays(1)); tester.nodeRepository.nodes().reactivate(host11.hostname(), Agent.operator, "all good"); tester.maintain(); @@ -581,7 +585,7 @@ public class HostCapacityMaintainerTest { // Host and children can now be removed. tester.provisioningTester.activateTenantHosts(); tester.maintain(); - assertEquals(Set.of(host2, host21), Set.copyOf(tester.nodeRepository.nodes().list().asList())); + assertEquals(List.of(), tester.nodeRepository.nodes().list().asList()); } @Test diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java index c429f88cfa1..c997da543ea 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java @@ -68,7 +68,7 @@ public class ApplicationSerializerTest { Load.zero(), Load.one(), Autoscaling.Metrics.zero()), - new ClusterInfo.Builder().bcpDeadline(Duration.ofMinutes(33)).build(), + new ClusterInfo.Builder().bcpDeadline(Duration.ofMinutes(33)).hostTTL(Duration.ofSeconds(321)).build(), new BcpGroupInfo(0.1, 0.2, 0.3), List.of(new ScalingEvent(new ClusterResources(10, 5, minResources), new ClusterResources(12, 6, minResources), |