diff options
4 files changed, 13 insertions, 7 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 120b7f00b38..32fe9ba9f7b 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 @@ -34,12 +34,12 @@ public abstract class OsUpgrader { abstract void disableUpgrade(NodeType type); /** Returns the number of upgrade slots available for given target */ - final int upgradeSlots(OsVersionTarget target, NodeList activeNodes) { - if (!activeNodes.stream().allMatch(node -> node.type() == target.nodeType())) { + final int upgradeSlots(OsVersionTarget target, NodeList candidates) { + if (!candidates.stream().allMatch(node -> node.type() == target.nodeType())) { throw new IllegalArgumentException("All node types must type of OS version target " + target.nodeType()); } int max = target.nodeType() == NodeType.host ? maxActiveUpgrades.value() : 1; - int upgrading = activeNodes.changingOsVersionTo(target.version()).size(); + int upgrading = candidates.changingOsVersionTo(target.version()).size(); return Math.max(0, max - upgrading); } 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 f6779d08fd7..212bf5ffb12 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 @@ -67,7 +67,7 @@ public class RebuildingOsUpgrader extends OsUpgrader { // Rebuild hosts not containing stateful clusters with retiring nodes, up to rebuild limit NodeList activeHosts = hostsOfTargetType.state(Node.State.active); - int rebuildLimit = upgradeSlots(target, activeHosts); + int rebuildLimit = upgradeSlots(target, activeHosts.rebuilding(softRebuild)); List<Node> hostsToRebuild = new ArrayList<>(rebuildLimit); NodeList candidates = activeHosts.not().rebuilding(softRebuild) .osVersionIsBefore(target.version()) 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 4d98885b72c..de4915d60aa 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 @@ -56,7 +56,7 @@ public class RetiringOsUpgrader extends OsUpgrader { .osVersionIsBefore(target.version()) .matching(node -> canUpgradeAt(instant, node)) .byIncreasingOsVersion() - .first(upgradeSlots(target, activeNodes)); + .first(upgradeSlots(target, activeNodes.deprovisioning())); } /** Upgrade given host by retiring and deprovisioning it */ diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java index 4635d3ff525..9f9e6b85545 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; -import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -181,9 +180,16 @@ public class OsVersionsTest { versions.setTarget(NodeType.host, version1, false); versions.resumeUpgradeOf(NodeType.host, true); - // One host is deprovisioning + // First batch of hosts starts deprovisioning assertEquals(maxActiveUpgrades, hostNodes.get().deprovisioning().size()); + // Deprovisioning is rescheduled if some other agent resets wantToRetire/wantToDeprovision + Node host0 = hostNodes.get().deprovisioning().first().get(); + tester.patchNode(host0, (h) -> h.withWantToRetire(false, false, Agent.system, + tester.nodeRepository().clock().instant())); + versions.resumeUpgradeOf(NodeType.host, true); + assertTrue(hostNodes.get().deprovisioning().node(host0.hostname()).isPresent()); + // Nothing happens on next resume as first batch has not completed upgrade versions.resumeUpgradeOf(NodeType.host, true); NodeList nodesDeprovisioning = hostNodes.get().deprovisioning(); |