diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-07-05 13:11:59 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-07-07 16:08:39 +0200 |
commit | 47059d7888c9a278f2ccb038c2014b88cf6eda6a (patch) | |
tree | f2b40de33d712e15ff9f8dd1715ab446f525af20 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os | |
parent | 6d01ee5b7573a455ce1c09c2fa140f724b71383c (diff) |
Add a grace period before upgrading new nodes
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os')
4 files changed, 15 insertions, 0 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/DelegatingOsUpgrader.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/DelegatingOsUpgrader.java index 30fd2713017..9c938dd87ec 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/DelegatingOsUpgrader.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/DelegatingOsUpgrader.java @@ -41,6 +41,7 @@ public class DelegatingOsUpgrader implements OsUpgrader { int numberToUpgrade = Math.max(0, maxActiveUpgrades - activeNodes.changingOsVersionTo(target.version()).size()); NodeList nodesToUpgrade = activeNodes.not().changingOsVersionTo(target.version()) .osVersionIsBefore(target.version()) + .matching(node -> shouldUpgrade(node, nodeRepository.clock().instant())) .byIncreasingOsVersion() .first(numberToUpgrade); if (nodesToUpgrade.size() == 0) return; 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 5310ef339ed..9abb0a29628 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 @@ -2,6 +2,11 @@ package com.yahoo.vespa.hosted.provision.os; import com.yahoo.config.provision.NodeType; +import com.yahoo.vespa.hosted.provision.Node; +import com.yahoo.vespa.hosted.provision.node.History; + +import java.time.Duration; +import java.time.Instant; /** * Interface for an OS upgrader. @@ -10,10 +15,17 @@ import com.yahoo.config.provision.NodeType; */ public interface OsUpgrader { + /** The duration we should leave new nodes along before scheduling OS upgrades */ + Duration gracePeriod = Duration.ofDays(30); + /** Trigger upgrade to given target */ void upgradeTo(OsVersionTarget target); /** Disable OS upgrade for all nodes of given type */ void disableUpgrade(NodeType type); + default boolean shouldUpgrade(Node node, Instant now) { + return node.history().age(now).toSeconds() > gracePeriod.toSeconds(); + } + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RebuildingOsUpgrader.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RebuildingOsUpgrader.java index efc377e6cc3..ffedbd241d7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RebuildingOsUpgrader.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RebuildingOsUpgrader.java @@ -76,6 +76,7 @@ public class RebuildingOsUpgrader implements OsUpgrader { NodeList candidates = hostsOfTargetType.state(Node.State.active) .not().rebuilding() .osVersionIsBefore(target.version()) + .matching(node -> shouldUpgrade(node, nodeRepository.clock().instant())) .byIncreasingOsVersion(); for (Node host : candidates) { if (hostsToRebuild.size() == rebuildLimit) break; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringOsUpgrader.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringOsUpgrader.java index d923c78a929..dba79cd70ca 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringOsUpgrader.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringOsUpgrader.java @@ -38,6 +38,7 @@ public class RetiringOsUpgrader implements OsUpgrader { Instant now = nodeRepository.clock().instant(); NodeList candidates = candidates(now, target, allNodes); candidates.not().deprovisioning() + .matching(node -> shouldUpgrade(node, nodeRepository.clock().instant())) .byIncreasingOsVersion() .first(1) .forEach(node -> deprovision(node, target.version(), now)); |