[fix] fix setting wrong log_sync_replica_num to add_learner when F member has been degraded

This commit is contained in:
BinChenn
2023-07-11 07:42:23 +00:00
committed by ob-robot
parent 1f46662883
commit b64fb4ec30
2 changed files with 88 additions and 4 deletions

View File

@ -1617,18 +1617,15 @@ int LogConfigMgr::generate_new_config_info_(const int64_t proposal_id,
const LogConfigChangeType cc_type = args.type_;
const common::ObMember member = args.server_;
new_config_info = log_ms_meta_.curr_;
int64_t curr_replica_num = -1;
if (INVALID_PROPOSAL_ID == proposal_id || !args.is_valid()) {
ret = OB_INVALID_ARGUMENT;
} else if (OB_FAIL(new_config_info.config_.config_version_.inc_update_version(proposal_id))) {
PALF_LOG(WARN, "generate config_version failed", KR(ret), K_(palf_id), K_(self), K(new_config_info), K(proposal_id));
} else if (STARTWORKING == cc_type) {
// pass
} else if (OB_FAIL(get_replica_num(curr_replica_num))) {
PALF_LOG(WARN, "get_replica_num failed", KR(ret), K_(palf_id), K_(self), K(args));
} else {
// change replcia num
int64_t new_log_sync_replica_num = curr_replica_num;
int64_t new_log_sync_replica_num = new_config_info.config_.log_sync_replica_num_;
if (is_may_change_replica_num(cc_type)) {
const bool is_remove_degraded_learner = is_remove_log_sync_member_list(args.type_) &&
new_config_info.config_.degraded_learnerlist_.contains(member);

View File

@ -1097,6 +1097,93 @@ TEST_F(TestLogConfigMgr, test_apply_config_meta)
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 2);
PALF_LOG(INFO, "test_check_config_change_args end case 31");
}
{
// 32. 4F1A, remove(D, 5), remove(C, 5),
PALF_LOG(INFO, "test_check_config_change_args begin case 32");
LogConfigMgr cm;
init_test_log_config_env(addr1, four_f_one_a_config_info, cm);
bool already_finished = false;
int tmp_ret = OB_SUCCESS;
LSN prev_lsn;
prev_lsn.val_ = PALF_INITIAL_LSN_VAL;
// remove(D, 5)
LogConfigChangeArgs remove_d_arg(ObMember(addr4, -1), 5, palf::REMOVE_MEMBER);
tmp_ret = cm.append_config_meta_(1, remove_d_arg, already_finished);
EXPECT_EQ(tmp_ret, OB_SUCCESS) << "remove(D, 5)";
EXPECT_EQ(already_finished, false) << "remove(D, 5)";
ObMemberList expect_member_list = four_f_member_list;
expect_member_list.remove_server(addr4);
expect_member_list.add_server(addr5);
// memberlist will not be applied right now when there is arb member, so use alive_paxos_memberlist_
bool member_equal = (cm.alive_paxos_memberlist_.member_addr_equal(expect_member_list));
EXPECT_TRUE(member_equal);
// remove(C, 5)
cm.reset_status();
LogConfigChangeArgs remove_c_arg(ObMember(addr3, -1), 5, palf::REMOVE_MEMBER);
tmp_ret = cm.append_config_meta_(1, remove_c_arg, already_finished);
EXPECT_EQ(tmp_ret, OB_INVALID_ARGUMENT) << "remove(C, 5)";
PALF_LOG(INFO, "test_check_config_change_args end case 32");
}
{
// 33. 2F1A - abc, degrade b, migrate b to d: add d as learner, remove degraded b.
PALF_LOG(INFO, "test_check_config_change_args begin case 33");
LogConfigMgr cm;
init_test_log_config_env(addr1, two_f_one_a_config_info, cm);
bool already_finished = false;
ObMemberList expect_member_list;
int64_t expect_replica_num = 0;
// degrade B
LogConfigChangeArgs degrade_b_arg(ObMember(addr2, -1), 0, palf::DEGRADE_ACCEPTOR_TO_LEARNER);
EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, degrade_b_arg, already_finished));
EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
EXPECT_EQ(expect_replica_num, 2);
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 1);
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 1);
// add d as learner
LogConfigVersion config_version;
common::ObMember migrating_d = common::ObMember(addr4, -1);
// migrating_d.set_migrating();
LogConfigChangeArgs add_d_arg(migrating_d, 0, palf::ADD_LEARNER);
EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, add_d_arg, already_finished));
EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
EXPECT_EQ(expect_replica_num, 2);
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 1);
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 1);
// add d as learner, reentrant
EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, add_d_arg, already_finished));
EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
EXPECT_EQ(expect_replica_num, 2);
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 1);
EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 1);
// switch d to acceptor
// EXPECT_EQ(OB_SUCCESS, cm.get_config_version(config_version));
// LogConfigChangeArgs switch_d_arg(migrating_d, 2, config_version, palf::SWITCH_LEARNER_TO_ACCEPTOR_AND_NUM);
// EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, switch_d_arg, already_finished));
// EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
// EXPECT_EQ(expect_replica_num, 3);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 2);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 2);
// // switch d to acceptor, reentrant
// EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, switch_d_arg, already_finished));
// EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
// EXPECT_EQ(expect_replica_num, 3);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 2);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 2);
// remove B and num
// LogConfigChangeArgs remove_b_arg(ObMember(addr2, -1), 0, palf::REMOVE_MEMBER_AND_NUM);
// EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, remove_b_arg, already_finished));
// EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
// EXPECT_EQ(expect_replica_num, 2);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 2);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 2);
// // remove B and num, reentrant
// EXPECT_EQ(OB_SUCCESS, cm.append_config_meta_(1, remove_b_arg, already_finished));
// EXPECT_EQ(OB_SUCCESS, cm.get_curr_member_list(expect_member_list, expect_replica_num));
// EXPECT_EQ(expect_replica_num, 2);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_replica_num_, 2);
// EXPECT_EQ(cm.log_ms_meta_.curr_.config_.log_sync_memberlist_.get_member_number(), 2);
PALF_LOG(INFO, "test_check_config_change_args end case 31");
}
}
TEST_F(TestLogConfigMgr, test_submit_start_working_log)