diff options
author | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-09-13 14:08:34 +0200 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-09-13 14:08:34 +0200 |
commit | f4e53af4c70de712d39d0a1f0cc4b8e3d1c34a10 (patch) | |
tree | fb35d0e8433e4513985590680122705a5f6a8aac | |
parent | be02b6f3d580b78c6d5c36428b302649fb7f0717 (diff) |
Add `compute-coverage-from-target-active-docs` feature flag and Dispatch config
Defaults to false.
8 files changed, 49 insertions, 0 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 3c4eb1046bc..838fd9b6b26 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 @@ -133,6 +133,7 @@ public interface ModelContext { @ModelFeatureFlag(owners = {"vekterli"}) default boolean useTwoPhaseDocumentGc() { return false; } @ModelFeatureFlag(owners = {"hmusum"}) default int clusterControllerStateGatherCount() { return 2; } @ModelFeatureFlag(owners = {"tokle"}) default boolean useRestrictedDataPlaneBindings() { return false; } + @ModelFeatureFlag(owners = {"baldersheim", "vekterli"}) default boolean computeCoverageFromTargetActiveDocs() { return false; } } /** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */ 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 033fc4cd8de..b7b54e749f9 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 @@ -90,6 +90,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private int mbus_network_threads = 1; private Architecture adminClusterNodeResourcesArchitecture = Architecture.getDefault(); private boolean useRestrictedDataPlaneBindings = false; + private boolean computeCoverageFromTargetActiveDocs = false; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @@ -155,6 +156,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public boolean useTwoPhaseDocumentGc() { return useTwoPhaseDocumentGc; } @Override public String phraseOptimization() { return phraseOptimization; } @Override public boolean useRestrictedDataPlaneBindings() { return useRestrictedDataPlaneBindings; } + @Override public boolean computeCoverageFromTargetActiveDocs() { return computeCoverageFromTargetActiveDocs; } public TestProperties sharedStringRepoNoReclaim(boolean sharedStringRepoNoReclaim) { this.sharedStringRepoNoReclaim = sharedStringRepoNoReclaim; @@ -432,6 +434,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } + public TestProperties setComputeCoverageFromTargetActiveDocs(boolean computeCoverageFromTargetActiveDocs) { + this.computeCoverageFromTargetActiveDocs = computeCoverageFromTargetActiveDocs; + return this; + } + public static class Spec implements ConfigServerSpec { private final String hostName; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java index a3ee8d56142..94eb13dd967 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java @@ -60,6 +60,7 @@ public class IndexedSearchCluster extends SearchCluster private DispatchSpec dispatchSpec; private final List<SearchNode> searchNodes = new ArrayList<>(); private final DispatchTuning.DispatchPolicy defaultDispatchPolicy; + private final boolean computeCoverageFromTargetActiveDocs; /** * Returns the document selector that is able to resolve what documents are to be routed to this search cluster. @@ -76,6 +77,7 @@ public class IndexedSearchCluster extends SearchCluster documentDbsConfigProducer = new MultipleDocumentDatabasesConfigProducer(this, documentDbs); rootDispatch = new DispatchGroup(this); defaultDispatchPolicy = DispatchTuning.Builder.toDispatchPolicy(featureFlags.queryDispatchPolicy()); + computeCoverageFromTargetActiveDocs = featureFlags.computeCoverageFromTargetActiveDocs(); } @Override @@ -320,6 +322,7 @@ public class IndexedSearchCluster extends SearchCluster builder.searchableCopies(rootDispatch.getSearchableCopies()); builder.redundancy(rootDispatch.getRedundancy()); + builder.computeCoverageFromTargetActiveDocs(computeCoverageFromTargetActiveDocs); if (searchCoverage != null) { if (searchCoverage.getMinimum() != null) builder.minSearchCoverage(searchCoverage.getMinimum() * 100.0); 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 ac291fc578f..132255570ac 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 @@ -1036,6 +1036,27 @@ public class ContentClusterTest extends ContentBaseTest { } } + private boolean coverageIsComputedFromTargetActive(Boolean coverageFromTargetActive) { + TestProperties properties = new TestProperties(); + if (coverageFromTargetActive != null) { + properties.setComputeCoverageFromTargetActiveDocs(coverageFromTargetActive); + } + VespaModel model = createEnd2EndOneNode(properties); + + ContentCluster cc = model.getContentClusters().get("storage"); + DispatchConfig.Builder builder = new DispatchConfig.Builder(); + cc.getSearch().getConfig(builder); + + return (new DispatchConfig(builder)).computeCoverageFromTargetActiveDocs(); + } + + @Test + public void coverage_from_target_active_dispatch_config_is_controlled_by_properties() { + assertFalse(coverageIsComputedFromTargetActive(null)); // TODO update when default changes + assertFalse(coverageIsComputedFromTargetActive(false)); + assertTrue(coverageIsComputedFromTargetActive(true)); + } + private boolean resolveThreePhaseUpdateConfigWithFeatureFlag(boolean flagEnableThreePhase) { VespaModel model = createEnd2EndOneNode(new TestProperties().setUseThreePhaseUpdates(flagEnableThreePhase)); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java index 764e56c1bba..ee5cf57a396 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/cluster/ClusterTest.java @@ -15,6 +15,7 @@ import java.util.List; import static com.yahoo.config.model.test.TestUtil.joinLines; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; /** @@ -97,6 +98,7 @@ public class ClusterTest { DispatchConfig config = new DispatchConfig(builder); assertEquals(2, config.searchableCopies()); assertEquals(3, config.redundancy()); + assertFalse(config.computeCoverageFromTargetActiveDocs()); assertEquals(DispatchConfig.DistributionPolicy.ADAPTIVE, config.distributionPolicy()); assertEquals(1.0, config.maxWaitAfterCoverageFactor(), DELTA); assertEquals(0, config.minWaitAfterCoverageFactor(), DELTA); diff --git a/configdefinitions/src/vespa/dispatch.def b/configdefinitions/src/vespa/dispatch.def index 9addfca1559..fb3fc4a331a 100644 --- a/configdefinitions/src/vespa/dispatch.def +++ b/configdefinitions/src/vespa/dispatch.def @@ -73,3 +73,7 @@ node[].port int # TODO(bjorncs) Remove after May 2022 # Temporary feature flag mergeGroupingResultInSearchInvokerEnabled bool default=false + +# Whether degraded coverage computation will take target active docs into +# account, not just currently active docs. +computeCoverageFromTargetActiveDocs bool default=false 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 cdbf66f1734..d59b5da84da 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 @@ -225,6 +225,7 @@ public class ModelContextImpl implements ModelContext { private final int rpc_events_before_wakeup; private final int clusterControllerStateGatherCount; private final boolean useRestrictedDataPlaneBindings; + private final boolean computeCoverageFromTargetActiveDocs; public FeatureFlags(FlagSource source, ApplicationId appId, Version version) { this.defaultTermwiseLimit = flagValue(source, appId, version, Flags.DEFAULT_TERM_WISE_LIMIT); @@ -286,6 +287,7 @@ public class ModelContextImpl implements ModelContext { this.phraseOptimization = flagValue(source, appId, version, Flags.PHRASE_OPTIMIZATION); this.clusterControllerStateGatherCount = flagValue(source, appId, version, Flags.CLUSTER_CONTROLLER_STATE_GATHER_COUNT); this.useRestrictedDataPlaneBindings = flagValue(source, appId, version, Flags.RESTRICT_DATA_PLANE_BINDINGS); + this.computeCoverageFromTargetActiveDocs = flagValue(source, appId, version, Flags.COMPUTE_COVERAGE_FROM_TARGET_ACTIVE_DOCS); } @Override public String queryDispatchPolicy() { return queryDispatchPolicy; } @@ -355,6 +357,7 @@ public class ModelContextImpl implements ModelContext { @Override public boolean useTwoPhaseDocumentGc() { return useTwoPhaseDocumentGc; } @Override public int clusterControllerStateGatherCount() { return clusterControllerStateGatherCount; } @Override public boolean useRestrictedDataPlaneBindings() { return useRestrictedDataPlaneBindings; } + @Override public boolean computeCoverageFromTargetActiveDocs() { return computeCoverageFromTargetActiveDocs; } private static <V> V flagValue(FlagSource source, ApplicationId appId, Version vespaVersion, UnboundFlag<? extends V, ?, ?> flag) { return flag.bindTo(source) 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 b3257ec0052..12bf24eb737 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -515,6 +515,14 @@ public class Flags { "Lock scheme for tenant-related controller locks (valid values: OLD, BOTH, NEW)", "Takes effect immediately"); + public static final UnboundBooleanFlag COMPUTE_COVERAGE_FROM_TARGET_ACTIVE_DOCS = defineFeatureFlag( + "compute-coverage-from-target-active-docs", false, + List.of("baldersheim", "vekterli"), "2022-09-13", "2022-11-01", + "Whether degraded coverage computation will take target active docs into " + + "account, not just currently active docs", + "Takes effect at redeployment", + ZONE_ID, APPLICATION_ID); + /** WARNING: public for testing: All flags should be defined in {@link Flags}. */ public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List<String> owners, String createdAt, String expiresAt, String description, |