From ede35f912e2d2505cef07d8a580f2b1d9abd5abf Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Thu, 23 Sep 2021 14:58:14 +0200 Subject: Use static helper methods to instantiate CalculateMovedDocsRatio. --- .../vespa_redistribute_bm.cpp | 5 +-- .../estimate_moved_docs_ratio_test.cpp | 24 +++--------- .../bmcluster/calculate_moved_docs_ratio.cpp | 43 ++++++++++++++++++++++ .../bmcluster/calculate_moved_docs_ratio.h | 4 ++ 4 files changed, 53 insertions(+), 23 deletions(-) diff --git a/searchcore/src/apps/vespa-redistribute-bm/vespa_redistribute_bm.cpp b/searchcore/src/apps/vespa-redistribute-bm/vespa_redistribute_bm.cpp index d22754736ce..0227d9539d2 100644 --- a/searchcore/src/apps/vespa-redistribute-bm/vespa_redistribute_bm.cpp +++ b/searchcore/src/apps/vespa-redistribute-bm/vespa_redistribute_bm.cpp @@ -347,10 +347,7 @@ Benchmark::estimate_moved_docs() case Mode::REPLACE: if (_params.get_num_nodes() < 10) { // Calculate better estimate for moved docs ratio with brute force - uint32_t old_placement_mask = (1u << _params.get_num_nodes()) - (1u << _params.get_flip_nodes()); - uint32_t new_placement_mask = (1u << _params.get_num_nodes()) - (((1u << _params.get_flip_nodes()) - 1) << _params.get_flip_nodes()) - 1; - uint32_t new_up_mask = (1u << _params.get_num_nodes()) - 1u; - CalculateMovedDocsRatio scanner(_params.get_num_nodes(), _params.get_redundancy(), old_placement_mask, new_placement_mask, new_up_mask); + auto scanner = CalculateMovedDocsRatio::make_replace_calculator(_params.get_redundancy(), _params.get_flip_nodes(), _params.get_flip_nodes(), _params.get_num_nodes()); scanner.scan(); return _params.get_documents() * scanner.get_moved_docs_ratio(); } else { diff --git a/searchcore/src/tests/bmcluster/estimate_moved_docs_ratio/estimate_moved_docs_ratio_test.cpp b/searchcore/src/tests/bmcluster/estimate_moved_docs_ratio/estimate_moved_docs_ratio_test.cpp index 94cc04ab09a..79af31e3247 100644 --- a/searchcore/src/tests/bmcluster/estimate_moved_docs_ratio/estimate_moved_docs_ratio_test.cpp +++ b/searchcore/src/tests/bmcluster/estimate_moved_docs_ratio/estimate_moved_docs_ratio_test.cpp @@ -20,9 +20,7 @@ TEST(EstimateMovedDocsRatioTest, estimate_lost_docs_ratio) for (uint32_t nodes = 1; nodes < 2; ++nodes) { for (uint32_t redundancy = 1; redundancy <= nodes; ++redundancy) { for (uint32_t lost_nodes = 0; lost_nodes <= nodes; ++lost_nodes) { - uint32_t old_placement_mask = (1u << nodes) - 1u; - uint32_t new_placement_mask = (1u << nodes) - (1u << lost_nodes); - CalculateMovedDocsRatio scanner(nodes, redundancy, old_placement_mask, new_placement_mask, new_placement_mask); + auto scanner = CalculateMovedDocsRatio::make_crash_calculator(redundancy, lost_nodes, nodes); scanner.scan(); double lost_docs_base_ratio = scanner.get_lost_docs_base_ratio(); double estimated_lost_docs_base_ratio = EstimateMovedDocsRatio().estimate_lost_docs_base_ratio(redundancy, lost_nodes, nodes); @@ -37,9 +35,7 @@ TEST(EstimateMovedDocsRatioTest, estimate_moved_docs_ratio_grow) for (uint32_t nodes = 1; nodes < 10; ++nodes) { for (uint32_t redundancy = 1; redundancy <= nodes; ++redundancy) { for (uint32_t added_nodes = 0; added_nodes <= nodes; ++added_nodes) { - uint32_t old_placement_mask = (1u << nodes) - (1u << added_nodes); - uint32_t new_placement_mask = (1u << nodes) - 1; - CalculateMovedDocsRatio scanner(nodes, redundancy, old_placement_mask, new_placement_mask, new_placement_mask); + auto scanner = CalculateMovedDocsRatio::make_grow_calculator(redundancy, added_nodes, nodes); scanner.scan(); double moved_docs_ratio = scanner.get_moved_docs_ratio(); double estimated_moved_docs_ratio = EstimateMovedDocsRatio().estimate_moved_docs_ratio_grow(redundancy, added_nodes, nodes); @@ -54,9 +50,7 @@ TEST(EstimateMovedDocsRatioTest, estimate_moved_docs_ratio_shrink) for (uint32_t nodes = 1; nodes < 10; ++nodes) { for (uint32_t redundancy = 1; redundancy <= nodes; ++redundancy) { for (uint32_t retired_nodes = 0; retired_nodes <= nodes; ++retired_nodes) { - uint32_t old_placement_mask = (1u << nodes) - 1; - uint32_t new_placement_mask = (1u << nodes) - (1u << retired_nodes); - CalculateMovedDocsRatio scanner(nodes, redundancy, old_placement_mask, new_placement_mask, old_placement_mask); + auto scanner = CalculateMovedDocsRatio::make_shrink_calculator(redundancy, retired_nodes, nodes); scanner.scan(); double moved_docs_ratio = scanner.get_moved_docs_ratio(); double estimated_moved_docs_ratio = EstimateMovedDocsRatio().estimate_moved_docs_ratio_shrink(redundancy, retired_nodes, nodes); @@ -72,9 +66,7 @@ TEST(EstimateMovedDocsRatioTest, estimate_moved_docs_ratio_crash) for (uint32_t nodes = 1; nodes < 10; ++nodes) { for (uint32_t redundancy = 1; redundancy <= nodes; ++redundancy) { for (uint32_t crashed_nodes = 0; crashed_nodes <= nodes; ++crashed_nodes) { - uint32_t old_placement_mask = (1u << nodes) - 1; - uint32_t new_placement_mask = (1u << nodes) - (1u << crashed_nodes); - CalculateMovedDocsRatio scanner(nodes, redundancy, old_placement_mask, new_placement_mask, new_placement_mask); + auto scanner = CalculateMovedDocsRatio::make_crash_calculator(redundancy, crashed_nodes, nodes); scanner.scan(); double moved_docs_ratio = scanner.get_moved_docs_ratio(); double estimated_moved_docs_ratio = EstimateMovedDocsRatio().estimate_moved_docs_ratio_crash(redundancy, crashed_nodes, nodes); @@ -96,13 +88,7 @@ TEST(EstimateMovedDocsRatioTest, estimate_moved_docs_ratio_replace) for (uint32_t retired_nodes = 0; retired_nodes <= nodes; ++retired_nodes) { for (uint32_t added_nodes = 0; added_nodes <= nodes - retired_nodes; ++added_nodes) { // std::cout << "Estimate moved docs ratio replace " << retired_nodes << " of " << nodes << " retired, added " << added_nodes << " nodes ,redundancy " << redundancy << std::endl; - uint32_t old_placement_mask = (1u << nodes) - (1u << added_nodes); - uint32_t new_placement_mask = (1u << nodes) - (((1u << retired_nodes) - 1) << added_nodes) - 1; - uint32_t new_up_mask = (1u << nodes) - 1u; - if (verbose) { - std::cout << "0x" << std::hex << old_placement_mask << ", 0x" << std::hex << new_placement_mask << ", 0x" << new_up_mask << std::dec << std::endl; - } - CalculateMovedDocsRatio scanner(nodes, redundancy, old_placement_mask, new_placement_mask, new_up_mask); + auto scanner = CalculateMovedDocsRatio::make_replace_calculator(redundancy, added_nodes, retired_nodes, nodes); scanner.scan(); double moved_docs_ratio = scanner.get_moved_docs_ratio(); double estimated_moved_docs_ratio = EstimateMovedDocsRatio(verbose).estimate_moved_docs_ratio_replace(redundancy, added_nodes, retired_nodes, nodes); diff --git a/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.cpp b/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.cpp index 6f6e6143814..63f23476a95 100644 --- a/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.cpp +++ b/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.cpp @@ -5,6 +5,15 @@ namespace search::bmcluster { +namespace { + +uint32_t make_bit_range(uint32_t low, uint32_t high) +{ + return (1u << high) - (1u << low); +} + +} + struct CalculateMovedDocsRatio::Placements { uint32_t _mask; @@ -57,6 +66,40 @@ CalculateMovedDocsRatio::CalculateMovedDocsRatio(uint32_t nodes, uint32_t redund CalculateMovedDocsRatio::~CalculateMovedDocsRatio() = default; +CalculateMovedDocsRatio +CalculateMovedDocsRatio::make_grow_calculator(uint32_t redundancy, uint32_t added_nodes, uint32_t nodes) +{ + uint32_t old_placement_mask = make_bit_range(added_nodes, nodes); + uint32_t new_placement_mask = make_bit_range(0, nodes); + return CalculateMovedDocsRatio(nodes, redundancy, old_placement_mask, new_placement_mask, new_placement_mask); +} + +CalculateMovedDocsRatio +CalculateMovedDocsRatio::make_shrink_calculator(uint32_t redundancy, uint32_t retired_nodes, uint32_t nodes) +{ + uint32_t old_placement_mask = make_bit_range(0, nodes); + uint32_t new_placement_mask = make_bit_range(retired_nodes, nodes); + return CalculateMovedDocsRatio(nodes, redundancy, old_placement_mask, new_placement_mask, old_placement_mask); +} + +CalculateMovedDocsRatio +CalculateMovedDocsRatio::make_crash_calculator(uint32_t redundancy, uint32_t crashed_nodes, uint32_t nodes) +{ + uint32_t old_placement_mask = make_bit_range(0, nodes); + uint32_t new_placement_mask = make_bit_range(crashed_nodes, nodes); + return CalculateMovedDocsRatio(nodes, redundancy, old_placement_mask, new_placement_mask, new_placement_mask); + +} + +CalculateMovedDocsRatio +CalculateMovedDocsRatio::make_replace_calculator(uint32_t redundancy, uint32_t added_nodes, uint32_t retired_nodes, uint32_t nodes) +{ + uint32_t old_placement_mask = make_bit_range(added_nodes, nodes); + uint32_t new_placement_mask = make_bit_range(added_nodes + retired_nodes, nodes) | make_bit_range(0, added_nodes); + uint32_t new_up_mask = make_bit_range(0, nodes); + return CalculateMovedDocsRatio(nodes, redundancy, old_placement_mask, new_placement_mask, new_up_mask); +} + void CalculateMovedDocsRatio::scan(Placements selected, Placements old_placement, Placements new_placement) { diff --git a/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.h b/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.h index 65907e6eae3..cd161177246 100644 --- a/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.h +++ b/searchcore/src/vespa/searchcore/bmcluster/calculate_moved_docs_ratio.h @@ -31,6 +31,10 @@ class CalculateMovedDocsRatio public: CalculateMovedDocsRatio(uint32_t nodes, uint32_t redundancy, uint32_t old_placement_mask, uint32_t new_placement_mask, uint32_t new_up_mask); ~CalculateMovedDocsRatio(); + static CalculateMovedDocsRatio make_grow_calculator(uint32_t redundancy, uint32_t added_nodes, uint32_t nodes); + static CalculateMovedDocsRatio make_shrink_calculator(uint32_t redundancy, uint32_t retired_nodes, uint32_t nodes); + static CalculateMovedDocsRatio make_crash_calculator(uint32_t redundancy, uint32_t crashed_nodes, uint32_t nodes); + static CalculateMovedDocsRatio make_replace_calculator(uint32_t redundancy, uint32_t added_nodes, uint32_t retired_nodes, uint32_t nodes); void scan(); uint32_t get_lost_docs_base() const noexcept { return _lost_docs_base; } uint32_t get_checked_states() const noexcept { return _checked_states; } -- cgit v1.2.3