diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-02-07 14:39:51 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-02-07 14:42:17 +0100 |
commit | 02b9fff05ad5df757b71a96e4103a7caadec8a4a (patch) | |
tree | 2e2676e29f502410307239d30c9063925c639feb /node-repository | |
parent | f1aa19a82e62bda3931051b7a04157711618f1e6 (diff) |
Add option to allocate new docker nodes exclusively
Diffstat (limited to 'node-repository')
3 files changed, 25 insertions, 5 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java index 57254e111d9..bfb7bfe9dae 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java @@ -110,7 +110,7 @@ public class NodeList implements Iterable<Node> { /** Returns the immutable list of nodes in this */ public List<Node> asList() { return nodes; } - private NodeList filter(Predicate<Node> predicate) { + public NodeList filter(Predicate<Node> predicate) { return nodes.stream().filter(predicate).collect(collectingAndThen(Collectors.toList(), NodeList::wrap)); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java index 74f2a57df10..9403729323d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java @@ -69,7 +69,7 @@ public class GroupPreparer { prioritizer.addApplicationNodes(); prioritizer.addSurplusNodes(surplusActiveNodes); prioritizer.addReadyNodes(); - prioritizer.addNewDockerNodes(allocationLock); + prioritizer.addNewDockerNodes(allocationLock, dynamicProvisioningEnabled); // Allocate from the prioritized list NodeAllocation allocation = new NodeAllocation(nodeList, application, cluster, requestedNodes, 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 a5e5473e513..b88ed8c124f 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 @@ -9,6 +9,7 @@ import com.yahoo.log.LogLevel; import com.yahoo.transaction.Mutex; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; +import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.IP; import com.yahoo.vespa.hosted.provision.persistence.NameResolver; @@ -114,13 +115,32 @@ class NodePrioritizer { /** * Add a node on each docker host with enough capacity for the requested flavor + * + * @param allocationLock allocation lock from {@link NodeRepository#lockAllocation()} + * @param exclusively Whether the ready docker nodes should only be added on hosts that + * already have nodes allocated to this tenant */ - // NOTE: This must only be called while holding the allocation lock. - void addNewDockerNodes(Mutex allocationLock) { + void addNewDockerNodes(Mutex allocationLock, boolean exclusively) { + NodeList candidates = allNodes; + + if (exclusively) { + Set<String> candidateHostnames = allNodes.asList().stream() + .filter(node -> node.type() == NodeType.tenant) + .filter(node -> node.allocation().map(a -> a.owner().tenant().equals(appId.tenant())).orElse(false)) + .flatMap(node -> node.parentHostname().stream()) + .collect(Collectors.toSet()); + + candidates = candidates.filter(node -> candidateHostnames.contains(node.hostname())); + } + + addNewDockerNodesOn(allocationLock, candidates); + } + + void addNewDockerNodesOn(Mutex allocationLock, NodeList candidates) { if (!isDocker) return; ResourceCapacity wantedResourceCapacity = ResourceCapacity.of(getFlavor(requestedNodes)); - for (Node node : allNodes) { + for (Node node : candidates) { if (node.type() != NodeType.host) continue; if (node.state() != Node.State.active) continue; if (node.status().wantToRetire()) continue; |