diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-09-05 13:59:32 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-09-05 14:03:54 +0200 |
commit | 3605d3cbca9c2dc7246ce816c864d6677afe48e6 (patch) | |
tree | d681dae0925d895728a7843d5002404a224ff2d2 /node-repository | |
parent | 43bf109817a1e74f44918c2d4adac51b63615826 (diff) |
Allow allocating to hosts in ready and provisioned state
Diffstat (limited to 'node-repository')
2 files changed, 12 insertions, 9 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java index 95491845ba0..2f2283a494d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java @@ -33,6 +33,9 @@ import java.util.stream.Collectors; */ class NodePrioritizer { + /** Node states in which host can get new nodes allocated in, ordered by preference (ascending) */ + public static final List<Node.State> ALLOCATABLE_HOST_STATES = + List.of(Node.State.provisioned, Node.State.ready, Node.State.active); private final static Logger log = Logger.getLogger(NodePrioritizer.class.getName()); private final Map<Node, PrioritizableNode> nodes = new HashMap<>(); @@ -118,7 +121,8 @@ class NodePrioritizer { * already have nodes allocated to this tenant */ void addNewDockerNodes(boolean exclusively) { - LockedNodeList candidates = allNodes; + LockedNodeList candidates = allNodes + .filter(node -> node.type() != NodeType.host || ALLOCATABLE_HOST_STATES.contains(node.state())); if (exclusively) { Set<String> candidateHostnames = candidates.asList().stream() @@ -129,11 +133,7 @@ class NodePrioritizer { .flatMap(node -> node.parentHostname().stream()) .collect(Collectors.toSet()); - candidates = candidates.filter(node -> candidateHostnames.contains(node.hostname())) - .filter(node -> EnumSet.of(Node.State.provisioned, Node.State.ready, Node.State.active) - .contains(node.state())); - } else { - candidates = candidates.filter(node -> node.state() == Node.State.active); + candidates = candidates.filter(node -> candidateHostnames.contains(node.hostname())); } addNewDockerNodesOn(candidates); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java index 3d3a95cb536..e97f263e233 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java @@ -6,6 +6,8 @@ import com.yahoo.vespa.hosted.provision.Node; import java.util.Optional; +import static com.yahoo.vespa.hosted.provision.provisioning.NodePrioritizer.ALLOCATABLE_HOST_STATES; + /** * A node with additional information required to prioritize it for allocation. * @@ -74,9 +76,10 @@ class PrioritizableNode implements Comparable<PrioritizableNode> { if ( ! this.node.state().equals(other.node.state())) throw new IllegalStateException("Nodes " + this.node + " and " + other.node + " have different states"); - // Choose exact flavor - if (this.preferredOnFlavor && !other.preferredOnFlavor) return -1; - if (other.preferredOnFlavor && !this.preferredOnFlavor) return 1; + // Choose nodes where host is in more desirable state + int thisHostStatePri = this.parent.map(host -> ALLOCATABLE_HOST_STATES.indexOf(host.state())).orElse(-2); + int otherHostStatePri = other.parent.map(host -> ALLOCATABLE_HOST_STATES.indexOf(host.state())).orElse(-2); + if (thisHostStatePri != otherHostStatePri) return thisHostStatePri - otherHostStatePri; // Choose docker node over non-docker node (is this to differentiate between docker replaces non-docker flavors?) if (this.parent.isPresent() && !other.parent.isPresent()) return -1; |