diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-05-15 11:26:28 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-05-15 11:33:13 +0200 |
commit | a2843bab022dd8c653824c87fa1aaaf2c8dac205 (patch) | |
tree | 92165b9b01eb2c71d08efa91243d198c2291d3b4 /node-repository/src/main/java | |
parent | cced9176c9b9dd591349262d3ea53cc7c15691ee (diff) |
Explicitly retire children on host OS upgrade
Diffstat (limited to 'node-repository/src/main/java')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java index 2601060146b..8b11c10e3dd 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java @@ -9,8 +9,10 @@ import com.yahoo.vespa.hosted.provision.NodeRepository; import java.time.Duration; import java.time.Instant; +import java.util.List; import java.util.Optional; import java.util.logging.Logger; +import java.util.stream.Collectors; /** * An upgrader that retires and deprovisions nodes on stale OS versions. Retirement of each node is spread out in time, @@ -55,21 +57,25 @@ public class RetiringUpgrader implements Upgrader { // No action needed in this implementation. } - /** Retire and deprovision given node */ - private void retire(Node node, Version target, Instant now) { - try (var lock = nodeRepository.lock(node)) { - Optional<Node> currentNode = nodeRepository.getNode(node.hostname()); + /** Retire and deprovision given host and its children */ + private void retire(Node host, Version target, Instant now) { + if (!host.type().isDockerHost()) throw new IllegalArgumentException("Cannot retire non-host " + host); + try (var lock = nodeRepository.lock(host)) { + Optional<Node> currentNode = nodeRepository.getNode(host.hostname()); if (currentNode.isEmpty()) return; - node = currentNode.get(); - NodeType nodeType = node.type(); - LOG.info("Retiring and deprovisioning " + node + ": On stale OS version " + - node.status().osVersion().current().map(Version::toFullString).orElse("<unset>") + + host = currentNode.get(); + NodeType nodeType = host.type(); + List<Node> nodesToRetire = nodeRepository.list().childrenOf(host).stream() + .map(child -> child.with(child.status().withWantToRetire(true))) + .collect(Collectors.toList()); + LOG.info("Retiring and deprovisioning " + host + ": On stale OS version " + + host.status().osVersion().current().map(Version::toFullString).orElse("<unset>") + ", want " + target); - nodeRepository.write(node.with(node.status() - .withWantToRetire(true) - .withWantToDeprovision(true) - .withOsVersion(node.status().osVersion().withWanted(Optional.of(target)))), - lock); + nodesToRetire.add(host.with(host.status() + .withWantToRetire(true) + .withWantToDeprovision(true) + .withOsVersion(host.status().osVersion().withWanted(Optional.of(target))))); + nodeRepository.write(nodesToRetire, lock); nodeRepository.osVersions().writeChange((change) -> change.withRetirementAt(now, nodeType)); } } |