summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@verizonmedia.com>2019-02-07 14:39:51 +0100
committerValerij Fredriksen <valerijf@verizonmedia.com>2019-02-07 14:42:17 +0100
commit02b9fff05ad5df757b71a96e4103a7caadec8a4a (patch)
tree2e2676e29f502410307239d30c9063925c639feb /node-repository
parentf1aa19a82e62bda3931051b7a04157711618f1e6 (diff)
Add option to allocate new docker nodes exclusively
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java26
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;