diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-09-26 13:14:51 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-09-26 13:14:51 +0200 |
commit | cd0746884f07956830b8b5fa46a58eb7c021ae9d (patch) | |
tree | acff93ee85116e5348bd5f12a6bfd7a480ac6920 /controller-server | |
parent | 25244cb747346d716fe35efee4b66ce8d3b3e6c2 (diff) |
Avoid using different instants within a run
Diffstat (limited to 'controller-server')
3 files changed, 17 insertions, 16 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java index 30a98cbfacd..702e7ac95f1 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java @@ -35,7 +35,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer { protected double maintain() { Instant now = controller().clock().instant(); for (var cloud : controller().clouds()) { - Optional<Change> change = changeIn(cloud); + Optional<Change> change = changeIn(cloud, now); if (change.isEmpty()) continue; if (!change.get().scheduleAt(now)) continue; controller().upgradeOsIn(cloud, change.get().version(), change.get().upgradeBudget(), false); @@ -43,15 +43,14 @@ public class OsUpgradeScheduler extends ControllerMaintainer { return 1.0; } - /** Returns the wanted change for given cloud, if any */ - public Optional<Change> changeIn(CloudName cloud) { + /** Returns the wanted change for cloud at given instant, if any */ + public Optional<Change> changeIn(CloudName cloud, Instant instant) { Optional<OsVersionTarget> currentTarget = controller().osVersionTarget(cloud); if (currentTarget.isEmpty()) return Optional.empty(); if (upgradingToNewMajor(cloud)) return Optional.empty(); // Skip further upgrades until major version upgrade is complete Release release = releaseIn(cloud); - Instant now = controller().clock().instant(); - return release.change(currentTarget.get().version(), now); + return release.change(currentTarget.get().version(), instant); } private boolean upgradingToNewMajor(CloudName cloud) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java index 77d0e799101..704bafe7082 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.time.Duration; +import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.Set; @@ -158,6 +159,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler { Set<OsVersionTarget> targets = controller.osVersionTargets(); Cursor versions = root.setArray("versions"); + Instant now = controller.clock().instant(); controller.osVersionStatus().versions().forEach((osVersion, nodeVersions) -> { Cursor currentVersionObject = versions.addObject(); currentVersionObject.setString("version", osVersion.version().toFullString()); @@ -166,7 +168,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler { target.ifPresent(t -> { currentVersionObject.setString("upgradeBudget", t.upgradeBudget().toString()); currentVersionObject.setLong("scheduledAt", t.scheduledAt().toEpochMilli()); - Optional<Change> nextChange = osUpgradeScheduler.changeIn(t.osVersion().cloud()); + Optional<Change> nextChange = osUpgradeScheduler.changeIn(t.osVersion().cloud(), now); nextChange.ifPresent(c -> { currentVersionObject.setString("nextVersion", c.version().toFullString()); currentVersionObject.setLong("nextScheduledAt", c.scheduleAt().toEpochMilli()); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java index 39264286e44..d6c49fb38e0 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java @@ -60,7 +60,7 @@ public class OsUpgradeSchedulerTest { Version version1 = Version.fromString("7.0.0.20220301"); tester.clock().advance(Duration.ofDays(16)); assertEquals("2022-03-03T09:05:00", formatInstant(tester.clock().instant())); - assertEquals(version1, scheduler.changeIn(cloud).get().version()); + assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version()); scheduler.maintain(); assertEquals(version0, tester.controller().osVersionTarget(cloud).get().osVersion().version(), @@ -75,7 +75,7 @@ public class OsUpgradeSchedulerTest { "Target is unchanged because we're outside trigger period"); tester.clock().advance(Duration.ofHours(5)); assertEquals("2022-03-07T08:05:00", formatInstant(tester.clock().instant())); - Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud); + Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud, tester.clock().instant()); assertTrue(change.isPresent()); scheduler.maintain(); assertEquals(version1, @@ -88,7 +88,7 @@ public class OsUpgradeSchedulerTest { assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); // Estimate next change - Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud); + Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant()); assertTrue(nextChange.isPresent()); assertEquals("7.0.0.20220426", nextChange.get().version().toFullString()); assertEquals("2022-05-02T07:00:00", formatInstant(nextChange.get().scheduleAt())); @@ -116,12 +116,12 @@ public class OsUpgradeSchedulerTest { assertEquals(version0, tester.controller().osVersionTarget(cloud).get().osVersion().version()); // Cool-down passes tester.clock().advance(Duration.ofDays(1)); - assertEquals(version1, scheduler.changeIn(cloud).get().version()); + assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version()); scheduler.maintain(); assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); // Estimate next change - Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud); + Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant()); assertTrue(nextChange.isPresent()); assertEquals("7.0.0.20220426", nextChange.get().version().toFullString()); assertEquals("2022-04-27T02:00:00", formatInstant(nextChange.get().scheduleAt())); @@ -144,7 +144,7 @@ public class OsUpgradeSchedulerTest { tester.serviceRegistry().artifactRepository().addRelease(new OsRelease(version1, OsRelease.Tag.stable, Instant.parse("2021-06-21T23:59:00.00Z"))); scheduleUpgradeAfter(Duration.ZERO, version0, scheduler, tester); - OsUpgradeScheduler.Change nextChange = scheduler.changeIn(cloud).get(); + OsUpgradeScheduler.Change nextChange = scheduler.changeIn(cloud, tester.clock().instant()).get(); assertEquals(version1, nextChange.version()); assertEquals("2021-06-22T07:00:00", formatInstant(nextChange.scheduleAt())); scheduleUpgradeAfter(Duration.ofHours(7), version1, scheduler, tester); // Inside trigger period @@ -155,7 +155,7 @@ public class OsUpgradeSchedulerTest { // Nothing happens in next iteration as tagged release is older than manually triggered version scheduleUpgradeAfter(Duration.ofDays(7), version3, scheduler, tester); - assertTrue(scheduler.changeIn(cloud).isEmpty()); + assertTrue(scheduler.changeIn(cloud, tester.clock().instant()).isEmpty()); } @Test @@ -174,13 +174,13 @@ public class OsUpgradeSchedulerTest { Version version1 = Version.fromString("8.1"); tester.serviceRegistry().artifactRepository().addRelease(new OsRelease(version1, OsRelease.Tag.latest, tester.clock().instant())); - assertEquals(version1, scheduler.changeIn(cloud).get().version()); - assertEquals("2021-06-22T07:05:00", formatInstant(scheduler.changeIn(cloud).get().scheduleAt()), + assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version()); + assertEquals("2021-06-22T07:05:00", formatInstant(scheduler.changeIn(cloud, tester.clock().instant()).get().scheduleAt()), "Not valid until cool-down period passes"); scheduleUpgradeAfter(Duration.ZERO, version0, scheduler, tester); // Cooldown period passes and latest release is scheduled - scheduleUpgradeAfter(Duration.ofDays(1), version1, scheduler, tester); + scheduleUpgradeAfter(Duration.ofDays(1).plusMinutes(3), version1, scheduler, tester); } @Test |