[PALF] fix change_access_mode do not update scn_base

This commit is contained in:
BinChenn
2023-05-30 09:18:06 +00:00
committed by ob-robot
parent 5470acf67b
commit 697656a856
3 changed files with 68 additions and 9 deletions

View File

@ -88,6 +88,7 @@ TEST_F(TestObSimpleLogClusterAccessMode, basic_change_access_mode)
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
EXPECT_EQ(leader.palf_handle_impl_->sw_.get_max_scn(), ref_scn);
EXPECT_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid());
// check all member's applied access_mode
sleep(1);
@ -119,6 +120,7 @@ TEST_F(TestObSimpleLogClusterAccessMode, basic_change_access_mode)
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
EXPECT_EQ(leader.palf_handle_impl_->sw_.get_max_scn(), ref_scn);
EXPECT_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid());
lsn_array.clear();
scn_arrary.clear();
@ -312,6 +314,53 @@ TEST_F(TestObSimpleLogClusterAccessMode, prev_log_slide)
PALF_LOG(INFO, "end test prev_log_slide", K(id));
}
TEST_F(TestObSimpleLogClusterAccessMode, single_replica_change_access_mode)
{
SET_CASE_LOG_FILE(TEST_NAME, "single_replica_change_access_mode");
int ret = OB_SUCCESS;
const int64_t id = ATOMIC_AAF(&palf_id_, 1);
PALF_LOG(INFO, "begin test single_replica_change_access_mode", K(id));
int64_t leader_idx = 0;
int64_t ref_ts_ns = common::ObTimeUtility::current_time_ns() + 1800 * 1000L * 1000L * 1000L;
share::SCN ref_scn;
ref_scn.convert_for_logservice(ref_ts_ns);
PalfHandleImplGuard leader;
const int64_t CONFIG_CHANGE_TIMEOUT = 10 * 1000 * 1000 * 1000L; // 10s
EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));
const int64_t b_idx = (leader_idx + 1) % 3;
const int64_t c_idx = (leader_idx + 2) % 3;
const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();
const common::ObAddr c_addr = get_cluster()[c_idx]->get_addr();
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->remove_member(common::ObMember(b_addr, 1), 2, CONFIG_CHANGE_TIMEOUT));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->remove_member(common::ObMember(c_addr, 1), 1, CONFIG_CHANGE_TIMEOUT));
AccessMode curr_access_mode;
int64_t mode_version, curr_proposal_id;
ObRole unused_role;
bool state;
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(AccessMode::APPEND, curr_access_mode);
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
EXPECT_EQ(OB_NOT_MASTER, submit_log(leader, 1, id));
// base_ts: 0.5 hour later
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
// check all member's applied access_mode
EXPECT_EQ(leader.palf_handle_impl_->sw_.get_max_scn(), ref_scn);
sleep(1);
std::vector<PalfHandleImplGuard*> palf_list;
EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));
EXPECT_EQ(palf::AccessMode::APPEND, palf_list[0]->palf_handle_impl_->mode_mgr_.applied_mode_meta_.access_mode_);
EXPECT_EQ(palf::AccessMode::APPEND, palf_list[1]->palf_handle_impl_->mode_mgr_.applied_mode_meta_.access_mode_);
EXPECT_EQ(palf::AccessMode::APPEND, palf_list[2]->palf_handle_impl_->mode_mgr_.applied_mode_meta_.access_mode_);
revert_cluster_palf_handle_guard(palf_list);
PALF_LOG(INFO, "end test single_replica_change_access_mode", K(id));
}
} // end unittest
} // end oceanbase

View File

@ -286,7 +286,8 @@ bool LogModeMgr::is_state_changed() const
bool_ret = (is_reach_majority || is_need_retry || is_epoch_changed);
if (true == bool_ret) {
PALF_LOG(INFO, "is_state_changed", K_(palf_id), K_(self), "state", state2str_(state_),
K(is_reach_majority), K(is_need_retry), K(is_epoch_changed));
K(is_reach_majority), K(is_need_retry), K(is_epoch_changed), K_(follower_list),
K_(majority_cnt), K_(ack_list), K_(last_submit_req_ts));
}
break;
}
@ -468,15 +469,21 @@ int LogModeMgr::switch_state_(const AccessMode &access_mode,
change_done = (true == is_reconfirm)? true: can_finish_change_mode_();
if (change_done) {
applied_mode_meta_ = accepted_mode_meta_;
if (OB_FAIL(set_resend_mode_meta_list_())) {
const bool need_inc_ref_scn = applied_mode_meta_.ref_scn_.is_valid() &&
AccessMode::APPEND == applied_mode_meta_.access_mode_;
if (need_inc_ref_scn && OB_FAIL(sw_->inc_update_scn_base(applied_mode_meta_.ref_scn_))) {
PALF_LOG(ERROR, "inc_update_base_log_ts failed", KR(ret), K_(palf_id), K_(self),
K_(applied_mode_meta));
} else if (need_inc_ref_scn && sw_->get_max_scn() < ref_scn) {
change_done = false;
ret = OB_ERR_UNEXPECTED;
PALF_LOG(ERROR, "inc_update_base_log_ts failed", KR(ret), K_(palf_id), K_(self),
K_(applied_mode_meta), KPC(sw_));
} else if (OB_FAIL(set_resend_mode_meta_list_())) {
PALF_LOG(WARN, "set_resend_mode_meta_list_ failed", K(ret), K_(palf_id), K_(self));
} else if (OB_FAIL(resend_applied_mode_meta_())) {
PALF_LOG(WARN, "resend_applied_mode_meta_ failed", K(ret), K_(palf_id), K_(self));
} else if (applied_mode_meta_.ref_scn_.is_valid() && AccessMode::APPEND == applied_mode_meta_.access_mode_ &&
OB_FAIL(sw_->inc_update_scn_base(applied_mode_meta_.ref_scn_))) {
PALF_LOG(ERROR, "inc_update_base_log_ts failed", KR(ret), K_(palf_id), K_(self),
K_(applied_mode_meta));
}
} else { }
}
} else {
PALF_LOG(INFO, "mode_meta hasn't been flushed in leader", K(ret), K_(palf_id), K_(self),
@ -568,7 +575,8 @@ int LogModeMgr::resend_applied_mode_meta_()
int ret = OB_SUCCESS;
const int64_t proposal_id = state_mgr_->get_proposal_id();
const bool is_applied_mode_meta = true;
if (OB_FAIL(log_engine_->submit_change_mode_meta_req(resend_mode_meta_list_, proposal_id,
if (resend_mode_meta_list_.is_valid() &&
OB_FAIL(log_engine_->submit_change_mode_meta_req(resend_mode_meta_list_, proposal_id,
is_applied_mode_meta, applied_mode_meta_))) {
PALF_LOG(WARN, "submit_prepare_meta_req failed", K(ret), K_(palf_id), K_(self),
K_(resend_mode_meta_list), K(proposal_id), K(is_applied_mode_meta), K_(applied_mode_meta));

View File

@ -158,10 +158,12 @@ int LSNAllocator::inc_update_scn_base(const SCN &ref_scn)
next.is_need_cut_ = 1;
if (scn_base_ + last.scn_delta_ > scn) {
// no need update
PALF_LOG(INFO, "inc_update_scn_base success", K_(scn_base),
"scn_delta", last.scn_delta_, K(scn));
break;
} else if (CAS128(&lsn_ts_meta_, last, next)) {
scn_base_ = scn;
PALF_LOG(INFO, "inc_update_scn_base success", K(scn), K(scn));
PALF_LOG(INFO, "inc_update_scn_base success", K_(scn_base), K(scn));
break;
} else {
PAUSE();