aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@verizonmedia.com>2019-09-05 13:59:32 +0200
committerValerij Fredriksen <valerijf@verizonmedia.com>2019-09-05 14:03:54 +0200
commit3605d3cbca9c2dc7246ce816c864d6677afe48e6 (patch)
treed681dae0925d895728a7843d5002404a224ff2d2 /node-repository
parent43bf109817a1e74f44918c2d4adac51b63615826 (diff)
Allow allocating to hosts in ready and provisioned state
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java9
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;