From 619b0364edcc82969fcaab80890f8e995eeed814 Mon Sep 17 00:00:00 2001 From: ZeDRoman Date: Wed, 6 Jul 2022 19:19:50 +0300 Subject: [PATCH] utest: partition balancer planner cancelation --- .../partition_balancer_planner_fixture.h | 16 ++ .../tests/partition_balancer_planner_test.cc | 180 ++++++++++++------ 2 files changed, 143 insertions(+), 53 deletions(-) diff --git a/src/v/cluster/tests/partition_balancer_planner_fixture.h b/src/v/cluster/tests/partition_balancer_planner_fixture.h index bd505b71e7e7c..b89478d753cb4 100644 --- a/src/v/cluster/tests/partition_balancer_planner_fixture.h +++ b/src/v/cluster/tests/partition_balancer_planner_fixture.h @@ -134,6 +134,22 @@ struct partition_balancer_planner_fixture { } } + cluster::move_partition_replicas_cmd make_move_partition_replicas_cmd( + model::ntp ntp, std::vector replica_set) { + return cluster::move_partition_replicas_cmd( + std::move(ntp), std::move(replica_set)); + } + + void move_partition_replicas(cluster::ntp_reassignments& reassignment) { + auto cmd = make_move_partition_replicas_cmd( + reassignment.ntp, + reassignment.allocation_units.get_assignments().front().replicas); + auto res = workers.dispatcher + .apply_update(serialize_cmd(std::move(cmd)).get()) + .get(); + BOOST_REQUIRE_EQUAL(res, cluster::errc::success); + } + std::vector create_follower_metrics(const std::set& unavailable_nodes = {}) { std::vector metrics; diff --git a/src/v/cluster/tests/partition_balancer_planner_test.cc b/src/v/cluster/tests/partition_balancer_planner_test.cc index 5d62123af4e98..c0bd64c6647a2 100644 --- a/src/v/cluster/tests/partition_balancer_planner_test.cc +++ b/src/v/cluster/tests/partition_balancer_planner_test.cc @@ -46,8 +46,8 @@ FIXTURE_TEST(test_stable, partition_balancer_planner_fixture) { auto hr = create_health_report(); auto fm = create_follower_metrics(); - auto reassignments = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE(reassignments.empty()); + auto planner_result = planner.get_ntp_reassignments(hr, fm); + BOOST_REQUIRE(planner_result.reassignments.empty()); } /* @@ -74,14 +74,14 @@ FIXTURE_TEST(test_node_down, partition_balancer_planner_fixture) { std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 1); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); std::unordered_set expected_nodes( {model::node_id(1), model::node_id(2), model::node_id(3)}); - auto new_replicas = reassignments.front() + auto new_replicas = planner_result.reassignments.front() .allocation_units.get_assignments() .front() .replicas; @@ -112,8 +112,8 @@ FIXTURE_TEST(test_no_quorum_for_partition, partition_balancer_planner_fixture) { std::set unavailable_nodes = {0, 1}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 0); + auto planner_result = planner.get_ntp_reassignments(hr, fm); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 0); } /* @@ -145,14 +145,14 @@ FIXTURE_TEST( std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 1); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); std::unordered_set expected_nodes( {model::node_id(1), model::node_id(2), model::node_id(4)}); - auto new_replicas = reassignments.front() + auto new_replicas = planner_result.reassignments.front() .allocation_units.get_assignments() .front() .replicas; @@ -184,13 +184,13 @@ FIXTURE_TEST( std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 1); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); std::unordered_set expected_nodes( {model::node_id(1), model::node_id(2), model::node_id(3)}); - auto new_replicas = reassignments.front() + auto new_replicas = planner_result.reassignments.front() .allocation_units.get_assignments() .front() .replicas; @@ -223,9 +223,9 @@ FIXTURE_TEST( std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 0); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 0); } /* @@ -252,14 +252,14 @@ FIXTURE_TEST(test_move_from_full_node, partition_balancer_planner_fixture) { auto fm = create_follower_metrics(); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 1); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); std::unordered_set expected_nodes( {model::node_id(1), model::node_id(2), model::node_id(3)}); - auto new_replicas = reassignments.front() + auto new_replicas = planner_result.reassignments.front() .allocation_units.get_assignments() .front() .replicas; @@ -293,19 +293,23 @@ FIXTURE_TEST( std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 2); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 2); std::unordered_set expected_nodes( {model::node_id(1), model::node_id(2), model::node_id(3)}); - auto new_replicas_1 - = reassignments[0].allocation_units.get_assignments().front().replicas; + auto new_replicas_1 = planner_result.reassignments[0] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas_1, expected_nodes); - auto new_replicas_2 - = reassignments[1].allocation_units.get_assignments().front().replicas; + auto new_replicas_2 = planner_result.reassignments[1] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas_2, expected_nodes); } @@ -339,20 +343,24 @@ FIXTURE_TEST( auto hr = create_health_report(full_nodes); auto fm = create_follower_metrics(); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 2); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 2); std::unordered_set expected_nodes( {model::node_id(3), model::node_id(4), model::node_id(5)}); - auto new_replicas_1 - = reassignments[0].allocation_units.get_assignments().front().replicas; + auto new_replicas_1 = planner_result.reassignments[0] + .allocation_units.get_assignments() + .front() + .replicas; BOOST_REQUIRE_EQUAL(new_replicas_1.size(), expected_nodes.size()); check_expected_assignments(new_replicas_1, expected_nodes); - auto new_replicas_2 - = reassignments[1].allocation_units.get_assignments().front().replicas; + auto new_replicas_2 = planner_result.reassignments[1] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas_2, expected_nodes); } @@ -385,15 +393,17 @@ FIXTURE_TEST( std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 1); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); std::unordered_set expected_nodes( {model::node_id(2), model::node_id(3), model::node_id(4)}); - auto new_replicas - = reassignments[0].allocation_units.get_assignments().front().replicas; + auto new_replicas = planner_result.reassignments[0] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas, expected_nodes); } @@ -428,15 +438,17 @@ FIXTURE_TEST(test_move_part_of_replicas, partition_balancer_planner_fixture) { hr.node_reports[1].local_state.disks[0].free -= 1_MiB; hr.node_reports[2].local_state.disks[0].free -= 2_MiB; - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 1); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); std::unordered_set expected_nodes( {model::node_id(0), model::node_id(3), model::node_id(4)}); - auto new_replicas - = reassignments[0].allocation_units.get_assignments().front().replicas; + auto new_replicas = planner_result.reassignments[0] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas, expected_nodes); } @@ -482,24 +494,30 @@ FIXTURE_TEST( } } - auto reassignments = planner.get_ntp_reassignments(hr, fm); + auto planner_result = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), 2); + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 2); std::unordered_set expected_nodes({model::node_id(2)}); - auto new_replicas_1 - = reassignments[0].allocation_units.get_assignments().front().replicas; + auto new_replicas_1 = planner_result.reassignments[0] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas_1, expected_nodes); // First move less size node - BOOST_REQUIRE_EQUAL(reassignments[0].ntp.tp.topic, "topic-1"); - BOOST_REQUIRE_EQUAL(reassignments[0].ntp.tp.partition, 2); - - auto new_replicas_2 - = reassignments[1].allocation_units.get_assignments().front().replicas; + BOOST_REQUIRE_EQUAL( + planner_result.reassignments[0].ntp.tp.topic, "topic-1"); + BOOST_REQUIRE_EQUAL(planner_result.reassignments[0].ntp.tp.partition, 2); + + auto new_replicas_2 = planner_result.reassignments[1] + .allocation_units.get_assignments() + .front() + .replicas; check_expected_assignments(new_replicas_2, expected_nodes); - BOOST_REQUIRE_EQUAL(reassignments[1].ntp.tp.topic, "topic-1"); - BOOST_REQUIRE_EQUAL(reassignments[1].ntp.tp.partition, 1); + BOOST_REQUIRE_EQUAL( + planner_result.reassignments[1].ntp.tp.topic, "topic-1"); + BOOST_REQUIRE_EQUAL(planner_result.reassignments[1].ntp.tp.partition, 1); } /* @@ -536,8 +554,9 @@ FIXTURE_TEST(test_lot_of_partitions, partition_balancer_planner_fixture) { std::set unavailable_nodes = {0}; auto fm = create_follower_metrics(unavailable_nodes); - auto reassignments = planner.get_ntp_reassignments(hr, fm); - BOOST_REQUIRE_EQUAL(reassignments.size(), movement_batch_partitions_amount); + auto planner_result = planner.get_ntp_reassignments(hr, fm); + BOOST_REQUIRE_EQUAL( + planner_result.reassignments.size(), movement_batch_partitions_amount); std::unordered_set expected_nodes( {model::node_id(1), @@ -548,7 +567,7 @@ FIXTURE_TEST(test_lot_of_partitions, partition_balancer_planner_fixture) { size_t node_3_counter = 0; size_t node_4_counter = 0; - for (auto& reassignment : reassignments) { + for (auto& reassignment : planner_result.reassignments) { auto new_replicas = reassignment.allocation_units.get_assignments().front().replicas; BOOST_REQUIRE(new_replicas.size() == 3); @@ -565,4 +584,59 @@ FIXTURE_TEST(test_lot_of_partitions, partition_balancer_planner_fixture) { BOOST_REQUIRE_EQUAL(node_3_counter, node_4_counter); BOOST_REQUIRE_EQUAL(node_4_counter, movement_batch_partitions_amount / 2); -} \ No newline at end of file +} + +/* + * 5 nodes; 1 topic; 1 node down + * Node 3 is down after planning + * Actual + * node_0: partitions: 1; down: True; disk: unfilled; + * node_1: partitions: 1; down: False; disk: unfilled; + * node_2: partitions: 1; down: False; disk: unfilled; + * node_3: partitions: 0; down: False; disk: unfilled; + * Expected + * node_0: partitions: 1; + * node_1: partitions: 1; + * node_2: partitions: 1; + * node_3: partitions: 0; + */ +FIXTURE_TEST(test_node_cancelation, partition_balancer_planner_fixture) { + vlog(logger.debug, "test_node_cancelation"); + allocator_register_nodes(3); + create_topic("topic-1", 1, 3); + allocator_register_nodes(1); + + auto hr = create_health_report(); + + std::set unavailable_nodes = {0}; + auto fm = create_follower_metrics(unavailable_nodes); + + auto planner_result = planner.get_ntp_reassignments(hr, fm); + + BOOST_REQUIRE_EQUAL(planner_result.reassignments.size(), 1); + + auto ntp = planner_result.reassignments.front().ntp; + + std::unordered_set expected_nodes( + {model::node_id(1), model::node_id(2), model::node_id(3)}); + + auto new_replicas = planner_result.reassignments.front() + .allocation_units.get_assignments() + .front() + .replicas; + check_expected_assignments(new_replicas, expected_nodes); + + for (auto& reassignment : planner_result.reassignments) { + move_partition_replicas(reassignment); + } + + hr = create_health_report(); + + unavailable_nodes = {0, 3}; + fm = create_follower_metrics(unavailable_nodes); + + planner_result = planner.get_ntp_reassignments(hr, fm); + BOOST_REQUIRE(planner_result.reassignments.size() == 0); + BOOST_REQUIRE(planner_result.cancelations.size() == 1); + BOOST_REQUIRE(planner_result.cancelations.front() == ntp); +}