aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java4
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java23
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/FileStorProducer.java21
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java29
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java16
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java10
7 files changed, 92 insertions, 13 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
index 5ca22b695a7..ce67d0d8317 100644
--- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
@@ -70,8 +70,7 @@ public interface ModelContext {
// TODO Revisit in May or June 2020
double defaultTermwiseLimit();
- // TODO Remove when 7.225 is last
- default int defaultNumResponseThreads() { return 1; }
+ default int defaultNumResponseThreads() { return 2; }
// TODO Revisit in May or June 2020
double threadPoolSizeFactor();
@@ -97,6 +96,7 @@ public interface ModelContext {
// Select sequencer type use while feeding.
String feedSequencerType();
+ String responseSequencerType();
// TODO Remove when 7.247 is last
default boolean useDistributorBtreeDb() { return true; }
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
index a31574eea10..9708207b11f 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
@@ -30,12 +30,9 @@ public class TestProperties implements ModelContext.Properties {
private boolean multitenant = false;
private ApplicationId applicationId = ApplicationId.defaultId();
private List<ConfigServerSpec> configServerSpecs = Collections.emptyList();
- private HostName loadBalancerName = null;
- private URI ztsUrl = null;
- private String athenzDnsSuffix = null;
private boolean hostedVespa = false;
private Zone zone;
- private Set<ContainerEndpoint> endpoints = Collections.emptySet();
+ private final Set<ContainerEndpoint> endpoints = Collections.emptySet();
private boolean useDedicatedNodeForLogserver = false;
private boolean useContentNodeBtreeDb = false;
private boolean useThreePhaseUpdates = false;
@@ -44,6 +41,8 @@ public class TestProperties implements ModelContext.Properties {
private double queueSizeFactor = 0.0;
private String jvmGCOptions = null;
private String sequencerType = "LATENCY";
+ private String responseSequencerType = "ADAPTIVE";
+ private int reponseNumThreads = 2;
private Optional<EndpointCertificateSecrets> endpointCertificateSecrets = Optional.empty();
private AthenzDomain athenzDomain;
private ApplicationRoles applicationRoles;
@@ -51,9 +50,9 @@ public class TestProperties implements ModelContext.Properties {
@Override public boolean multitenant() { return multitenant; }
@Override public ApplicationId applicationId() { return applicationId; }
@Override public List<ConfigServerSpec> configServerSpecs() { return configServerSpecs; }
- @Override public HostName loadBalancerName() { return loadBalancerName; }
- @Override public URI ztsUrl() { return ztsUrl; }
- @Override public String athenzDnsSuffix() { return athenzDnsSuffix; }
+ @Override public HostName loadBalancerName() { return null; }
+ @Override public URI ztsUrl() { return null; }
+ @Override public String athenzDnsSuffix() { return null; }
@Override public boolean hostedVespa() { return hostedVespa; }
@Override public Zone zone() { return zone; }
@Override public Set<ContainerEndpoint> endpoints() { return endpoints; }
@@ -74,6 +73,8 @@ public class TestProperties implements ModelContext.Properties {
@Override public boolean useThreePhaseUpdates() { return useThreePhaseUpdates; }
@Override public Optional<AthenzDomain> athenzDomain() { return Optional.ofNullable(athenzDomain); }
@Override public Optional<ApplicationRoles> applicationRoles() { return Optional.ofNullable(applicationRoles); }
+ @Override public String responseSequencerType() { return responseSequencerType; }
+ @Override public int defaultNumResponseThreads() { return reponseNumThreads; }
public TestProperties setJvmGCOptions(String gcOptions) {
jvmGCOptions = gcOptions;
@@ -83,6 +84,14 @@ public class TestProperties implements ModelContext.Properties {
sequencerType = type;
return this;
}
+ public TestProperties setResponseSequencerType(String type) {
+ responseSequencerType = type;
+ return this;
+ }
+ public TestProperties setResponseNumThreads(int numThreads) {
+ reponseNumThreads = numThreads;
+ return this;
+ }
public TestProperties setDefaultTermwiseLimit(double limit) {
defaultTermwiseLimit = limit;
return this;
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/FileStorProducer.java b/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/FileStorProducer.java
index eaefa8ea35f..2e1a6662488 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/FileStorProducer.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/FileStorProducer.java
@@ -1,7 +1,9 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model.content.storagecluster;
+import com.yahoo.config.model.api.ModelContext;
import com.yahoo.vespa.config.content.StorFilestorConfig;
+import com.yahoo.vespa.config.search.core.ProtonConfig;
import com.yahoo.vespa.model.builder.xml.dom.ModelElement;
import com.yahoo.vespa.model.content.cluster.ContentCluster;
@@ -11,8 +13,8 @@ import com.yahoo.vespa.model.content.cluster.ContentCluster;
public class FileStorProducer implements StorFilestorConfig.Producer {
public static class Builder {
- protected FileStorProducer build(ContentCluster parent, ModelElement clusterElem) {
- return new FileStorProducer(parent, getThreads(clusterElem));
+ protected FileStorProducer build(ModelContext.Properties properties, ContentCluster parent, ModelElement clusterElem) {
+ return new FileStorProducer(properties, parent, getThreads(clusterElem));
}
private Integer getThreads(ModelElement clusterElem) {
@@ -43,10 +45,21 @@ public class FileStorProducer implements StorFilestorConfig.Producer {
private final Integer numThreads;
private final ContentCluster cluster;
+ private final int reponseNumThreads;
+ private final StorFilestorConfig.Response_sequencer_type.Enum responseSequencerType;
- public FileStorProducer(ContentCluster parent, Integer numThreads) {
+ private static StorFilestorConfig.Response_sequencer_type.Enum convertResponseSequencerType(String sequencerType) {
+ try {
+ return StorFilestorConfig.Response_sequencer_type.Enum.valueOf(sequencerType);
+ } catch (Throwable t) {
+ return StorFilestorConfig.Response_sequencer_type.Enum.ADAPTIVE;
+ }
+ }
+ public FileStorProducer(ModelContext.Properties properties, ContentCluster parent, Integer numThreads) {
this.numThreads = numThreads;
this.cluster = parent;
+ this.reponseNumThreads = properties.defaultNumResponseThreads();
+ this.responseSequencerType = convertResponseSequencerType(properties.responseSequencerType());
}
@Override
@@ -55,6 +68,8 @@ public class FileStorProducer implements StorFilestorConfig.Producer {
builder.num_threads(numThreads);
}
builder.enable_multibit_split_optimalization(cluster.getPersistence().enableMultiLevelSplitting());
+ builder.num_response_threads(reponseNumThreads);
+ builder.response_sequencer_type(responseSequencerType);
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java
index 0a8abfbd3ad..981ce1bc004 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java
@@ -37,7 +37,7 @@ public class StorageCluster extends AbstractConfigProducer<StorageNode>
return new StorageCluster(ancestor,
ContentCluster.getClusterId(clusterElem),
- new FileStorProducer.Builder().build(cluster, clusterElem),
+ new FileStorProducer.Builder().build(deployState.getProperties(), cluster, clusterElem),
new IntegrityCheckerProducer.Builder().build(cluster, clusterElem),
new StorServerProducer.Builder().build(clusterElem, useContentNodeBtreeDb),
new StorVisitorProducer.Builder().build(clusterElem),
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java
index e4a02180f0e..660c4c3abad 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java
@@ -1,7 +1,9 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
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.MockApplicationPackage;
import com.yahoo.config.provision.Flavor;
@@ -34,6 +36,13 @@ public class StorageClusterTest {
.modelHostProvisioner(new SingleNodeProvisioner(flavor)).build());
return parse(xml, root);
}
+ StorageCluster parse(String xml, Flavor flavor, ModelContext.Properties properties) {
+ MockRoot root = new MockRoot("", new DeployState.Builder()
+ .applicationPackage(new MockApplicationPackage.Builder().build())
+ .modelHostProvisioner(new SingleNodeProvisioner(flavor))
+ .properties(properties).build());
+ return parse(xml, root);
+ }
StorageCluster parse(String xml) {
MockRoot root = new MockRoot();
@@ -181,6 +190,7 @@ public class StorageClusterTest {
stc.getConfig(builder);
StorFilestorConfig config = new StorFilestorConfig(builder);
assertEquals(2, config.num_response_threads());
+ assertEquals(StorFilestorConfig.Response_sequencer_type.ADAPTIVE, config.response_sequencer_type());
assertEquals(7, config.num_threads());
}
@@ -253,6 +263,25 @@ public class StorageClusterTest {
}
@Test
+ public void testFeatureFlagControlOfResponseSequencer() {
+ StorageCluster stc = parse(
+ "<cluster id=\"bees\">\n" +
+ " <documents/>" +
+ " <group>" +
+ " <node distribution-key=\"0\" hostalias=\"mockhost\"/>" +
+ " </group>" +
+ "</cluster>",
+ new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(9).build()),
+ new TestProperties().setResponseNumThreads(13).setResponseSequencerType("THROUGHPUT")
+ );
+ StorFilestorConfig.Builder builder = new StorFilestorConfig.Builder();
+ stc.getConfig(builder);
+ StorFilestorConfig config = new StorFilestorConfig(builder);
+ assertEquals(13, config.num_response_threads());
+ assertEquals(StorFilestorConfig.Response_sequencer_type.THROUGHPUT, config.response_sequencer_type());
+ }
+
+ @Test
public void integrity_checker_explicitly_disabled_when_not_running_with_vds_provider() {
StorIntegritycheckerConfig.Builder builder = new StorIntegritycheckerConfig.Builder();
parse(
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
index 77cc1075854..3cf7bdabb4d 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
@@ -155,6 +155,8 @@ public class ModelContextImpl implements ModelContext {
private final double queueSizefactor;
private final String jvmGCOPtions;
private final String feedSequencer;
+ private final String responseSequencer;
+ private final int numResponseThreads;
private final Optional<AthenzDomain> athenzDomain;
private final Optional<ApplicationRoles> applicationRoles;
private final int jdiscHealthCheckProxyClientTimeout;
@@ -200,6 +202,10 @@ public class ModelContextImpl implements ModelContext {
.with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value();
feedSequencer = Flags.FEED_SEQUENCER_TYPE.bindTo(flagSource)
.with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value();
+ responseSequencer = Flags.RESPONSE_SEQUENCER_TYPE.bindTo(flagSource)
+ .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value();
+ numResponseThreads = Flags.RESPONSE_NUM_THREADS.bindTo(flagSource)
+ .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value();
this.athenzDomain = athenzDomain;
this.applicationRoles = applicationRoles;
jdiscHealthCheckProxyClientTimeout = Flags.JDISC_HEALTH_CHECK_PROXY_CLIENT_TIMEOUT.bindTo(flagSource)
@@ -280,6 +286,16 @@ public class ModelContextImpl implements ModelContext {
@Override public Duration jdiscHealthCheckProxyClientTimeout() { return Duration.ofMillis(jdiscHealthCheckProxyClientTimeout); }
@Override public String jvmGCOptions() { return jvmGCOPtions; }
@Override public String feedSequencerType() { return feedSequencer; }
+
+ @Override
+ public String responseSequencerType() {
+ return responseSequencer;
+ }
+
+ @Override
+ public int defaultNumResponseThreads() {
+ return numResponseThreads;
+ }
}
}
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
index 60c02b3fd60..94f170107d0 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -151,6 +151,16 @@ public class Flags {
"Selects type of sequenced executor used for feeding, valid values are LATENCY, ADAPTIVE, THROUGHPUT",
"Takes effect at redeployment",
ZONE_ID, APPLICATION_ID);
+ public static final UnboundStringFlag RESPONSE_SEQUENCER_TYPE = defineStringFlag(
+ "response-sequencer-type", "ADAPTIVE",
+ "Selects type of sequenced executor used for mbus responses, valid values are LATENCY, ADAPTIVE, THROUGHPUT",
+ "Takes effect at redeployment",
+ ZONE_ID, APPLICATION_ID);
+ public static final UnboundIntFlag RESPONSE_NUM_THREADS = defineIntFlag(
+ "response-num-threads", 2,
+ "Selects type of sequenced executor used for mbus responses, valid values are LATENCY, ADAPTIVE, THROUGHPUT",
+ "Takes effect at redeployment",
+ ZONE_ID, APPLICATION_ID);
public static final UnboundBooleanFlag USE_CONTENT_NODE_BTREE_DB = defineFeatureFlag(
"use-content-node-btree-db", false,