Skip to content

Commit

Permalink
utest: partition balancer planner cancelation
Browse files Browse the repository at this point in the history
  • Loading branch information
ZeDRoman committed Jul 6, 2022
1 parent 974815d commit 619b036
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 53 deletions.
16 changes: 16 additions & 0 deletions src/v/cluster/tests/partition_balancer_planner_fixture.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,22 @@ struct partition_balancer_planner_fixture {
}
}

cluster::move_partition_replicas_cmd make_move_partition_replicas_cmd(
model::ntp ntp, std::vector<model::broker_shard> 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<raft::follower_metrics>
create_follower_metrics(const std::set<size_t>& unavailable_nodes = {}) {
std::vector<raft::follower_metrics> metrics;
Expand Down
180 changes: 127 additions & 53 deletions src/v/cluster/tests/partition_balancer_planner_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

/*
Expand All @@ -74,14 +74,14 @@ FIXTURE_TEST(test_node_down, partition_balancer_planner_fixture) {
std::set<size_t> 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<model::node_id> 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;
Expand Down Expand Up @@ -112,8 +112,8 @@ FIXTURE_TEST(test_no_quorum_for_partition, partition_balancer_planner_fixture) {
std::set<size_t> 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);
}

/*
Expand Down Expand Up @@ -145,14 +145,14 @@ FIXTURE_TEST(
std::set<size_t> 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<model::node_id> 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;
Expand Down Expand Up @@ -184,13 +184,13 @@ FIXTURE_TEST(
std::set<size_t> 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<model::node_id> 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;
Expand Down Expand Up @@ -223,9 +223,9 @@ FIXTURE_TEST(
std::set<size_t> 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);
}

/*
Expand All @@ -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<model::node_id> 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;
Expand Down Expand Up @@ -293,19 +293,23 @@ FIXTURE_TEST(
std::set<size_t> 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<model::node_id> 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);
}

Expand Down Expand Up @@ -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<model::node_id> 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);
}

Expand Down Expand Up @@ -385,15 +393,17 @@ FIXTURE_TEST(
std::set<size_t> 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<model::node_id> 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);
}

Expand Down Expand Up @@ -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<model::node_id> 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);
}

Expand Down Expand Up @@ -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<model::node_id> 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);
}

/*
Expand Down Expand Up @@ -536,8 +554,9 @@ FIXTURE_TEST(test_lot_of_partitions, partition_balancer_planner_fixture) {
std::set<size_t> 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<model::node_id> expected_nodes(
{model::node_id(1),
Expand All @@ -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);
Expand All @@ -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);
}
}

/*
* 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<size_t> 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<model::node_id> 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);
}

0 comments on commit 619b036

Please sign in to comment.