fix the log barrier before adding member is too loose
This commit is contained in:
		| @ -1004,7 +1004,6 @@ int LogConfigMgr::pre_sync_config_log(const common::ObMember &server, const int6 | |||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|   SpinLockGuard guard(lock_); |   SpinLockGuard guard(lock_); | ||||||
|   common::ObMemberList member_list; |   common::ObMemberList member_list; | ||||||
|   LogMeta log_meta; |  | ||||||
|   if (IS_NOT_INIT) { |   if (IS_NOT_INIT) { | ||||||
|     ret = OB_NOT_INIT; |     ret = OB_NOT_INIT; | ||||||
|   } else if (false == server.is_valid()) { |   } else if (false == server.is_valid()) { | ||||||
| @ -1012,16 +1011,8 @@ int LogConfigMgr::pre_sync_config_log(const common::ObMember &server, const int6 | |||||||
|   } else if (CHANGING == state_) { |   } else if (CHANGING == state_) { | ||||||
|     ret = OB_EAGAIN; |     ret = OB_EAGAIN; | ||||||
|   } else if (FALSE_IT(member_list.add_member(server))) { |   } else if (FALSE_IT(member_list.add_member(server))) { | ||||||
|   } else if (OB_FAIL(log_meta.generate_by_default(AccessMode::APPEND))) { |  | ||||||
|     PALF_LOG(WARN, "generate_default_log_meta failed", KR(ret), K_(palf_id), K_(self)); |  | ||||||
|     // Generate default log barrier for pre_sync config log. Therefore, the added member will |  | ||||||
|     // accept this config log as long as receiving it, without waiting for log barrier. |  | ||||||
|     // The config meta has been accepted by majority, so it's safe to skip log barrier |  | ||||||
|   } else if (OB_FAIL(log_engine_->submit_change_config_meta_req(member_list, proposal_id, |   } else if (OB_FAIL(log_engine_->submit_change_config_meta_req(member_list, proposal_id, | ||||||
|       INVALID_PROPOSAL_ID, |       prev_log_proposal_id_, prev_lsn_, prev_mode_pid_, log_ms_meta_))) { | ||||||
|       log_meta.get_log_snapshot_meta().base_lsn_, |  | ||||||
|       log_meta.get_log_prepare_meta().log_proposal_id_, |  | ||||||
|       log_ms_meta_))) { |  | ||||||
|     PALF_LOG(WARN, "submit_change_config_meta_req failed", KR(ret), K_(palf_id), K_(self), K(proposal_id), K(server)); |     PALF_LOG(WARN, "submit_change_config_meta_req failed", KR(ret), K_(palf_id), K_(self), K(proposal_id), K(server)); | ||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
|  | |||||||
| @ -93,6 +93,7 @@ const int64_t PALF_CHILD_RESEND_REGISTER_INTERVAL_US = 4 * 1000 * 1000L;     // | |||||||
| const int64_t PALF_CHECK_PARENT_CHILD_INTERVAL_US = 1 * 1000 * 1000;                // 1000ms | const int64_t PALF_CHECK_PARENT_CHILD_INTERVAL_US = 1 * 1000 * 1000;                // 1000ms | ||||||
| const int64_t PALF_DUMP_DEBUG_INFO_INTERVAL_US = 10 * 1000 * 1000;                  // 10s | const int64_t PALF_DUMP_DEBUG_INFO_INTERVAL_US = 10 * 1000 * 1000;                  // 10s | ||||||
| constexpr int64_t INVALID_PROPOSAL_ID = INT64_MAX; | constexpr int64_t INVALID_PROPOSAL_ID = INT64_MAX; | ||||||
|  | constexpr int64_t PALF_INITIAL_PROPOSAL_ID = 0; | ||||||
|  |  | ||||||
| inline int64_t max_proposal_id(const int64_t a, const int64_t b) | inline int64_t max_proposal_id(const int64_t a, const int64_t b) | ||||||
| { | { | ||||||
|  | |||||||
| @ -40,7 +40,7 @@ int LogMeta::generate_by_default(const AccessMode &access_mode) | |||||||
|     ret = OB_INVALID_ARGUMENT; |     ret = OB_INVALID_ARGUMENT; | ||||||
|     PALF_LOG(INFO, "invalid argument", KPC(this), K(access_mode)); |     PALF_LOG(INFO, "invalid argument", KPC(this), K(access_mode)); | ||||||
|   } else { |   } else { | ||||||
|     const int64_t init_log_proposal_id(0); |     const int64_t init_log_proposal_id(PALF_INITIAL_PROPOSAL_ID); | ||||||
|     const LSN init_base_lsn(PALF_INITIAL_LSN_VAL); |     const LSN init_base_lsn(PALF_INITIAL_LSN_VAL); | ||||||
|     SCN init_ref_scn; |     SCN init_ref_scn; | ||||||
|     init_ref_scn.set_min(); |     init_ref_scn.set_min(); | ||||||
| @ -73,7 +73,8 @@ int LogMeta::generate_by_palf_base_info(const PalfBaseInfo &palf_base_info, cons | |||||||
|   } else { |   } else { | ||||||
|     const int64_t prev_log_proposal_id = palf_base_info.prev_log_info_.log_proposal_id_; |     const int64_t prev_log_proposal_id = palf_base_info.prev_log_info_.log_proposal_id_; | ||||||
|     const SCN &prev_scn = palf_base_info.prev_log_info_.scn_; |     const SCN &prev_scn = palf_base_info.prev_log_info_.scn_; | ||||||
|     const int64_t init_log_proposal_id = (prev_log_proposal_id != INVALID_PROPOSAL_ID)? prev_log_proposal_id: 0; |     const int64_t init_log_proposal_id = (prev_log_proposal_id != INVALID_PROPOSAL_ID)? \ | ||||||
|  |         prev_log_proposal_id: PALF_INITIAL_PROPOSAL_ID; | ||||||
|     const SCN init_ref_scn = (prev_scn.is_valid() ? prev_scn: SCN::min_scn()); |     const SCN init_ref_scn = (prev_scn.is_valid() ? prev_scn: SCN::min_scn()); | ||||||
|     LogConfigInfo init_config_info; |     LogConfigInfo init_config_info; | ||||||
|     LogConfigVersion init_config_version; |     LogConfigVersion init_config_version; | ||||||
|  | |||||||
| @ -1015,6 +1015,7 @@ bool PalfHandleImpl::check_follower_sync_status_(const LogConfigChangeArgs &args | |||||||
|   (void) sw_.get_committed_end_lsn(first_leader_committed_end_lsn); |   (void) sw_.get_committed_end_lsn(first_leader_committed_end_lsn); | ||||||
|  |  | ||||||
|   added_member_has_new_version = true; |   added_member_has_new_version = true; | ||||||
|  |   const int64_t max_log_gap_time = PALF_LEADER_ACTIVE_SYNC_TIMEOUT_US / 4; | ||||||
|   if (new_member_list.get_member_number() == 0) { |   if (new_member_list.get_member_number() == 0) { | ||||||
|   } else if (FALSE_IT(conn_timeout_us = half_timeout_us / (new_member_list.get_member_number()))) { |   } else if (FALSE_IT(conn_timeout_us = half_timeout_us / (new_member_list.get_member_number()))) { | ||||||
|   } else if (OB_FAIL(sync_get_committed_end_lsn_(args, new_member_list, new_replica_num, |   } else if (OB_FAIL(sync_get_committed_end_lsn_(args, new_member_list, new_replica_num, | ||||||
| @ -1049,16 +1050,16 @@ bool PalfHandleImpl::check_follower_sync_status_(const LogConfigChangeArgs &args | |||||||
|       PALF_LOG(WARN, "follwer is not sync with leader after waiting 500 ms", KPC(this), K(sync_speed_gap), |       PALF_LOG(WARN, "follwer is not sync with leader after waiting 500 ms", KPC(this), K(sync_speed_gap), | ||||||
|               K(bool_ret), K(second_committed_end_lsn), K(second_leader_committed_end_lsn)); |               K(bool_ret), K(second_committed_end_lsn), K(second_leader_committed_end_lsn)); | ||||||
|     } else if (FALSE_IT(expected_sync_time_s = (second_leader_committed_end_lsn - second_committed_end_lsn) / sync_speed_gap)) { |     } else if (FALSE_IT(expected_sync_time_s = (second_leader_committed_end_lsn - second_committed_end_lsn) / sync_speed_gap)) { | ||||||
|     } else if ((expected_sync_time_s * 1E6) <= half_timeout_us) { |     } else if ((expected_sync_time_s * 1E6) <= max_log_gap_time) { | ||||||
|       bool_ret = true; |       bool_ret = true; | ||||||
|       PALF_LOG(INFO, "majority of new_member_list are sync with leader, start config change", |       PALF_LOG(INFO, "majority of new_member_list are sync with leader, start config change", | ||||||
|               KPC(this), K(bool_ret), K(second_committed_end_lsn), K(first_committed_end_lsn), K(sync_speed_gap), |               KPC(this), K(bool_ret), K(second_committed_end_lsn), K(first_committed_end_lsn), K(sync_speed_gap), | ||||||
|               K(second_leader_committed_end_lsn), K(half_timeout_us)); |               K(second_leader_committed_end_lsn), K(max_log_gap_time)); | ||||||
|     } else { |     } else { | ||||||
|       bool_ret = false; |       bool_ret = false; | ||||||
|       PALF_LOG(INFO, "majority of new_member_list are far behind, can not change member", |       PALF_LOG(INFO, "majority of new_member_list are far behind, can not change member", | ||||||
|               KPC(this), K(bool_ret), K(second_committed_end_lsn), K(first_committed_end_lsn), K(sync_speed_gap), |               KPC(this), K(bool_ret), K(second_committed_end_lsn), K(first_committed_end_lsn), K(sync_speed_gap), | ||||||
|               K(second_leader_committed_end_lsn), K(half_timeout_us)); |               K(second_leader_committed_end_lsn), K(max_log_gap_time)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   bool_ret = bool_ret && added_member_has_new_version; |   bool_ret = bool_ret && added_member_has_new_version; | ||||||
| @ -3061,7 +3062,7 @@ int PalfHandleImpl::receive_config_log(const common::ObAddr &server, | |||||||
|              false == meta.is_valid()) { |              false == meta.is_valid()) { | ||||||
|     ret = OB_INVALID_ARGUMENT; |     ret = OB_INVALID_ARGUMENT; | ||||||
|     PALF_LOG(WARN, "invalid argument", KR(ret), KPC(this), K(server), |     PALF_LOG(WARN, "invalid argument", KR(ret), KPC(this), K(server), | ||||||
|         K(msg_proposal_id), K(prev_lsn), K(meta)); |         K(msg_proposal_id), K(prev_lsn), K(prev_mode_pid), K(meta)); | ||||||
|   } else if (OB_FAIL(try_update_proposal_id_(server, msg_proposal_id))) { |   } else if (OB_FAIL(try_update_proposal_id_(server, msg_proposal_id))) { | ||||||
|     PALF_LOG(WARN, "try_update_proposal_id_ failed", KR(ret), KPC(this), K(server), K(msg_proposal_id)); |     PALF_LOG(WARN, "try_update_proposal_id_ failed", KR(ret), KPC(this), K(server), K(msg_proposal_id)); | ||||||
|   } else { |   } else { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev