[opt] add defensive code in PalfHandleImpl::disable_vote

This commit is contained in:
BinChenn
2023-08-17 12:26:46 +00:00
committed by ob-robot
parent ddbb83148a
commit d78e7ce778
2 changed files with 20 additions and 2 deletions

View File

@ -350,6 +350,12 @@ TEST_F(TestObSimpleLogClusterRebuild, test_leader_cannot_rebuild)
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->disable_sync()); EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->disable_sync());
EXPECT_EQ(OB_STATE_NOT_MATCH, leader.palf_handle_impl_->advance_base_info(base_info, true)); EXPECT_EQ(OB_STATE_NOT_MATCH, leader.palf_handle_impl_->advance_base_info(base_info, true));
AccessMode curr_access_mode;
int64_t mode_version, proposal_id;
proposal_id = leader.palf_handle_impl_->state_mgr_.get_proposal_id();
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(proposal_id, mode_version, AccessMode::RAW_WRITE, share::SCN::min_scn()));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->disable_vote(false)); EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->disable_vote(false));
while(FOLLOWER != leader.palf_handle_impl_->state_mgr_.role_) while(FOLLOWER != leader.palf_handle_impl_->state_mgr_.role_)
{ {

View File

@ -1621,14 +1621,26 @@ int PalfHandleImpl::disable_vote(const bool need_check_log_missing)
//step 1: check vote status. //step 1: check vote status.
bool vote_disabled = false; bool vote_disabled = false;
do { do {
common::ObMemberList memberlist;
int64_t replica_num = 0;
AccessMode access_mode;
RLockGuard guard(lock_); RLockGuard guard(lock_);
if (!state_mgr_.is_allow_vote()) { if (OB_FAIL(config_mgr_.get_curr_member_list(memberlist, replica_num))) {
PALF_LOG(WARN, "get_curr_member_list failed", KPC(this));
} else if (OB_FAIL(mode_mgr_.get_access_mode(access_mode))) {
PALF_LOG(WARN, "get_access_mode failed", K(ret), KPC(this));
} else if (state_mgr_.is_leader_active() &&
(1 == replica_num || AccessMode::APPEND == access_mode)) {
ret = OB_ERR_UNEXPECTED;
PALF_LOG(ERROR, "can not disable_vote in leader", KPC(this),
K(memberlist), K(replica_num), K(access_mode));
} else if (!state_mgr_.is_allow_vote()) {
PALF_LOG(INFO, "vote has already been disabled", KPC(this)); PALF_LOG(INFO, "vote has already been disabled", KPC(this));
vote_disabled = true; vote_disabled = true;
} }
} while(0); } while(0);
if (!vote_disabled) { if (OB_SUCC(ret) && !vote_disabled) {
if (OB_FAIL(election_.add_inner_priority_seed_bit(new_election_inner_priority_seed)) && OB_ENTRY_EXIST != ret) { if (OB_FAIL(election_.add_inner_priority_seed_bit(new_election_inner_priority_seed)) && OB_ENTRY_EXIST != ret) {
// Because this interface is idempotent, so we need ignore err code OB_ENTRY_EXIST. // Because this interface is idempotent, so we need ignore err code OB_ENTRY_EXIST.
PALF_LOG(WARN, "election add_inner_priority_seed_bit for rebuild failed", KPC(this)); PALF_LOG(WARN, "election add_inner_priority_seed_bit for rebuild failed", KPC(this));