diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-07-06 09:45:27 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-07-06 09:45:27 +0000 |
commit | a1e9de08322c03f79191d84df1586eac45c8d6b5 (patch) | |
tree | 5e69f8acde7b54f1ad06b5743352dda736f9d050 | |
parent | e1a5f32ee4e4273e42720a910b6ad0e928d5854b (diff) |
Add feature flag control of response sequencer.
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, |