diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-02-02 10:42:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-02 10:42:03 +0100 |
commit | 86784d9adebe2b2cf9d9a86aa0ea06bdc64ae8f6 (patch) | |
tree | ff79cd6e27ee5212fc558bcb1a8c44f6e9c04016 /storage | |
parent | 01462be91c91f11d75b7f836f6edc72e6029ff0c (diff) | |
parent | 21d5af8a9bb136ad1afbe43b22373394084f38f3 (diff) |
Merge pull request #30136 from vespa-engine/balder/gc-priority-control-by-config
GC priority control in config. Correct priority is essential to conteā¦
Diffstat (limited to 'storage')
5 files changed, 7 insertions, 128 deletions
diff --git a/storage/src/tests/distributor/distributor_stripe_test.cpp b/storage/src/tests/distributor/distributor_stripe_test.cpp index d2afa7f3f77..a10e4ee6a0e 100644 --- a/storage/src/tests/distributor/distributor_stripe_test.cpp +++ b/storage/src/tests/distributor/distributor_stripe_test.cpp @@ -456,43 +456,6 @@ TEST_F(DistributorStripeTest, update_bucket_database) updateBucketDB("0:456", "2:333", ResetTrusted(true))); } -TEST_F(DistributorStripeTest, priority_config_is_propagated_to_distributor_configuration) -{ - using namespace vespa::config::content::core; - - setup_stripe(Redundancy(2), NodeCount(2), "storage:2 distributor:1"); - - ConfigBuilder builder; - builder.priorityMergeMoveToIdealNode = 1; - builder.priorityMergeOutOfSyncCopies = 2; - builder.priorityMergeTooFewCopies = 3; - builder.priorityActivateNoExistingActive = 4; - builder.priorityActivateWithExistingActive = 5; - builder.priorityDeleteBucketCopy = 6; - builder.priorityJoinBuckets = 7; - builder.prioritySplitDistributionBits = 8; - builder.prioritySplitLargeBucket = 9; - builder.prioritySplitInconsistentBucket = 10; - builder.priorityGarbageCollection = 11; - builder.priorityMergeGlobalBuckets = 12; - - configure_stripe(builder); - - const auto& mp = getConfig().getMaintenancePriorities(); - EXPECT_EQ(1, static_cast<int>(mp.mergeMoveToIdealNode)); - EXPECT_EQ(2, static_cast<int>(mp.mergeOutOfSyncCopies)); - EXPECT_EQ(3, static_cast<int>(mp.mergeTooFewCopies)); - EXPECT_EQ(4, static_cast<int>(mp.activateNoExistingActive)); - EXPECT_EQ(5, static_cast<int>(mp.activateWithExistingActive)); - EXPECT_EQ(6, static_cast<int>(mp.deleteBucketCopy)); - EXPECT_EQ(7, static_cast<int>(mp.joinBuckets)); - EXPECT_EQ(8, static_cast<int>(mp.splitDistributionBits)); - EXPECT_EQ(9, static_cast<int>(mp.splitLargeBucket)); - EXPECT_EQ(10, static_cast<int>(mp.splitInconsistentBucket)); - EXPECT_EQ(11, static_cast<int>(mp.garbageCollection)); - EXPECT_EQ(12, static_cast<int>(mp.mergeGlobalBuckets)); -} - TEST_F(DistributorStripeTest, no_db_resurrection_for_bucket_not_owned_in_pending_state) { setup_stripe(Redundancy(1), NodeCount(10), "storage:2 distributor:2"); // Force new state into being the pending state. According to the initial diff --git a/storage/src/vespa/storage/config/distributorconfiguration.cpp b/storage/src/vespa/storage/config/distributorconfiguration.cpp index 321bea634a4..7800eb625e3 100644 --- a/storage/src/vespa/storage/config/distributorconfiguration.cpp +++ b/storage/src/vespa/storage/config/distributorconfiguration.cpp @@ -95,25 +95,6 @@ DistributorConfiguration::containsTimeStatement(const std::string& documentSelec return visitor.hasCurrentTime; } -void -DistributorConfiguration::configureMaintenancePriorities( - const vespa::config::content::core::StorDistributormanagerConfig& cfg) -{ - MaintenancePriorities& mp(_maintenancePriorities); - mp.mergeMoveToIdealNode = cfg.priorityMergeMoveToIdealNode; - mp.mergeOutOfSyncCopies = cfg.priorityMergeOutOfSyncCopies; - mp.mergeTooFewCopies = cfg.priorityMergeTooFewCopies; - mp.mergeGlobalBuckets = cfg.priorityMergeGlobalBuckets; - mp.activateNoExistingActive = cfg.priorityActivateNoExistingActive; - mp.activateWithExistingActive = cfg.priorityActivateWithExistingActive; - mp.deleteBucketCopy = cfg.priorityDeleteBucketCopy; - mp.joinBuckets = cfg.priorityJoinBuckets; - mp.splitDistributionBits = cfg.prioritySplitDistributionBits; - mp.splitLargeBucket = cfg.prioritySplitLargeBucket; - mp.splitInconsistentBucket = cfg.prioritySplitInconsistentBucket; - mp.garbageCollection = cfg.priorityGarbageCollection; -} - void DistributorConfiguration::configure(const vespa::config::content::core::StorDistributormanagerConfig& config) { @@ -172,11 +153,8 @@ DistributorConfiguration::configure(const vespa::config::content::core::StorDist _enable_two_phase_garbage_collection = config.enableTwoPhaseGarbageCollection; _enable_condition_probing = config.enableConditionProbing; _enable_operation_cancellation = config.enableOperationCancellation; - _minimumReplicaCountingMode = config.minimumReplicaCountingMode; - configureMaintenancePriorities(config); - if (config.maxClusterClockSkewSec >= 0) { _maxClusterClockSkew = std::chrono::seconds(config.maxClusterClockSkewSec); } diff --git a/storage/src/vespa/storage/config/distributorconfiguration.h b/storage/src/vespa/storage/config/distributorconfiguration.h index dbdb5afe929..330567953bd 100644 --- a/storage/src/vespa/storage/config/distributorconfiguration.h +++ b/storage/src/vespa/storage/config/distributorconfiguration.h @@ -12,21 +12,20 @@ namespace storage { namespace distributor { struct LegacyDistributorTest; } class DistributorConfiguration { -public: +public: + DistributorConfiguration(const DistributorConfiguration& other) = delete; + DistributorConfiguration& operator=(const DistributorConfiguration& other) = delete; explicit DistributorConfiguration(StorageComponent& component); ~DistributorConfiguration(); - struct MaintenancePriorities - { - // Defaults for these are chosen as those used as the current (non- - // configurable) values at the time of implementation. - uint8_t mergeMoveToIdealNode {120}; + struct MaintenancePriorities { + uint8_t mergeMoveToIdealNode {165}; uint8_t mergeOutOfSyncCopies {120}; uint8_t mergeTooFewCopies {120}; uint8_t mergeGlobalBuckets {115}; uint8_t activateNoExistingActive {100}; uint8_t activateWithExistingActive {100}; - uint8_t deleteBucketCopy {100}; + uint8_t deleteBucketCopy {120}; uint8_t joinBuckets {155}; uint8_t splitDistributionBits {200}; uint8_t splitLargeBucket {175}; @@ -287,9 +286,6 @@ public: bool containsTimeStatement(const std::string& documentSelection) const; private: - DistributorConfiguration(const DistributorConfiguration& other); - DistributorConfiguration& operator=(const DistributorConfiguration& other); - StorageComponent& _component; uint32_t _byteCountSplitLimit; @@ -341,10 +337,6 @@ private: bool _enable_operation_cancellation; DistrConfig::MinimumReplicaCountingMode _minimumReplicaCountingMode; - - friend struct distributor::LegacyDistributorTest; - void configureMaintenancePriorities( - const vespa::config::content::core::StorDistributormanagerConfig&); }; } diff --git a/storage/src/vespa/storage/config/stor-distributormanager.def b/storage/src/vespa/storage/config/stor-distributormanager.def index de7ac80a19f..3136a54d080 100644 --- a/storage/src/vespa/storage/config/stor-distributormanager.def +++ b/storage/src/vespa/storage/config/stor-distributormanager.def @@ -48,60 +48,6 @@ maximum_nodes_per_merge int default=16 ## distributor thread to be able to call tick() manually and run single threaded start_distributor_thread bool default=true restart -## The number of ticks calls done before a wait is done. This can be -## set higher than 10 for the distributor to improve speed of bucket iterations -## while still keep CPU load low/moderate. -ticks_before_wait int default=10 - -## Allow overriding default priorities of certain maintenance operations. -## This is an advanced feature, do not touch this unless you have a very good -## reason to do so! Configuring these values wrongly may cause starvation of -## important operations, leading to unpredictable behavior and/or data loss. -## -## Merge used to move data to ideal location -priority_merge_move_to_ideal_node int default=165 - -## Merge for copies that have gotten out of sync with each other -priority_merge_out_of_sync_copies int default=120 - -## Merge for restoring redundancy of copies -priority_merge_too_few_copies int default=120 - -## Merge that involves a global bucket. There are generally significantly fewer such -## buckets than default-space buckets, and searches to documents in the default space -## may depend on the presence of (all) global documents. Consequently, this priority -## should be higher (i.e. numerically smaller) than that of regular merges. -priority_merge_global_buckets int default=115 - -## Copy activation when there are no other active copies (likely causing -## lack of search coverage for that bucket) -priority_activate_no_existing_active int default=100 - -## Copy activation when there is already an active copy for the bucket. -priority_activate_with_existing_active int default=100 - -## Deletion of bucket copy. -priority_delete_bucket_copy int default=120 - -## Joining caused by bucket siblings getting sufficiently small to fit into a -## single bucket. -priority_join_buckets int default=155 - -## Splitting caused by system increasing its minimum distribution bit count. -priority_split_distribution_bits int default=200 - -## Splitting due to bucket exceeding max document count or byte size (see -## splitcount and splitsize config values) -priority_split_large_bucket int default=175 - -## Splitting due to buckets being inconsistently split. Should be higher -## priority than the vast majority of external load. -priority_split_inconsistent_bucket int default=110 - -## Background garbage collection. Should be lower priority than external load -## and other ideal state operations (aside from perhaps minimum bit splitting). -priority_garbage_collection int default=200 - ## The distributor can send joins that "lift" a bucket without any siblings ## higher up in the bucket tree hierarchy. The assumption is that if this ## is done for all sibling-less buckets, they will all eventually reach a diff --git a/storage/src/vespa/storage/distributor/statecheckers.cpp b/storage/src/vespa/storage/distributor/statecheckers.cpp index 1f45d79cd06..86790a2ddb7 100644 --- a/storage/src/vespa/storage/distributor/statecheckers.cpp +++ b/storage/src/vespa/storage/distributor/statecheckers.cpp @@ -721,7 +721,7 @@ checkForNodesMissingFromIdealState(const StateChecker::Context& c) if (c.idealState().size() > c.entry()->getNodeCount()) { ret.markMissingReplica(node, mp.mergeTooFewCopies); } else { - ret.markMoveToIdealLocation(node,mp.mergeMoveToIdealNode); + ret.markMoveToIdealLocation(node, mp.mergeMoveToIdealNode); } c.stats.incCopyingIn(node, c.getBucketSpace()); hasMissingReplica = true; |