diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-02-09 19:03:03 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-02-09 19:04:31 +0100 |
commit | e92637c95816a36bd272699ebf8ea50a5b18a2a7 (patch) | |
tree | 14b02a65bb8d935bd1d25c3c879ba4a00c340b3a /controller-server | |
parent | 1dbf8213dbcedac0fa03ff28df8afeddcb22ec2d (diff) |
Avoid upgraded to unavailable versions
Diffstat (limited to 'controller-server')
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()); |