diff options
author | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2020-11-11 10:27:06 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2020-11-11 12:11:39 +0000 |
commit | 80a8fd16ff180b3a962b31ba47f6f49e5b733ff4 (patch) | |
tree | 8a0c802150addb370801dca66e49535f22ccfd02 /storage/src | |
parent | 8d1cabe631a5a85c000bac303a90eb4149f6e73c (diff) |
Enforce minimum 8 configured distributor split bits
Even if the config model's distribution type now enforces a minimum
of 8 bits, it's still possible to violate this with explicit config
overrides. Ensure that we have a hard limit internally to be safe
even against this.
Diffstat (limited to 'storage/src')
-rw-r--r-- | storage/src/tests/distributor/distributortest.cpp | 11 | ||||
-rw-r--r-- | storage/src/vespa/storage/common/bucket_limits.h | 17 | ||||
-rw-r--r-- | storage/src/vespa/storage/config/distributorconfiguration.cpp | 3 |
3 files changed, 30 insertions, 1 deletions
diff --git a/storage/src/tests/distributor/distributortest.cpp b/storage/src/tests/distributor/distributortest.cpp index d5cf734ed0a..542ad3c0752 100644 --- a/storage/src/tests/distributor/distributortest.cpp +++ b/storage/src/tests/distributor/distributortest.cpp @@ -1188,4 +1188,15 @@ TEST_F(DistributorTest, prioritize_global_bucket_merges_config_is_propagated_to_ EXPECT_FALSE(getConfig().prioritize_global_bucket_merges()); } +TEST_F(DistributorTest, wanted_split_bit_count_is_lower_bounded) { + createLinks(); + setupDistributor(Redundancy(1), NodeCount(1), "distributor:1 storage:1"); + + ConfigBuilder builder; + builder.minsplitcount = 7; + configureDistributor(builder); + + EXPECT_EQ(getConfig().getMinimalBucketSplit(), 8); +} + } diff --git a/storage/src/vespa/storage/common/bucket_limits.h b/storage/src/vespa/storage/common/bucket_limits.h new file mode 100644 index 00000000000..f822c46c6e0 --- /dev/null +++ b/storage/src/vespa/storage/common/bucket_limits.h @@ -0,0 +1,17 @@ +#pragma once + +#include <cstdint> + +namespace storage { + +/** + * Wrapper of constants that specify absolute lower and upper bounds for buckets + * that are to be processed on a node. These invariants must be maintained by + * split and join operations, as well as bucket creation. + */ +struct BucketLimits { + constexpr static uint8_t MinUsedBits = 8; + constexpr static uint8_t MaxUsedBits = 58; +}; + +} diff --git a/storage/src/vespa/storage/config/distributorconfiguration.cpp b/storage/src/vespa/storage/config/distributorconfiguration.cpp index b3830c7e042..5a1a0ca04a0 100644 --- a/storage/src/vespa/storage/config/distributorconfiguration.cpp +++ b/storage/src/vespa/storage/config/distributorconfiguration.cpp @@ -2,6 +2,7 @@ #include "distributorconfiguration.h" #include <vespa/document/select/parser.h> #include <vespa/document/select/traversingvisitor.h> +#include <vespa/storage/common/bucket_limits.h> #include <vespa/vespalib/util/exceptions.h> #include <sstream> @@ -125,7 +126,7 @@ DistributorConfiguration::configure(const vespa::config::content::core::StorDist _docCountSplitLimit = config.splitcount; _byteCountJoinLimit = config.joinsize; _docCountJoinLimit = config.joincount; - _minimalBucketSplit = config.minsplitcount; + _minimalBucketSplit = std::max(config.minsplitcount, static_cast<int>(BucketLimits::MinUsedBits)); _maxNodesPerMerge = config.maximumNodesPerMerge; _max_consecutively_inhibited_maintenance_ticks = config.maxConsecutivelyInhibitedMaintenanceTicks; |