Fix end_lsn not update bug after remove member.

This commit is contained in:
obdev 2022-12-01 04:35:44 +00:00 committed by ob-robot
parent 14ccc17b8c
commit 100404dd74
5 changed files with 57 additions and 7 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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;
}

View File

@ -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;

View File

@ -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: