Fix end_lsn not update bug after remove member.
This commit is contained in:
parent
14ccc17b8c
commit
100404dd74
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user