aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2023-01-22 13:52:24 +0100
committerJon Bratseth <bratseth@gmail.com>2023-01-22 13:52:24 +0100
commit1f2865c97efe67f6f54151c26990226063c85d26 (patch)
tree6ba3d35da902a937ca3f033d238ef24046a4ffb4 /config-model
parent9628d47ea6bb4ea7481354320bc8ba78b0425c4a (diff)
Don't constrain groups to 1 if group-size is set
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java18
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java3
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java91
3 files changed, 104 insertions, 8 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
index f44849e185f..105a9669d1f 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.model.provision;
+import com.yahoo.collections.IntRange;
import com.yahoo.collections.ListMap;
import com.yahoo.collections.Pair;
import com.yahoo.config.model.api.HostProvisioner;
@@ -153,13 +154,18 @@ public class InMemoryProvisioner implements HostProvisioner {
requested = requested.withLimits(requested.minResources().withNodes(1),
requested.maxResources().withNodes(1));
}
- if (useMaxResources)
- return prepare(cluster, requested.maxResources(), requested.isRequired(), requested.canFail());
- else
- return prepare(cluster, requested.minResources(), requested.isRequired(), requested.canFail());
+ IntRange groupRange = IntRange.of(requested.minResources().groups(), requested.maxResources().groups());
+ if (useMaxResources) {
+ int groups = groupRange.fit(requested.maxResources().nodes() / requested.groupSize().to().orElse(1));
+ return prepare(cluster, requested.maxResources(),groups, requested.isRequired(), requested.canFail());
+ }
+ else {
+ int groups = groupRange.fit(requested.minResources().nodes() / requested.groupSize().from().orElse(1));
+ return prepare(cluster, requested.minResources(), groups, requested.isRequired(), requested.canFail());
+ }
}
- public List<HostSpec> prepare(ClusterSpec cluster, ClusterResources requested, boolean required, boolean canFail) {
+ public List<HostSpec> prepare(ClusterSpec cluster, ClusterResources requested, int groups, boolean required, boolean canFail) {
if (cluster.group().isPresent() && requested.groups() > 1)
throw new IllegalArgumentException("Cannot both be specifying a group and ask for groups to be created");
@@ -169,7 +175,7 @@ public class InMemoryProvisioner implements HostProvisioner {
if (alwaysReturnOneNode)
nodes = 1;
- int groups = Math.min(requested.groups(), nodes);
+ groups = Math.min(groups, nodes);
List<HostSpec> allocation = new ArrayList<>();
if (groups == 1) {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java
index b4f49f10285..7a9ee51c29b 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java
@@ -124,8 +124,9 @@ public class NodesSpecification {
var nodes = IntRange.from(nodesElement.stringAttribute("count", ""));
var groups = IntRange.from(nodesElement.stringAttribute("groups", ""));
var groupSize = IntRange.from(nodesElement.stringAttribute("group-size", ""));
+ int defaultMaxGroups = groupSize.isEmpty() ? 1 : nodes.to().orElse(1); // Don't constrain the number of groups if group size is set
var min = new ClusterResources(nodes.from().orElse(1), groups.from().orElse(1), nodeResources(nodesElement).getFirst());
- var max = new ClusterResources(nodes.to().orElse(1), groups.to().orElse(1), nodeResources(nodesElement).getSecond());
+ var max = new ClusterResources(nodes.to().orElse(1), groups.to().orElse(defaultMaxGroups), nodeResources(nodesElement).getSecond());
return new ResourceConstraints(min, max, groupSize);
}
diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java
index a6ddce4cec5..452a9fcdf87 100644
--- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java
+++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java
@@ -595,6 +595,95 @@ public class ModelProvisioningTest {
}
@Test
+ public void testUsingGroups() {
+ String services =
+ "<?xml version='1.0' encoding='utf-8' ?>\n" +
+ "<services>" +
+ " <admin version='4.0'/>" +
+ " <container version='1.0' id='foo'>" +
+ " <nodes count='10'/>" +
+ " </container>" +
+ " <content version='1.0' id='bar'>" +
+ " <redundancy>2</redundancy>" +
+ " <documents>" +
+ " <document type='type1' mode='index'/>" +
+ " </documents>" +
+ " <nodes count='30' groups='2'/>" +
+ " </content>" +
+ " <content version='1.0' id='baz'>" +
+ " <redundancy>1</redundancy>" +
+ " <documents>" +
+ " <document type='type1' mode='index'/>" +
+ " </documents>" +
+ " <nodes count='30' groups='30'/>" +
+ " </content>" +
+ "</services>";
+
+ int numberOfHosts = 73;
+ VespaModelTester tester = new VespaModelTester();
+ tester.addHosts(numberOfHosts);
+ VespaModel model = tester.createModel(services, true);
+ assertEquals(numberOfHosts, model.getRoot().hostSystem().getHosts().size());
+
+ ContentCluster cluster = model.getContentClusters().get("bar");
+ List<StorageGroup> subGroups = cluster.getRootGroup().getSubgroups();
+ assertEquals( 0, cluster.getRootGroup().getNodes().size());
+ assertEquals( 2, subGroups.size());
+ assertEquals(15, subGroups.get(0).getNodes().size());
+
+ cluster = model.getContentClusters().get("baz");
+ subGroups = cluster.getRootGroup().getSubgroups();
+ assertEquals( 0, cluster.getRootGroup().getNodes().size());
+ assertEquals(30, subGroups.size());
+ assertEquals( 1, subGroups.get(0).getNodes().size());
+ }
+
+ // Same as the test above but setting groupSize only
+ @Test
+ public void testUsingGroupSizeNotGroups() {
+ String services =
+ "<?xml version='1.0' encoding='utf-8' ?>\n" +
+ "<services>" +
+ " <admin version='4.0'/>" +
+ " <container version='1.0' id='foo'>" +
+ " <nodes count='10'/>" +
+ " </container>" +
+ " <content version='1.0' id='bar'>" +
+ " <redundancy>2</redundancy>" +
+ " <documents>" +
+ " <document type='type1' mode='index'/>" +
+ " </documents>" +
+ " <nodes count='30' group-size='[15, 30]'/>" +
+ " </content>" +
+ " <content version='1.0' id='baz'>" +
+ " <redundancy>1</redundancy>" +
+ " <documents>" +
+ " <document type='type1' mode='index'/>" +
+ " </documents>" +
+ " <nodes count='30' group-size='1'/>" +
+ " </content>" +
+ "</services>";
+
+ int numberOfHosts = 73;
+ VespaModelTester tester = new VespaModelTester();
+ tester.addHosts(numberOfHosts);
+ VespaModel model = tester.createModel(services, true);
+ assertEquals(numberOfHosts, model.getRoot().hostSystem().getHosts().size());
+
+ ContentCluster cluster = model.getContentClusters().get("bar");
+ List<StorageGroup> subGroups = cluster.getRootGroup().getSubgroups();
+ assertEquals( 0, cluster.getRootGroup().getNodes().size());
+ assertEquals( 2, subGroups.size());
+ assertEquals(15, subGroups.get(0).getNodes().size());
+
+ cluster = model.getContentClusters().get("baz");
+ subGroups = cluster.getRootGroup().getSubgroups();
+ assertEquals( 0, cluster.getRootGroup().getNodes().size());
+ assertEquals(30, subGroups.size());
+ assertEquals( 1, subGroups.get(0).getNodes().size());
+ }
+
+ @Test
public void testSlobroksOnContainersIfNoContentClusters() {
String services =
"<?xml version='1.0' encoding='utf-8' ?>\n" +
@@ -1449,7 +1538,7 @@ public class ModelProvisioningTest {
tester.addHosts(new NodeResources(85, 200, 1000_000_000, 0.3), 20);
tester.addHosts(new NodeResources( 0.5, 2, 10, 0.3), 3);
VespaModel model = tester.createModel(services, true);
- assertEquals(totalHosts + 3, model.getRoot().hostSystem().getHosts().size());
+ assertEquals(4 + 6 + 1, model.getRoot().hostSystem().getHosts().size());
}
@Test