|  |  |  | @ -201,7 +201,7 @@ int ObMajorMergeProgressChecker::check_tablet( | 
		
	
		
			
				|  |  |  |  |     } else if (OB_FAIL(check_majority_integrated(schema_guard, tablet, ls_info))) { | 
		
	
		
			
				|  |  |  |  |       LOG_WARN("fail to check majority integrated", KR(ret)); | 
		
	
		
			
				|  |  |  |  |     } else if (OB_FAIL(check_tablet_data_version(all_progress, global_broadcast_scn, tablet, ls_info))) { | 
		
	
		
			
				|  |  |  |  |       LOG_WARN("fail to check majority integrated", KR(ret)); | 
		
	
		
			
				|  |  |  |  |       LOG_WARN("fail to check data version", KR(ret)); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -218,8 +218,19 @@ int ObMajorMergeProgressChecker::check_tablet_data_version( | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   const ObLSReplica *ls_r = nullptr; | 
		
	
		
			
				|  |  |  |  |   FOREACH_CNT_X(r, tablet.get_replicas(), OB_SUCCESS == ret) { | 
		
	
		
			
				|  |  |  |  |     if (OB_FAIL(ls_info.find(r->get_server(), ls_r))) { | 
		
	
		
			
				|  |  |  |  |       LOG_WARN("fail to find lfs replica", "addr", r->get_server(), KR(ret)); | 
		
	
		
			
				|  |  |  |  |     if (OB_ISNULL(r)) { | 
		
	
		
			
				|  |  |  |  |       ret = OB_ERR_UNEXPECTED; | 
		
	
		
			
				|  |  |  |  |       LOG_WARN("invalid replica", KR(ret), K_(tenant_id), K(tablet)); | 
		
	
		
			
				|  |  |  |  |     } else if (OB_FAIL(ls_info.find(r->get_server(), ls_r))) { | 
		
	
		
			
				|  |  |  |  |       if (OB_ENTRY_NOT_EXIST == ret) { | 
		
	
		
			
				|  |  |  |  |         // Ignore tablet replicas that are not in ls_info. E.g., after ls replica migration, | 
		
	
		
			
				|  |  |  |  |         // source ls meta has been deleted, but source tablet meta has not been deleted yet. | 
		
	
		
			
				|  |  |  |  |         ret = OB_SUCCESS;  // ignore ret | 
		
	
		
			
				|  |  |  |  |         LOG_INFO("ignore this tablet replica, sicne it is not in ls_info", K_(tenant_id), | 
		
	
		
			
				|  |  |  |  |                  KPC(r), K(ls_info)); | 
		
	
		
			
				|  |  |  |  |       } else { | 
		
	
		
			
				|  |  |  |  |         LOG_WARN("fail to find ls replica", KR(ret), "addr", r->get_server()); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     } else if (OB_UNLIKELY(nullptr == ls_r)) { | 
		
	
		
			
				|  |  |  |  |       ret = OB_ERR_UNEXPECTED; | 
		
	
		
			
				|  |  |  |  |       LOG_WARN("invalid ls replica", KR(ret), KPC(r)); | 
		
	
	
		
			
				
					
					|  |  |  | @ -272,10 +283,14 @@ int ObMajorMergeProgressChecker::check_majority_integrated( | 
		
	
		
			
				|  |  |  |  |   int64_t all_replica_num = OB_INVALID_COUNT; | 
		
	
		
			
				|  |  |  |  |   int64_t full_replica_num = OB_INVALID_COUNT; | 
		
	
		
			
				|  |  |  |  |   int64_t paxos_replica_num = OB_INVALID_COUNT; | 
		
	
		
			
				|  |  |  |  |   bool is_in_member_list = false; | 
		
	
		
			
				|  |  |  |  |   ObLSReplica::MemberList member_list; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (OB_FAIL(get_associated_replica_num(schema_guard, paxos_replica_num, | 
		
	
		
			
				|  |  |  |  |           full_replica_num, all_replica_num, majority))) { | 
		
	
		
			
				|  |  |  |  |     LOG_WARN("fail to get associated replica num", KR(ret), K_(tenant_id)); | 
		
	
		
			
				|  |  |  |  |   } else if (OB_FAIL(get_member_list(ls_info, member_list))) { // member_list of ls leader replica | 
		
	
		
			
				|  |  |  |  |     LOG_WARN("fail to get member_list", KR(ret), K_(tenant_id), K(ls_info)); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     const int64_t tablet_replica_cnt = tablet.replica_count(); | 
		
	
		
			
				|  |  |  |  |     int64_t paxos_cnt = 0; | 
		
	
	
		
			
				
					
					|  |  |  | @ -283,7 +298,15 @@ int ObMajorMergeProgressChecker::check_majority_integrated( | 
		
	
		
			
				|  |  |  |  |     FOREACH_CNT_X(r, tablet.get_replicas(), OB_SUCC(ret)) { | 
		
	
		
			
				|  |  |  |  |       if (OB_ISNULL(r)) { | 
		
	
		
			
				|  |  |  |  |         ret = OB_ERR_UNEXPECTED; | 
		
	
		
			
				|  |  |  |  |         LOG_WARN("invalid replica", KR(ret), K_(tenant_id), K(r)); | 
		
	
		
			
				|  |  |  |  |         LOG_WARN("invalid replica", KR(ret), K_(tenant_id), K(tablet)); | 
		
	
		
			
				|  |  |  |  |       } else if (OB_FAIL(is_replica_in_ls_member_list(*r, member_list, is_in_member_list))) { | 
		
	
		
			
				|  |  |  |  |         LOG_WARN("fail to check if replica is in ls member_list", KR(ret), K_(tenant_id), | 
		
	
		
			
				|  |  |  |  |                  KPC(r), K(member_list)); | 
		
	
		
			
				|  |  |  |  |       } else if (!is_in_member_list) { | 
		
	
		
			
				|  |  |  |  |         // Ignore tablet replicas that are not in member list. E.g., after ls replica migration, | 
		
	
		
			
				|  |  |  |  |         // source ls meta has been deleted, but source tablet meta has not been deleted yet. | 
		
	
		
			
				|  |  |  |  |         LOG_INFO("ignore this tablet replica, sicne it is not in ls member_list", K_(tenant_id), | 
		
	
		
			
				|  |  |  |  |                  KPC(r), K(member_list)); | 
		
	
		
			
				|  |  |  |  |       } else if (OB_FAIL(ls_info.find(r->get_server(), ls_r))) { | 
		
	
		
			
				|  |  |  |  |         LOG_WARN("fail to find", "addr", r->get_server(), KR(ret)); | 
		
	
		
			
				|  |  |  |  |       } else if (OB_UNLIKELY(nullptr == ls_r)) { | 
		
	
	
		
			
				
					
					|  |  |  | @ -352,5 +375,46 @@ int ObMajorMergeProgressChecker::get_associated_replica_num( | 
		
	
		
			
				|  |  |  |  |   return ret; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | int ObMajorMergeProgressChecker::get_member_list( | 
		
	
		
			
				|  |  |  |  |     const share::ObLSInfo &ls_info, | 
		
	
		
			
				|  |  |  |  |     share::ObLSReplica::MemberList &member_list) const | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   int ret = OB_SUCCESS; | 
		
	
		
			
				|  |  |  |  |   const ObLSReplica *ls_leader_replica = nullptr; | 
		
	
		
			
				|  |  |  |  |   if (IS_NOT_INIT) { | 
		
	
		
			
				|  |  |  |  |     ret = OB_NOT_INIT; | 
		
	
		
			
				|  |  |  |  |     LOG_WARN("not init", KR(ret), K_(tenant_id)); | 
		
	
		
			
				|  |  |  |  |   } else if (OB_FAIL(ls_info.find_leader(ls_leader_replica))) { | 
		
	
		
			
				|  |  |  |  |     LOG_WARN("fail to find ls leader replica", KR(ret), K_(tenant_id), K(ls_info)); | 
		
	
		
			
				|  |  |  |  |   } else if (OB_ISNULL(ls_leader_replica)) { | 
		
	
		
			
				|  |  |  |  |     ret = OB_ERR_UNEXPECTED; | 
		
	
		
			
				|  |  |  |  |     LOG_WARN("ls leader replica is null", KR(ret), K_(tenant_id), K(ls_info)); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     member_list = ls_leader_replica->get_member_list(); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   return ret; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | int ObMajorMergeProgressChecker::is_replica_in_ls_member_list( | 
		
	
		
			
				|  |  |  |  |     const share::ObTabletReplica &replica, | 
		
	
		
			
				|  |  |  |  |     const ObLSReplica::MemberList &member_list, | 
		
	
		
			
				|  |  |  |  |     bool &is_in_member_list) const | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |   int ret = OB_SUCCESS; | 
		
	
		
			
				|  |  |  |  |   is_in_member_list = false; | 
		
	
		
			
				|  |  |  |  |   if (IS_NOT_INIT) { | 
		
	
		
			
				|  |  |  |  |     ret = OB_NOT_INIT; | 
		
	
		
			
				|  |  |  |  |     LOG_WARN("not init", KR(ret), K_(tenant_id)); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     for (int i = 0; i < member_list.count(); ++i) { | 
		
	
		
			
				|  |  |  |  |       if (replica.get_server() == member_list.at(i).get_server()) { | 
		
	
		
			
				|  |  |  |  |         is_in_member_list = true; | 
		
	
		
			
				|  |  |  |  |         break; | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   return ret; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | } // namespace rootserver | 
		
	
		
			
				|  |  |  |  | } // namespace oceanbase | 
		
	
	
		
			
				
					
					| 
							
							
							
						 |  |  | 
 |