summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <jonbratseth@yahoo.com>2017-03-29 09:33:00 +0200
committerGitHub <noreply@github.com>2017-03-29 09:33:00 +0200
commit8eb463eecb16219f30915dca88aa2d0ddf101876 (patch)
tree96d2ee657c3b6d333ff7be97a15ba1f2ac8fcbcb /node-repository
parent35688b94a954b77cc20b984cc60ad5b0c78f7b37 (diff)
parent367cc4016d2f62c8bd08bcd2336e21e8621c99ae (diff)
Merge pull request #2096 from yahoo/bratseth/protect-node-index-invariant
Ensure index uniqueness invariant
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java12
1 files changed, 10 insertions, 2 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
index 839b60ca612..b019ca5a99c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
@@ -404,10 +404,18 @@ public class NodeRepository extends AbstractComponent {
}
private Node move(Node node, Node.State toState, Optional<String> reason) {
- if (toState == Node.State.active && !node.allocation().isPresent()) {
+ if (toState == Node.State.active && ! node.allocation().isPresent())
throw new IllegalArgumentException("Could not set " + node.hostname() + " active. It has no allocation.");
- }
+
try (Mutex lock = lock(node)) {
+ if (toState == Node.State.active) {
+ for (Node currentActive : getNodes(node.allocation().get().owner(), Node.State.active)) {
+ if (node.allocation().get().membership().cluster().equals(currentActive.allocation().get().membership().cluster())
+ && node.allocation().get().membership().index() == currentActive.allocation().get().membership().index())
+ throw new IllegalArgumentException("Could not move " + node + " to active:" +
+ "It has the same cluster and index as an existing node");
+ }
+ }
return zkClient.writeTo(toState, node, reason);
}
}