summaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-05-15 11:58:47 +0200
committerGitHub <noreply@github.com>2020-05-15 11:58:47 +0200
commitca294b0a05520dff341016d2fc75056ac75b0d8e (patch)
tree33fc6007b34008ecf20fc99021c04017ccd054ba /node-repository/src/main/java
parentd05fbb6d8eae73144cf6b5f4c5eb794f3b157389 (diff)
parenta2843bab022dd8c653824c87fa1aaaf2c8dac205 (diff)
Merge pull request #13263 from vespa-engine/mpolden/os-retire-host-completely
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/Node.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java32
2 files changed, 20 insertions, 14 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
index d42efd7ba29..45ed8db3491 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
@@ -398,7 +398,7 @@ public final class Node {
public enum State {
- /** This host has been requested (from OpenStack) but is not yet ready for use */
+ /** This node has been requested, but is not yet ready for use */
provisioned,
/** This node is free and ready for use */
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));
}
}