diff --git a/mittest/logservice/test_ob_simple_log_access_mode.cpp b/mittest/logservice/test_ob_simple_log_access_mode.cpp index fb261ebd8c..0faa9028c3 100644 --- a/mittest/logservice/test_ob_simple_log_access_mode.cpp +++ b/mittest/logservice/test_ob_simple_log_access_mode.cpp @@ -82,11 +82,13 @@ TEST_F(TestObSimpleLogClusterAccessMode, basic_change_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::FLASHBACK, share::SCN::min_scn())); + EXPECT_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid()); 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)); + 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); std::vector palf_list; @@ -113,9 +115,11 @@ TEST_F(TestObSimpleLogClusterAccessMode, basic_change_access_mode) // can not APPEND -> FLASHBACK EXPECT_EQ(OB_STATE_NOT_MATCH, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::FLASHBACK, ref_scn)); EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::RAW_WRITE, ref_scn)); + EXPECT_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid()); 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_UNTIL_EQ(false, leader.palf_handle_impl_->mode_mgr_.resend_mode_meta_list_.is_valid()); lsn_array.clear(); scn_arrary.clear(); EXPECT_EQ(OB_SUCCESS, submit_log(leader, 50, id, lsn_array, scn_arrary)); diff --git a/src/logservice/palf/log_mode_mgr.cpp b/src/logservice/palf/log_mode_mgr.cpp index 4c1f5820b3..61db13f5bf 100644 --- a/src/logservice/palf/log_mode_mgr.cpp +++ b/src/logservice/palf/log_mode_mgr.cpp @@ -755,6 +755,8 @@ int LogModeMgr::after_flush_mode_meta(const bool is_applied_mode_meta, const Log applied_mode_meta_ = (mode_meta.proposal_id_ > applied_mode_meta_.proposal_id_)? mode_meta: applied_mode_meta_; } + PALF_LOG(INFO, "after_flush_mode_meta success", K(ret), K_(palf_id), K_(self), + K(is_applied_mode_meta), K(mode_meta), K_(accepted_mode_meta), K_(applied_mode_meta)); } return ret; } @@ -774,11 +776,10 @@ int LogModeMgr::ack_mode_meta(const common::ObAddr &server, const int64_t propos K(proposal_id), K_(new_proposal_id), "state", state2str_(state_)); } else if (OB_FAIL(ack_list_.add_server(server))) { PALF_LOG(WARN, "add_server failed", K(ret), K_(palf_id), K_(self), K(server)); - } else { - PALF_LOG(INFO, "ack_mode_meta success", K(ret), K_(palf_id), K_(self), K(server), - K(proposal_id), K_(follower_list), K_(majority_cnt), K_(ack_list)); - } + } else { } (void) resend_mode_meta_list_.remove_learner(server); + PALF_LOG(INFO, "ack_mode_meta finish", K(ret), K_(palf_id), K_(self), K(server), + K(proposal_id), K_(follower_list), K_(majority_cnt), K_(ack_list), K_(resend_mode_meta_list)); return ret; } diff --git a/src/logservice/palf/log_mode_mgr.h b/src/logservice/palf/log_mode_mgr.h index ab680e2267..f43d6e020f 100644 --- a/src/logservice/palf/log_mode_mgr.h +++ b/src/logservice/palf/log_mode_mgr.h @@ -93,7 +93,8 @@ public: TO_STRING_KV(K_(palf_id), K_(self), K_(applied_mode_meta), K_(accepted_mode_meta), K_(last_submit_mode_meta), "state", state2str_(state_), K_(new_proposal_id), K_(local_max_lsn), K_(local_max_log_pid), K_(max_majority_accepted_pid), K_(max_majority_lsn), - K_(max_majority_accepted_mode_meta), K_(follower_list), K_(ack_list), K_(majority_cnt)); + K_(max_majority_accepted_mode_meta), K_(follower_list), K_(ack_list), K_(majority_cnt), + K_(last_submit_req_ts), K_(resend_mode_meta_list)); private: void reset_status_(); diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index ef98eec740..0f6c9e230c 100644 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -2390,19 +2390,20 @@ int PalfHandleImpl::receive_mode_meta(const common::ObAddr &server, } else if (true == is_applied_mode_meta && OB_SUCCESS != (lock_ret = lock_.wrlock())) { } else if (false == mode_mgr_.can_receive_mode_meta(proposal_id, mode_meta, has_accepted)) { PALF_LOG(WARN, "can_receive_mode_meta failed", KR(ret), KPC(this), K(proposal_id), K(mode_meta)); - } else if (true == has_accepted && false == is_applied_mode_meta) { + } else if (true == has_accepted) { if (OB_FAIL(log_engine_.submit_change_mode_meta_resp(server, proposal_id))) { PALF_LOG(WARN, "submit_change_mode_meta_resp failed", KR(ret), KPC(this), K(proposal_id), K(mode_meta)); } - } else if (true == has_accepted && true == is_applied_mode_meta) { - // update LogModeMgr::applied_mode_meta requires wlock - (void) mode_mgr_.after_flush_mode_meta(is_applied_mode_meta, mode_meta); + if (true == is_applied_mode_meta) { + // update LogModeMgr::applied_mode_meta requires wlock + (void) mode_mgr_.after_flush_mode_meta(is_applied_mode_meta, mode_meta); + } } else if (OB_FAIL(mode_mgr_.receive_mode_meta(server, proposal_id, is_applied_mode_meta, mode_meta))) { PALF_LOG(WARN, "receive_mode_meta failed", KR(ret), KPC(this), K(server), K(proposal_id), K(mode_meta)); - } else { - PALF_LOG(INFO, "receive_mode_meta success", KR(ret), KPC(this), K(server), K(proposal_id), K(mode_meta)); - } + } else { } + PALF_LOG(INFO, "receive_mode_meta finish", KR(ret), KPC(this), K(server), K(proposal_id), + K(is_applied_mode_meta), K(mode_meta)); if (OB_SUCCESS == lock_ret) { if (is_applied_mode_meta) { lock_.wrunlock();