[opt] add defensive code in PalfHandleImpl::disable_vote
This commit is contained in:
@ -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_)
|
||||||
{
|
{
|
||||||
|
@ -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));
|
||||||
|
Reference in New Issue
Block a user