summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-11-18 15:16:23 +0100
committerJon Bratseth <bratseth@verizonmedia.com>2019-11-18 15:16:23 +0100
commitb7f69aa0f4132ea73dcc069d04fb4398b0451c25 (patch)
tree9b200258ea098985e13559e8460efa5c1c70b7a7 /node-repository
parent460f2b4c49671fe1a3cdb5cc79b5083c86ac88c3 (diff)
Simplify since we don't have node locks
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java46
1 files changed, 25 insertions, 21 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
index 0d105cd5fd8..ffc4461af51 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
@@ -113,14 +113,18 @@ public class Rebalancer extends Maintainer {
return bestMove;
}
- private boolean markWantToRetire(Node node, boolean wantToRetire, Mutex lock) {
- Optional<Node> nodeToMove = nodeRepository().getNode(node.hostname());
- if (nodeToMove.isEmpty()) return false;
- if (nodeToMove.get().state() != Node.State.active) return false;
+ /** Returns true only if this operation changes the state of the wantToRetire flag */
+ private boolean markWantToRetire(Node node, boolean wantToRetire) {
+ try (Mutex lock = nodeRepository().lock(node)) {
+ Optional<Node> nodeToMove = nodeRepository().getNode(node.hostname());
+ if (nodeToMove.isEmpty()) return false;
+ if (nodeToMove.get().state() != Node.State.active) return false;
+
+ if (node.status().wantToRetire() == wantToRetire) return false;
- if (node.status().wantToRetire() != wantToRetire)
nodeRepository().write(nodeToMove.get().withWantToRetire(wantToRetire, Agent.system, clock.instant()), lock);
- return true;
+ return true;
+ }
}
/**
@@ -133,21 +137,21 @@ public class Rebalancer extends Maintainer {
ApplicationId application = move.node.allocation().get().owner();
try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) {
if ( ! deployment.isValid()) return false;
- try (Mutex lock = nodeRepository().lock(move.node)) {
- boolean couldMarkRetired = markWantToRetire(move.node, true, lock);
- if ( ! couldMarkRetired) return false;
- try {
- if ( ! deployment.prepare()) return false;
- if (nodeRepository().getNodes(application, Node.State.reserved).stream().noneMatch(node -> node.hasParent(move.toHost.hostname())))
- return false; // Deployment is not moving the from node to the target we identified for some reason
- if ( ! deployment.activate()) return false;
-
- log.info("Rebalancer redeployed " + application + " to " + move);
- return true;
- }
- finally {
- markWantToRetire(move.node, false, lock); // In case this failed, noop otherwise
- }
+
+ boolean couldMarkRetiredNow = markWantToRetire(move.node, true);
+ if ( ! couldMarkRetiredNow) return false;
+
+ try {
+ if ( ! deployment.prepare()) return false;
+ if (nodeRepository().getNodes(application, Node.State.reserved).stream().noneMatch(node -> node.hasParent(move.toHost.hostname())))
+ return false; // Deployment is not moving the from node to the target we identified for some reason
+ if ( ! deployment.activate()) return false;
+
+ log.info("Rebalancer redeployed " + application + " to " + move);
+ return true;
+ }
+ finally {
+ markWantToRetire(move.node, false); // Necessary if this failed, no-op otherwise
}
}
}