aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-06-14 10:21:39 +0200
committerMartin Polden <mpolden@mpolden.no>2021-06-14 10:40:50 +0200
commitd9d69ea0ffd70bf5e966682cb86f3b283a228a4a (patch)
treea9eb778e80dcc1db438bb9387c1c5821c7ef3463 /controller-server
parentf89b56dddff0ba7a621f07c22516103d6359e4c1 (diff)
Start OS upgrades during work hours
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java11
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));