diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-06-14 10:21:39 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-06-14 10:40:50 +0200 |
commit | d9d69ea0ffd70bf5e966682cb86f3b283a228a4a (patch) | |
tree | a9eb778e80dcc1db438bb9387c1c5821c7ef3463 /controller-server | |
parent | f89b56dddff0ba7a621f07c22516103d6359e4c1 (diff) |
Start OS upgrades during work hours
Diffstat (limited to 'controller-server')
2 files changed, 20 insertions, 7 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 666d1c3b23a..a02937a03e3 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 @@ -43,8 +43,10 @@ public class OsUpgradeScheduler extends ControllerMaintainer { @Override protected double maintain() { + Instant now = controller().clock().instant(); + if (!canTriggerAt(now)) return 1.0; for (var cloud : supportedClouds()) { - Optional<Version> newTarget = newTargetIn(cloud); + Optional<Version> newTarget = newTargetIn(cloud, now); if (newTarget.isEmpty()) continue; controller().upgradeOsIn(cloud, newTarget.get(), upgradeBudget(), false); } @@ -52,14 +54,12 @@ public class OsUpgradeScheduler extends ControllerMaintainer { } /** Returns the new target version for given cloud, if any */ - private Optional<Version> newTargetIn(CloudName cloud) { + private Optional<Version> newTargetIn(CloudName cloud, Instant now) { Optional<Version> currentTarget = controller().osVersionTarget(cloud) .map(OsVersionTarget::osVersion) .map(OsVersion::version); if (currentTarget.isEmpty()) return Optional.empty(); if (!hasExpired(currentTarget.get())) return Optional.empty(); - - Instant now = controller().clock().instant(); String qualifier = LocalDate.ofInstant(now.minus(AVAILABILITY_INTERVAL), ZoneOffset.UTC) .format(VERSION_DATE_PATTERN); return Optional.of(new Version(currentTarget.get().getMajor(), @@ -88,6 +88,14 @@ public class OsUpgradeScheduler extends ControllerMaintainer { .collect(Collectors.toUnmodifiableSet()); } + private boolean canTriggerAt(Instant instant) { + int hourOfDay = instant.atZone(ZoneOffset.UTC).getHour(); + int dayOfWeek = instant.atZone(ZoneOffset.UTC).getDayOfWeek().getValue(); + // Upgrade can only be scheduled between 07:00 and 12:59 UTC, Monday-Thursday + return hourOfDay >= 7 && hourOfDay <= 12 && + dayOfWeek < 5; + } + private Duration upgradeBudget() { return controller().system().isCd() ? Duration.ofHours(1) : Duration.ofDays(14); } 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 7d512ba090c..7a0175845ca 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 @@ -24,8 +24,8 @@ public class OsUpgradeSchedulerTest { public void maintain() { ControllerTester tester = new ControllerTester(); OsUpgradeScheduler scheduler = new OsUpgradeScheduler(tester.controller(), Duration.ofDays(1)); - Instant initialTime = Instant.parse("2021-01-23T00:00:00.00Z"); - tester.clock().setInstant(initialTime); + Instant t0 = Instant.parse("2021-01-23T00:00:00.00Z"); // Outside trigger period + tester.clock().setInstant(t0); CloudName cloud = CloudName.from("cloud"); ZoneApi zone = zone("prod.us-west-1", cloud); @@ -50,7 +50,12 @@ public class OsUpgradeSchedulerTest { Version version1 = Version.fromString("7.0.0.20210302"); tester.clock().advance(Duration.ofDays(15).plus(Duration.ofSeconds(1))); scheduler.maintain(); - assertEquals("New target set", version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + assertEquals("Target is unchanged because we're outside trigger period", version0, + tester.controller().osVersionTarget(cloud).get().osVersion().version()); + tester.clock().advance(Duration.ofHours(7)); // Put us inside the trigger period + scheduler.maintain(); + assertEquals("New target set", version1, + tester.controller().osVersionTarget(cloud).get().osVersion().version()); // A few days pass and target remains unchanged tester.clock().advance(Duration.ofDays(2)); |