diff options
3 files changed, 12 insertions, 11 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsUpgrader.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsUpgrader.java index 9e931463999..f56e75518a3 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsUpgrader.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsUpgrader.java @@ -53,6 +53,7 @@ public abstract class OsUpgrader { /** Returns whether node can upgrade to version at given instant */ final boolean canUpgradeTo(Version version, Instant instant, Node node) { + if (deferringUpgrade(node, instant)) return false; Set<Version> versions = nodeRepository.osVersions().availableTo(node, version); boolean versionAvailable = versions.contains(version); if (!versionAvailable) { @@ -60,9 +61,13 @@ public abstract class OsUpgrader { version.toFullString() + ", but this version does not exist in " + node.cloudAccount() + ". Found " + versions.stream().sorted().toList()); } - return versionAvailable && - (node.status().osVersion().downgrading() || // Fast-track downgrades - node.history().age(instant).compareTo(gracePeriod()) > 0); + return versionAvailable; + } + + /** Returns whether node is deferring upgrade at given instant */ + final boolean deferringUpgrade(Node node, Instant instant) { + return !node.status().osVersion().downgrading() && // Never defer downgrades + node.history().age(instant).compareTo(gracePeriod()) <= 0; } /** The duration this leaves new nodes alone before scheduling any upgrade */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java index 0bc074cba23..f5706d3b8c9 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java @@ -159,13 +159,9 @@ public class OsVersions { } } - /** Returns whether node can be upgraded now */ - public boolean canUpgrade(Node node) { - Optional<Version> wantedVersion = node.status().osVersion().wanted(); - if (wantedVersion.isEmpty()) { - return false; - } - return chooseUpgrader(node.type(), Optional.empty()).canUpgradeTo(wantedVersion.get(), nodeRepository.clock().instant(), node); + /** Returns whether node is currently deferring its upgrade */ + public boolean deferringUpgrade(Node node) { + return chooseUpgrader(node.type(), Optional.empty()).deferringUpgrade(node, nodeRepository.clock().instant()); } /** Returns the upgrader to use when upgrading given node type to target */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java index 5c379fb1608..b8c841771f5 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java @@ -167,7 +167,7 @@ class NodesResponse extends SlimeJsonResponse { node.status().osVersion().current().ifPresent(version -> object.setString("currentOsVersion", version.toFullString())); node.status().osVersion().wanted().ifPresent(version -> object.setString("wantedOsVersion", version.toFullString())); if (node.type().isHost()) { - object.setBool("deferOsUpgrade", !nodeRepository.osVersions().canUpgrade(node)); + object.setBool("deferOsUpgrade", nodeRepository.osVersions().deferringUpgrade(node)); } node.status().firmwareVerifiedAt().ifPresent(instant -> object.setLong("currentFirmwareCheck", instant.toEpochMilli())); if (node.type().isHost()) |