From 51583412474a4d32ff60859bb1180791c1adbbde Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Mon, 13 Nov 2023 15:52:01 +0100 Subject: Add feature flag for controlling throttling-behavior of DeleteBucket operations --- config-model-api/abi-spec.json | 3 ++- .../java/com/yahoo/config/model/api/ModelContext.java | 1 + .../com/yahoo/config/model/deploy/TestProperties.java | 7 +++++++ .../model/content/storagecluster/FileStorProducer.java | 3 +++ .../yahoo/vespa/model/content/StorageClusterTest.java | 18 ++++++++++++++++++ .../vespa/config/server/deploy/ModelContextImpl.java | 3 +++ flags/src/main/java/com/yahoo/vespa/flags/Flags.java | 10 ++++++++++ 7 files changed, 44 insertions(+), 1 deletion(-) diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json index fab30efd00d..919bce460f2 100644 --- a/config-model-api/abi-spec.json +++ b/config-model-api/abi-spec.json @@ -1287,7 +1287,8 @@ "public boolean dynamicHeapSize()", "public java.lang.String unknownConfigDefinition()", "public int searchHandlerThreadpool()", - "public long mergingMaxMemoryUsagePerNode()" + "public long mergingMaxMemoryUsagePerNode()", + "public boolean usePerDocumentThrottledDeleteBucket()" ], "fields" : [ ] }, 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 833e2f020bc..188c4a32978 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 @@ -118,6 +118,7 @@ public interface ModelContext { @ModelFeatureFlag(owners = {"hmusum"}) default String unknownConfigDefinition() { return "warn"; } @ModelFeatureFlag(owners = {"hmusum"}) default int searchHandlerThreadpool() { return 2; } @ModelFeatureFlag(owners = {"vekterli"}) default long mergingMaxMemoryUsagePerNode() { return -1; } + @ModelFeatureFlag(owners = {"vekterli"}) default boolean usePerDocumentThrottledDeleteBucket() { 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 1bda8a509f1..f2444e1d222 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 @@ -88,6 +88,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private int contentLayerMetadataFeatureLevel = 0; private boolean dynamicHeapSize = false; private long mergingMaxMemoryUsagePerNode = -1; + private boolean usePerDocumentThrottledDeleteBucket = false; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @@ -148,6 +149,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public int contentLayerMetadataFeatureLevel() { return contentLayerMetadataFeatureLevel; } @Override public boolean dynamicHeapSize() { return dynamicHeapSize; } @Override public long mergingMaxMemoryUsagePerNode() { return mergingMaxMemoryUsagePerNode; } + @Override public boolean usePerDocumentThrottledDeleteBucket() { return usePerDocumentThrottledDeleteBucket; } public TestProperties sharedStringRepoNoReclaim(boolean sharedStringRepoNoReclaim) { this.sharedStringRepoNoReclaim = sharedStringRepoNoReclaim; @@ -390,6 +392,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } + public TestProperties setUsePerDocumentThrottledDeleteBucket(boolean enableThrottling) { + this.usePerDocumentThrottledDeleteBucket = enableThrottling; + return this; + } + public static class Spec implements ConfigServerSpec { private final String hostName; 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 c8f5be71f3c..18b9129cead 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 @@ -47,6 +47,7 @@ public class FileStorProducer implements StorFilestorConfig.Producer { private final int responseNumThreads; private final StorFilestorConfig.Response_sequencer_type.Enum responseSequencerType; private final boolean useAsyncMessageHandlingOnSchedule; + private final boolean usePerDocumentThrottledDeleteBucket; private static StorFilestorConfig.Response_sequencer_type.Enum convertResponseSequencerType(String sequencerType) { try { @@ -62,6 +63,7 @@ public class FileStorProducer implements StorFilestorConfig.Producer { this.responseNumThreads = featureFlags.defaultNumResponseThreads(); this.responseSequencerType = convertResponseSequencerType(featureFlags.responseSequencerType()); this.useAsyncMessageHandlingOnSchedule = featureFlags.useAsyncMessageHandlingOnSchedule(); + this.usePerDocumentThrottledDeleteBucket = featureFlags.usePerDocumentThrottledDeleteBucket(); } @Override @@ -73,6 +75,7 @@ public class FileStorProducer implements StorFilestorConfig.Producer { builder.num_response_threads(responseNumThreads); builder.response_sequencer_type(responseSequencerType); builder.use_async_message_handling_on_schedule(useAsyncMessageHandlingOnSchedule); + builder.use_per_document_throttled_delete_bucket(usePerDocumentThrottledDeleteBucket); var throttleBuilder = new StorFilestorConfig.Async_operation_throttler.Builder(); builder.async_operation_throttler(throttleBuilder); } 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 e7b2c549fa5..bdd61d93136 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 @@ -355,6 +355,24 @@ public class StorageClusterTest { assertTrue(config.async_operation_throttler().throttle_individual_merge_feed_ops()); } + private void verifyUsePerDocumentThrottledDeleteBucket(boolean expected, Boolean enabled) { + var props = new TestProperties(); + if (enabled != null) { + props.setUsePerDocumentThrottledDeleteBucket(enabled); + } + var config = filestorConfigFromProducer(simpleCluster(props)); + assertEquals(expected, config.use_per_document_throttled_delete_bucket()); + } + + @Test + void delete_bucket_throttling_is_controlled_by_feature_flag() { + // TODO update default once rolled out and tested + verifyUsePerDocumentThrottledDeleteBucket(false, null); + + verifyUsePerDocumentThrottledDeleteBucket(false, false); + verifyUsePerDocumentThrottledDeleteBucket(true, true); + } + @Test void testCapacity() { String xml = joinLines( 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 2564584a7df..28d7c1eaef6 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 @@ -210,6 +210,7 @@ public class ModelContextImpl implements ModelContext { private final String unknownConfigDefinition; private final int searchHandlerThreadpool; private final long mergingMaxMemoryUsagePerNode; + private final boolean usePerDocumentThrottledDeleteBucket; public FeatureFlags(FlagSource source, ApplicationId appId, Version version) { this.defaultTermwiseLimit = flagValue(source, appId, version, Flags.DEFAULT_TERM_WISE_LIMIT); @@ -255,6 +256,7 @@ public class ModelContextImpl implements ModelContext { this.unknownConfigDefinition = flagValue(source, appId, version, Flags.UNKNOWN_CONFIG_DEFINITION); this.searchHandlerThreadpool = flagValue(source, appId, version, Flags.SEARCH_HANDLER_THREADPOOL); this.mergingMaxMemoryUsagePerNode = flagValue(source, appId, version, Flags.MERGING_MAX_MEMORY_USAGE_PER_NODE); + this.usePerDocumentThrottledDeleteBucket = flagValue(source, appId, version, Flags.USE_PER_DOCUMENT_THROTTLED_DELETE_BUCKET); } @Override public int heapSizePercentage() { return heapPercentage; } @@ -308,6 +310,7 @@ public class ModelContextImpl implements ModelContext { @Override public String unknownConfigDefinition() { return unknownConfigDefinition; } @Override public int searchHandlerThreadpool() { return searchHandlerThreadpool; } @Override public long mergingMaxMemoryUsagePerNode() { return mergingMaxMemoryUsagePerNode; } + @Override public boolean usePerDocumentThrottledDeleteBucket() { return usePerDocumentThrottledDeleteBucket; } private static V flagValue(FlagSource source, ApplicationId appId, Version vespaVersion, UnboundFlag 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 491b7db3c13..704155b3569 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -421,6 +421,16 @@ public class Flags { "Takes effect at redeployment", INSTANCE_ID); + public static final UnboundBooleanFlag USE_PER_DOCUMENT_THROTTLED_DELETE_BUCKET = defineFeatureFlag( + "use-per-document-throttled-delete-bucket", false, + List.of("vekterli"), "2023-11-13", "2024-03-01", + "If set, DeleteBucket operations are internally expanded to an individually persistence-" + + "throttled remove per document stored in the bucket. This makes the cost model of " + + "executing a DeleteBucket symmetrical with feeding the documents to the bucket in the " + + "first place.", + "Takes effect at redeployment", + INSTANCE_ID); + /** WARNING: public for testing: All flags should be defined in {@link Flags}. */ public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List owners, String createdAt, String expiresAt, String description, -- cgit v1.2.3