diff --git a/src/logservice/palf/log_config_mgr.cpp b/src/logservice/palf/log_config_mgr.cpp index 54d8e7a17..364cc8fee 100644 --- a/src/logservice/palf/log_config_mgr.cpp +++ b/src/logservice/palf/log_config_mgr.cpp @@ -1047,7 +1047,7 @@ int LogConfigMgr::apply_config_meta_(const int64_t curr_proposal_id, } else { PALF_LOG(WARN, "update_election_meta_ failed", KR(ret), K_(palf_id), K_(self), K(new_config_info), K_(log_ms_meta)); } - } else if (OB_FAIL(update_match_lsn_map_(args))) { + } else if (OB_FAIL(update_match_lsn_map_(args, new_config_info))) { PALF_LOG(WARN, "update_match_lsn_map failed", K(ret), K_(palf_id), K_(self), K(args)); } else if (OB_FAIL(update_complete_config_info_(new_config_info))) { } else { @@ -1060,7 +1060,8 @@ int LogConfigMgr::apply_config_meta_(const int64_t curr_proposal_id, return ret; } -int LogConfigMgr::update_match_lsn_map_(const LogConfigChangeArgs &args) +int LogConfigMgr::update_match_lsn_map_(const LogConfigChangeArgs &args, + const LogConfigInfo &new_config_info) { int ret = OB_SUCCESS; ObMemberList added_memberlist; @@ -1070,7 +1071,9 @@ int LogConfigMgr::update_match_lsn_map_(const LogConfigChangeArgs &args) } else if (is_remove_log_sync_member_list(args.type_) && OB_FAIL(removed_memberlist.add_member(args.server_))) { PALF_LOG(WARN, "add_member failed", K(ret), K_(palf_id), K_(self), K(added_memberlist), K(args)); } - if (OB_SUCC(ret) && OB_FAIL(sw_->config_change_update_match_lsn_map(added_memberlist, removed_memberlist))) { + if (OB_SUCC(ret) && OB_FAIL(sw_->config_change_update_match_lsn_map(added_memberlist, \ + removed_memberlist, new_config_info.log_sync_memberlist_, \ + new_config_info.log_sync_replica_num_))) { PALF_LOG(WARN, "config_change_update_match_lsn_map failed", K(ret), K_(palf_id), K_(self), K(added_memberlist), K(removed_memberlist)); } return ret; diff --git a/src/logservice/palf/log_config_mgr.h b/src/logservice/palf/log_config_mgr.h index 3d322bb13..1e7db8bed 100644 --- a/src/logservice/palf/log_config_mgr.h +++ b/src/logservice/palf/log_config_mgr.h @@ -319,7 +319,7 @@ private: const LogConfigChangeArgs &args, LogConfigInfo &new_config_info) const; int update_complete_config_info_(const LogConfigInfo &config_info); - int update_match_lsn_map_(const LogConfigChangeArgs &args); + int update_match_lsn_map_(const LogConfigChangeArgs &args, const LogConfigInfo &new_config_info); int update_election_meta_(const LogConfigInfo &info); int update_election_meta_(const ObMemberList &member_list, const LogConfigVersion &config_version, diff --git a/src/logservice/palf/log_sliding_window.cpp b/src/logservice/palf/log_sliding_window.cpp index 4ff256b01..c6280f1d5 100644 --- a/src/logservice/palf/log_sliding_window.cpp +++ b/src/logservice/palf/log_sliding_window.cpp @@ -2263,6 +2263,26 @@ int LogSlidingWindow::gen_committed_end_lsn_(LSN &new_committed_end_lsn) return ret; } +int LogSlidingWindow::gen_committed_end_lsn_with_memberlist_( + const ObMemberList &member_list, + const int64_t replica_num) +{ + int ret = OB_SUCCESS; + LSN result_lsn; + if (!member_list.is_valid() || replica_num <= 0 || + replica_num < member_list.get_member_number()) { + ret = OB_INVALID_ARGUMENT; + PALF_LOG(WARN, "invalid argumetns", K(ret), K_(palf_id), K_(self), K(member_list), K(replica_num)); + } else if (OB_FAIL(get_majority_lsn_(member_list, replica_num, result_lsn))) { + PALF_LOG(WARN, "get_majority_lsn failed", K(ret), K_(palf_id), K_(self)); + } else { + (void) try_advance_committed_lsn_(result_lsn); + PALF_LOG(INFO, "gen_committed_end_lsn_with_memberlist_ finished", K(ret), K_(palf_id), + K_(self), K(result_lsn), K(member_list), K(replica_num)); + } + return ret; +} + int LogSlidingWindow::get_majority_lsn(const ObMemberList &member_list, const int64_t replica_num, LSN &result_lsn) const @@ -3317,7 +3337,11 @@ int LogSlidingWindow::reset_match_lsn_map_() } // need caller hold wlock in PalfHandleImpl -int LogSlidingWindow::config_change_update_match_lsn_map(const ObMemberList &added_memberlist, const ObMemberList &removed_memberlist) +int LogSlidingWindow::config_change_update_match_lsn_map( + const ObMemberList &added_memberlist, + const ObMemberList &removed_memberlist, + const ObMemberList &new_log_sync_memberlist, + const int64_t new_replica_num) { int ret = OB_SUCCESS; if (IS_NOT_INIT) { @@ -3350,6 +3374,17 @@ int LogSlidingWindow::config_change_update_match_lsn_map(const ObMemberList &add } } } + // Try to advance committed_end_lsn after updating match_lsn_map_. + if (OB_SUCC(ret)) { + if (state_mgr_->is_leader_active()) { + // Only leader with ACTIVE state can generate new committed_end_lsn. + // This step is necessary because after removing member, current log_sync_memeber_list + // may become self (single member). And if all local logs have been flushed, but + // committed_end_lsn is smaller than flushed lsn, self won't have chance to advance it. + // So we need try to advance committed_end_lsn here. + (void) gen_committed_end_lsn_with_memberlist_(new_log_sync_memberlist, new_replica_num); + } + } PALF_LOG(INFO, "config_change_update_match_lsn_map_ finished", K(ret), K_(palf_id), K_(self), K(added_memberlist), K(removed_memberlist)); return ret; } diff --git a/src/logservice/palf/log_sliding_window.h b/src/logservice/palf/log_sliding_window.h index 34bbba35d..04cc0d722 100644 --- a/src/logservice/palf/log_sliding_window.h +++ b/src/logservice/palf/log_sliding_window.h @@ -170,7 +170,9 @@ public: const int64_t &prev_log_proposal_id, const LSN &committed_end_lsn); virtual int config_change_update_match_lsn_map(const ObMemberList &added_memberlist, - const ObMemberList &removed_memberlist); + const ObMemberList &removed_memberlist, + const ObMemberList &new_log_sync_memberlist, + const int64_t new_replica_num); // ================= log sync part end virtual int append_disk_log(const LSN &lsn, const LogGroupEntry &group_entry); virtual int report_log_task_trace(const int64_t log_id); @@ -284,6 +286,9 @@ private: LogGroupEntryHeader &header, int64_t &group_log_checksum); int gen_committed_end_lsn_(LSN &new_committed_end_lsn); + int gen_committed_end_lsn_with_memberlist_( + const ObMemberList &member_list, + const int64_t replica_num); int get_majority_lsn_(const ObMemberList &member_list, const int64_t replica_num, LSN &result_lsn) const; diff --git a/unittest/logservice/mock_logservice_container/mock_log_sliding_window.h b/unittest/logservice/mock_logservice_container/mock_log_sliding_window.h index c0f0acb77..320791a90 100644 --- a/unittest/logservice/mock_logservice_container/mock_log_sliding_window.h +++ b/unittest/logservice/mock_logservice_container/mock_log_sliding_window.h @@ -324,8 +324,15 @@ public: int ret = OB_SUCCESS; return ret; } - int config_change_update_match_lsn_map(const ObMemberList &added_memberlist, const ObMemberList &removed_memberlist) + int config_change_update_match_lsn_map(const ObMemberList &added_memberlist, + const ObMemberList &removed_memberlist, + const ObMemberList &new_log_sync_memberlist, + const int64_t new_replica_num) { + UNUSED(added_memberlist); + UNUSED(removed_memberlist); + UNUSED(new_log_sync_memberlist); + UNUSED(new_replica_num); return OB_SUCCESS; } public: