aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-02-09 19:03:03 +0100
committerMartin Polden <mpolden@mpolden.no>2021-02-09 19:04:31 +0100
commite92637c95816a36bd272699ebf8ea50a5b18a2a7 (patch)
tree14b02a65bb8d935bd1d25c3c879ba4a00c340b3a
parent1dbf8213dbcedac0fa03ff28df8afeddcb22ec2d (diff)
Avoid upgraded to unavailable versions
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java30
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java2
2 files changed, 20 insertions, 12 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 b96dc47009b..cb6d95a3300 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
@@ -26,7 +26,15 @@ import java.util.stream.Collectors;
*/
public class OsUpgradeScheduler extends ControllerMaintainer {
+ /** Trigger a new upgrade when the current target version reaches this age */
private static final Duration MAX_VERSION_AGE = Duration.ofDays(30);
+
+ /**
+ * The interval at which new versions become available. We use this to avoid scheduling upgrades to a version that
+ * may not be available yet
+ */
+ private static final Duration AVAILABILITY_INTERVAL = Duration.ofDays(7);
+
private static final DateTimeFormatter VERSION_DATE_PATTERN = DateTimeFormatter.ofPattern("yyyyMMdd");
public OsUpgradeScheduler(Controller controller, Duration interval) {
@@ -48,11 +56,12 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
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, ZoneOffset.UTC).format(VERSION_DATE_PATTERN);
+ String qualifier = LocalDate.ofInstant(now.minus(AVAILABILITY_INTERVAL), ZoneOffset.UTC)
+ .format(VERSION_DATE_PATTERN);
return Optional.of(new Version(currentTarget.get().getMajor(),
currentTarget.get().getMinor(),
currentTarget.get().getMicro(),
@@ -62,15 +71,14 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
/** Returns whether we should upgrade from given version */
private boolean hasExpired(Version version) {
String qualifier = version.getQualifier();
- if (qualifier.matches("^\\d{8,}")) {
- String dateString = qualifier.substring(0, 8);
- Instant now = controller().clock().instant();
- Instant versionDate = LocalDate.parse(dateString, VERSION_DATE_PATTERN)
- .atStartOfDay(ZoneOffset.UTC)
- .toInstant();
- return versionDate.isBefore(now.minus(MAX_VERSION_AGE));
- }
- return false;
+ if (!qualifier.matches("^\\d{8,}")) return false;
+
+ String dateString = qualifier.substring(0, 8);
+ Instant now = controller().clock().instant();
+ Instant versionDate = LocalDate.parse(dateString, VERSION_DATE_PATTERN)
+ .atStartOfDay(ZoneOffset.UTC)
+ .toInstant();
+ return versionDate.isBefore(now.minus(MAX_VERSION_AGE));
}
/** Returns the clouds where we can safely schedule OS upgrades */
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 e8cdb6ec940..4aed9b0bffe 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
@@ -48,7 +48,7 @@ public class OsUpgradeSchedulerTest {
}
// Just over 30 days pass, and a new target replaces the expired one
- Version version1 = Version.fromString("7.0.0.20210222");
+ Version version1 = Version.fromString("7.0.0.20210215");
tester.clock().advance(Duration.ofDays(15).plus(Duration.ofSeconds(1)));
scheduler.maintain();
assertEquals("New target set", version1, tester.controller().osVersionTarget(cloud).get().osVersion().version());