[PALF] fix change_access_mode do not update scn_base
This commit is contained in:
@ -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_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_->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(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());
|
EXPECT_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid());
|
||||||
// check all member's applied access_mode
|
// check all member's applied access_mode
|
||||||
sleep(1);
|
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_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_->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(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());
|
EXPECT_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid());
|
||||||
lsn_array.clear();
|
lsn_array.clear();
|
||||||
scn_arrary.clear();
|
scn_arrary.clear();
|
||||||
@ -312,6 +314,53 @@ TEST_F(TestObSimpleLogClusterAccessMode, prev_log_slide)
|
|||||||
PALF_LOG(INFO, "end test prev_log_slide", K(id));
|
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 unittest
|
||||||
} // end oceanbase
|
} // end oceanbase
|
||||||
|
|
||||||
|
@ -286,7 +286,8 @@ bool LogModeMgr::is_state_changed() const
|
|||||||
bool_ret = (is_reach_majority || is_need_retry || is_epoch_changed);
|
bool_ret = (is_reach_majority || is_need_retry || is_epoch_changed);
|
||||||
if (true == bool_ret) {
|
if (true == bool_ret) {
|
||||||
PALF_LOG(INFO, "is_state_changed", K_(palf_id), K_(self), "state", state2str_(state_),
|
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;
|
break;
|
||||||
}
|
}
|
||||||
@ -468,15 +469,21 @@ int LogModeMgr::switch_state_(const AccessMode &access_mode,
|
|||||||
change_done = (true == is_reconfirm)? true: can_finish_change_mode_();
|
change_done = (true == is_reconfirm)? true: can_finish_change_mode_();
|
||||||
if (change_done) {
|
if (change_done) {
|
||||||
applied_mode_meta_ = accepted_mode_meta_;
|
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));
|
PALF_LOG(WARN, "set_resend_mode_meta_list_ failed", K(ret), K_(palf_id), K_(self));
|
||||||
} else if (OB_FAIL(resend_applied_mode_meta_())) {
|
} else if (OB_FAIL(resend_applied_mode_meta_())) {
|
||||||
PALF_LOG(WARN, "resend_applied_mode_meta_ failed", K(ret), K_(palf_id), K_(self));
|
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_ &&
|
} else { }
|
||||||
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),
|
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;
|
int ret = OB_SUCCESS;
|
||||||
const int64_t proposal_id = state_mgr_->get_proposal_id();
|
const int64_t proposal_id = state_mgr_->get_proposal_id();
|
||||||
const bool is_applied_mode_meta = true;
|
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_))) {
|
is_applied_mode_meta, applied_mode_meta_))) {
|
||||||
PALF_LOG(WARN, "submit_prepare_meta_req failed", K(ret), K_(palf_id), K_(self),
|
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));
|
K_(resend_mode_meta_list), K(proposal_id), K(is_applied_mode_meta), K_(applied_mode_meta));
|
||||||
|
@ -158,10 +158,12 @@ int LSNAllocator::inc_update_scn_base(const SCN &ref_scn)
|
|||||||
next.is_need_cut_ = 1;
|
next.is_need_cut_ = 1;
|
||||||
if (scn_base_ + last.scn_delta_ > scn) {
|
if (scn_base_ + last.scn_delta_ > scn) {
|
||||||
// no need update
|
// no need update
|
||||||
|
PALF_LOG(INFO, "inc_update_scn_base success", K_(scn_base),
|
||||||
|
"scn_delta", last.scn_delta_, K(scn));
|
||||||
break;
|
break;
|
||||||
} else if (CAS128(&lsn_ts_meta_, last, next)) {
|
} else if (CAS128(&lsn_ts_meta_, last, next)) {
|
||||||
scn_base_ = scn;
|
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;
|
break;
|
||||||
} else {
|
} else {
|
||||||
PAUSE();
|
PAUSE();
|
||||||
|
Reference in New Issue
Block a user