diff options
author | Jon Bratseth <jonbratseth@yahoo.com> | 2017-03-29 09:33:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-29 09:33:00 +0200 |
commit | 8eb463eecb16219f30915dca88aa2d0ddf101876 (patch) | |
tree | 96d2ee657c3b6d333ff7be97a15ba1f2ac8fcbcb /node-repository | |
parent | 35688b94a954b77cc20b984cc60ad5b0c78f7b37 (diff) | |
parent | 367cc4016d2f62c8bd08bcd2336e21e8621c99ae (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.java | 12 |
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); } } |