summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2021-09-02 17:22:39 +0200
committerGitHub <noreply@github.com>2021-09-02 17:22:39 +0200
commit6a02d9e973b4cd549c11b0c9e893e626a09efe7f (patch)
tree798f6c9beb170bf7b7ae3c33e7a39fa4d1f07979 /config-model
parent8215c3dad77f96fd18068cf1a4efed57d6c44181 (diff)
parent8e336716ca2394f4dc506187be8e47f42686c1b7 (diff)
Merge pull request #18958 from vespa-engine/geirst/tune-num-distributor-stripes-based-on-flavor
Tune num distributor stripes based on flavor when the feature flag is…
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java24
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java9
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java77
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java2
4 files changed, 84 insertions, 28 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
index ec677911da6..f0a2e52f6bf 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.model.content;
import com.yahoo.config.model.api.ModelContext;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.vespa.config.content.core.StorCommunicationmanagerConfig;
+import com.yahoo.vespa.config.content.core.StorDistributormanagerConfig;
import com.yahoo.vespa.config.content.core.StorServerConfig;
import com.yahoo.config.model.producer.AbstractConfigProducer;
import com.yahoo.vespa.model.builder.xml.dom.ModelElement;
@@ -14,9 +15,10 @@ import org.w3c.dom.Element;
/**
* Represents specific configuration for a given distributor node.
*/
-public class Distributor extends ContentNode {
+public class Distributor extends ContentNode implements StorDistributormanagerConfig.Producer {
PersistenceEngine provider;
+ private final int numDistributorStripesFlag;
public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<Distributor> {
ModelElement clusterXml;
@@ -39,12 +41,27 @@ public class Distributor extends ContentNode {
StorageNode.rootFolder + parent.getClusterName() + "/distributor/" + distributionKey, distributionKey);
this.provider = provider;
+ this.numDistributorStripesFlag = properties.featureFlags().numDistributorStripes();
if (distributorBasePort != null) {
setBasePort(distributorBasePort);
}
}
+ private int tuneNumDistributorStripes() {
+ if ((numDistributorStripesFlag == -1) && (getHostResource() != null)) {
+ int cores = (int)getHostResource().realResources().vcpu();
+ if (cores <= 16) {
+ return 1;
+ } else if (cores <= 64) {
+ return 2;
+ } else {
+ return 4;
+ }
+ }
+ return numDistributorStripesFlag;
+ }
+
@Override
public void getConfig(StorServerConfig.Builder builder) {
super.getConfig(builder);
@@ -59,6 +76,11 @@ public class Distributor extends ContentNode {
}
@Override
+ public void getConfig(StorDistributormanagerConfig.Builder builder) {
+ builder.num_distributor_stripes(tuneNumDistributorStripes());
+ }
+
+ @Override
public String getStartupCommand() {
return "exec sbin/vespa-distributord -c $VESPA_CONFIG_ID";
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java
index 390c939c4b4..0e3fee5a749 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java
@@ -43,7 +43,6 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl
private final boolean hasIndexedDocumentType;
private final boolean useThreePhaseUpdates;
private final int maxActivationInhibitedOutOfSyncGroups;
- private final int numDistributorStripes;
public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<DistributorCluster> {
@@ -106,20 +105,18 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl
final boolean hasIndexedDocumentType = clusterContainsIndexedDocumentType(documentsNode);
boolean useThreePhaseUpdates = deployState.getProperties().featureFlags().useThreePhaseUpdates();
int maxInhibitedGroups = deployState.getProperties().featureFlags().maxActivationInhibitedOutOfSyncGroups();
- int numDistributorStripes = deployState.getProperties().featureFlags().numDistributorStripes();
return new DistributorCluster(parent,
new BucketSplitting.Builder().build(new ModelElement(producerSpec)), gc,
hasIndexedDocumentType, useThreePhaseUpdates,
- maxInhibitedGroups, numDistributorStripes);
+ maxInhibitedGroups);
}
}
private DistributorCluster(ContentCluster parent, BucketSplitting bucketSplitting,
GcOptions gc, boolean hasIndexedDocumentType,
boolean useThreePhaseUpdates,
- int maxActivationInhibitedOutOfSyncGroups,
- int numDistributorStripes)
+ int maxActivationInhibitedOutOfSyncGroups)
{
super(parent, "distributor");
this.parent = parent;
@@ -128,7 +125,6 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl
this.hasIndexedDocumentType = hasIndexedDocumentType;
this.useThreePhaseUpdates = useThreePhaseUpdates;
this.maxActivationInhibitedOutOfSyncGroups = maxActivationInhibitedOutOfSyncGroups;
- this.numDistributorStripes = numDistributorStripes;
}
@Override
@@ -142,7 +138,6 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl
builder.disable_bucket_activation(hasIndexedDocumentType == false);
builder.enable_metadata_only_fetch_phase_for_inconsistent_updates(useThreePhaseUpdates);
builder.max_activation_inhibited_out_of_sync_groups(maxActivationInhibitedOutOfSyncGroups);
- builder.num_distributor_stripes(numDistributorStripes);
bucketSplitting.getConfig(builder);
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java
index 13d02fc1fb8..c79238ed1d6 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java
@@ -4,12 +4,15 @@ package com.yahoo.vespa.model.content;
import com.yahoo.config.model.api.ModelContext;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.config.model.provision.SingleNodeProvisioner;
import com.yahoo.config.model.test.MockRoot;
import com.yahoo.config.model.test.TestDriver;
import com.yahoo.config.model.test.TestRoot;
import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.Zone;
+import com.yahoo.config.provisioning.FlavorsConfig;
import com.yahoo.container.ComponentsConfig;
import com.yahoo.messagebus.routing.RoutingTableSpec;
import com.yahoo.metrics.MetricsmanagerConfig;
@@ -798,13 +801,25 @@ public class ContentClusterTest extends ContentBaseTest {
assertPrepareRestartCommand(createClusterWithFlushOnShutdownOverride(true, true));
}
- private static ContentCluster createOneNodeCluster(boolean isHostedVespa) throws Exception {
- return createOneNodeCluster("<content version=\"1.0\" id=\"mockcluster\">" +
+ private static String oneNodeClusterXml() {
+ return "<content version=\"1.0\" id=\"mockcluster\">" +
" <documents/>" +
" <group>" +
" <node distribution-key=\"0\" hostalias=\"mockhost\"/>" +
" </group>" +
- "</content>", isHostedVespa);
+ "</content>";
+ }
+
+ private static ContentCluster createOneNodeCluster(boolean isHostedVespa) throws Exception {
+ return createOneNodeCluster(oneNodeClusterXml(), new TestProperties().setHostedVespa(isHostedVespa));
+ }
+
+ private static ContentCluster createOneNodeCluster(TestProperties props) throws Exception {
+ return createOneNodeCluster(oneNodeClusterXml(), props);
+ }
+
+ private static ContentCluster createOneNodeCluster(TestProperties props, Optional<Flavor> flavor) throws Exception {
+ return createOneNodeCluster(oneNodeClusterXml(), props, flavor);
}
private static ContentCluster createClusterWithFlushOnShutdownOverride(boolean flushOnShutdown, boolean isHostedVespa) throws Exception {
@@ -818,13 +833,20 @@ public class ContentClusterTest extends ContentBaseTest {
" <group>" +
" <node distribution-key=\"0\" hostalias=\"mockhost\"/>" +
" </group>" +
- "</content>", isHostedVespa);
+ "</content>", new TestProperties().setHostedVespa(isHostedVespa));
}
- private static ContentCluster createOneNodeCluster(String clusterXml, boolean isHostedVespa) throws Exception {
+ private static ContentCluster createOneNodeCluster(String clusterXml, TestProperties props) throws Exception {
+ return createOneNodeCluster(clusterXml, props, Optional.empty());
+ }
+
+ private static ContentCluster createOneNodeCluster(String clusterXml, TestProperties props, Optional<Flavor> flavor) throws Exception {
DeployState.Builder deployStateBuilder = new DeployState.Builder()
- .properties(new TestProperties().setHostedVespa(isHostedVespa));
- MockRoot root = ContentClusterUtils.createMockRoot(Collections.emptyList(), deployStateBuilder);
+ .properties(props);
+ MockRoot root = flavor.isPresent() ?
+ ContentClusterUtils.createMockRoot(new SingleNodeProvisioner(flavor.get()),
+ Collections.emptyList(), deployStateBuilder) :
+ ContentClusterUtils.createMockRoot(Collections.emptyList(), deployStateBuilder);
ContentCluster cluster = ContentClusterUtils.createCluster(clusterXml, root);
root.freezeModelTopology();
cluster.validate();
@@ -1015,41 +1037,58 @@ public class ContentClusterTest extends ContentBaseTest {
}
}
- private StorDistributormanagerConfig resolveStorDistributormanagerConfig(TestProperties props) {
- VespaModel model = createEnd2EndOneNode(props);
+ private StorDistributormanagerConfig resolveStorDistributormanagerConfig(TestProperties props) throws Exception {
+ var cc = createOneNodeCluster(props);
- ContentCluster cc = model.getContentClusters().get("storage");
var builder = new StorDistributormanagerConfig.Builder();
cc.getDistributorNodes().getConfig(builder);
return (new StorDistributormanagerConfig(builder));
}
- private int resolveMaxInhibitedGroupsConfigWithFeatureFlag(int maxGroups) {
+ private int resolveMaxInhibitedGroupsConfigWithFeatureFlag(int maxGroups) throws Exception {
var cfg = resolveStorDistributormanagerConfig(new TestProperties().maxActivationInhibitedOutOfSyncGroups(maxGroups));
return cfg.max_activation_inhibited_out_of_sync_groups();
}
@Test
- public void default_distributor_max_inhibited_group_activation_config_controlled_by_properties() {
+ public void default_distributor_max_inhibited_group_activation_config_controlled_by_properties() throws Exception {
assertEquals(0, resolveMaxInhibitedGroupsConfigWithFeatureFlag(0));
assertEquals(2, resolveMaxInhibitedGroupsConfigWithFeatureFlag(2));
}
- private int resolveNumDistributorStripesConfigWithFeatureFlag(TestProperties props) {
- var cfg = resolveStorDistributormanagerConfig(props);
- return cfg.num_distributor_stripes();
+ private int resolveNumDistributorStripesConfigWithFeatureFlag(TestProperties props, Optional<Flavor> flavor) throws Exception {
+ var cc = createOneNodeCluster(props, flavor);
+ var builder = new StorDistributormanagerConfig.Builder();
+ cc.getDistributorNodes().getChildren().get("0").getConfig(builder);
+ return (new StorDistributormanagerConfig(builder)).num_distributor_stripes();
}
- private int resolveNumDistributorStripesConfigWithFeatureFlag(int numStripes) {
- return resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties().setNumDistributorStripes(numStripes));
+ private int resolveNumDistributorStripesConfigWithFeatureFlag(int numStripes) throws Exception {
+ return resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties().setNumDistributorStripes(numStripes), Optional.empty());
+ }
+
+ private int resolveTunedNumDistributorStripesConfig(int numCpuCores) throws Exception {
+ var flavor = new Flavor(new FlavorsConfig.Flavor(new FlavorsConfig.Flavor.Builder().name("test").minCpuCores(numCpuCores)));
+ return resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties().setNumDistributorStripes(-1),
+ Optional.of(flavor));
}
@Test
- public void num_distributor_stripes_config_controlled_by_properties() {
- assertEquals(0, resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties()));
+ public void num_distributor_stripes_config_controlled_by_properties() throws Exception {
+ assertEquals(0, resolveNumDistributorStripesConfigWithFeatureFlag(new TestProperties(), Optional.empty()));
assertEquals(0, resolveNumDistributorStripesConfigWithFeatureFlag(0));
assertEquals(1, resolveNumDistributorStripesConfigWithFeatureFlag(1));
+ assertEquals(4, resolveNumDistributorStripesConfigWithFeatureFlag(4));
+ }
+
+ @Test
+ public void num_distributor_stripes_config_tuned_by_flavor() throws Exception {
+ assertEquals(1, resolveTunedNumDistributorStripesConfig(1));
+ assertEquals(1, resolveTunedNumDistributorStripesConfig(16));
+ assertEquals(2, resolveTunedNumDistributorStripesConfig(17));
+ assertEquals(2, resolveTunedNumDistributorStripesConfig(64));
+ assertEquals(4, resolveTunedNumDistributorStripesConfig(65));
}
@Test
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java b/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java
index a0b88b531ab..ac4a989c89b 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java
@@ -35,7 +35,7 @@ public class ContentClusterUtils {
return createMockRoot(provisioner, schemas, new DeployState.Builder());
}
- private static MockRoot createMockRoot(HostProvisioner provisioner, List<String> schemas, DeployState.Builder deployStateBuilder) {
+ public static MockRoot createMockRoot(HostProvisioner provisioner, List<String> schemas, DeployState.Builder deployStateBuilder) {
ApplicationPackage applicationPackage = new MockApplicationPackage.Builder().withSchemas(schemas).build();
DeployState deployState = deployStateBuilder.applicationPackage(applicationPackage)
.modelHostProvisioner(provisioner)