576 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			576 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #define private public
 | |
| #define protected public
 | |
| 
 | |
| #include "lib/ob_errno.h"
 | |
| #include "lib/net/ob_addr.h"
 | |
| #include "common/ob_member.h"
 | |
| #include "common/ob_learner_list.h"
 | |
| #include "storage/ob_locality_manager.h"
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace storage
 | |
| {
 | |
| enum MOCKLOCALITY : int8_t
 | |
| {
 | |
|   IDC_MODE_IDC_LEADER = 0,
 | |
|   IDC_MODE_IDC_FOLLOWER = 1,
 | |
|   IDC_MODE_REGION_LEADER = 2,
 | |
|   IDC_MODE_REGION_FOLLOWER = 3,
 | |
|   IDC_MODE_DIFF_REGION_LEADER = 4,
 | |
|   IDC_MODE_DIFF_REGION_FOLLOWER = 5,
 | |
|   REGION_MODE_REGION_FOLLOWER = 6,
 | |
|   REGION_MODE_REGION_LEADER = 7,
 | |
|   REGION_MODE_DIFF_REGION_FOLLOWER = 8,
 | |
|   REGION_MODE_DIFF_REGION_LEADER = 9,
 | |
|   MAX_LOCALITY_MANAGER
 | |
| };
 | |
| 
 | |
| class MockLocalityManager : public ObLocalityManager
 | |
| {
 | |
| public:
 | |
|   MockLocalityManager() : ObLocalityManager() {}
 | |
|   virtual ~MockLocalityManager() {}
 | |
|   int init_manager(const common::ObAddr &self)
 | |
|   {
 | |
|     int ret = OB_SUCCESS;
 | |
|     if (OB_UNLIKELY(is_inited_)) {
 | |
|       ret = OB_INIT_TWICE;
 | |
|       LOG_WARN("ObLocalityManager init twice", K(ret));
 | |
|     } else if (!self.is_valid()) {
 | |
|       ret = OB_INVALID_ARGUMENT;
 | |
|       LOG_WARN("invalid argument", K(ret), K(self));
 | |
|     } else if (OB_FAIL(server_locality_cache_.init())) {
 | |
|       LOG_WARN("server_locality_cache_ init failed", K(ret), K(self));
 | |
|     } else {
 | |
|       self_ = self;
 | |
|       is_inited_ = true;
 | |
|     }
 | |
|     return ret;
 | |
|   }
 | |
| };
 | |
| 
 | |
| static int mock_replica_member(const common::ObAddr &addr, const common::ObRegion ®ion,
 | |
|     const common::ObReplicaType type, common::ObReplicaMember &replica)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   replica.reset();
 | |
|   replica.replica_type_  = type;
 | |
|   replica.region_ = region;
 | |
|   replica.memstore_percent_ = 0;
 | |
|   replica.server_ = addr;
 | |
|   replica.timestamp_ = 0;
 | |
|   replica.flag_ = 0;
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_addr(const char *ipport, common::ObAddr &addr)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   addr.reset();
 | |
|   if (OB_ISNULL(ipport)) {
 | |
|     ret = OB_INVALID_ARGUMENT;
 | |
|     LOG_WARN("ipport is nullptr", K(ret));
 | |
|   } else if (OB_FAIL(addr.parse_from_cstring(ipport))) {
 | |
|     LOG_WARN("failed to parse from cstring", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_learner_list(const common::ObAddr &addr, common::GlobalLearnerList &learner_list)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   learner_list.reset();
 | |
|   if (OB_FAIL(learner_list.add_server(addr))) {
 | |
|     LOG_WARN("failed to add server", K(ret), K(addr));
 | |
|   } else if (!learner_list.contains(addr)) {
 | |
|     ret = OB_ERR_UNEXPECTED;
 | |
|     LOG_WARN("unexpected error", K(ret), K(learner_list), K(addr));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_addr_list(const int addr_count, common::ObIArray<common::ObAddr> &addr_list)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   addr_list.reset();
 | |
|   const int64_t addr_num = 6;
 | |
|   const char * addr_array[addr_num] = {"192.168.1.1:1234", "192.168.1.2:1234", "192.168.1.3:1234", "192.168.1.4:1234", "192.168.1.5:1234", "192.168.1.6:1234"};
 | |
|   if (addr_count < 0 || addr_count > 6) {
 | |
|     ret = OB_INVALID_ARGUMENT;
 | |
|     LOG_WARN("invalid argument", K(ret), K(addr_count));
 | |
|   } else {
 | |
|     common::ObAddr addr;
 | |
|     for (int i = 0; i < addr_count && OB_SUCC(ret); i++) {
 | |
|       if (OB_FAIL(mock_addr(addr_array[i], addr))) {
 | |
|         LOG_WARN("failed to mock addr", K(ret));
 | |
|       } else if (OB_FAIL(addr_list.push_back(addr))) {
 | |
|         LOG_WARN("failed to add addr", K(ret), K(addr));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_dst_addr(common::ObAddr &addr)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.7:1234", addr))) {
 | |
|     LOG_WARN("failed to mock dst addr", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_locality_manager(const MOCKLOCALITY mode, MockLocalityManager &locality_manager)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   common::ObArray<common::ObAddr> addr_list;
 | |
|   common::ObAddr addr;
 | |
|   switch (mode) {
 | |
|   case MOCKLOCALITY::IDC_MODE_IDC_LEADER: {
 | |
|     if (OB_FAIL(mock_addr_list(5/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(2), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(2), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(3), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(3)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(3), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(3)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(4), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(4)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(4), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(4)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::IDC_MODE_IDC_FOLLOWER: {
 | |
|     if (OB_FAIL(mock_addr_list(5/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(2), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(2), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(3), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(3)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(3), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(3)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(4), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(4)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(4), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(4)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::IDC_MODE_REGION_LEADER: {
 | |
|     if (OB_FAIL(mock_addr_list(3/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(2), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(2), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::IDC_MODE_REGION_FOLLOWER: {
 | |
|     if (OB_FAIL(mock_addr_list(3/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(2), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(2), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::IDC_MODE_DIFF_REGION_LEADER: {
 | |
|     if (OB_FAIL(mock_addr_list(1/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::IDC_MODE_DIFF_REGION_FOLLOWER: {
 | |
|     if (OB_FAIL(mock_addr_list(2/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::REGION_MODE_REGION_FOLLOWER: {
 | |
|     if (OB_FAIL(mock_addr_list(4/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(2), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(2), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(3), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(3)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(3), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(3)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::REGION_MODE_REGION_LEADER: {
 | |
|     if (OB_FAIL(mock_addr_list(3/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(2), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(2), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(2)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::REGION_MODE_DIFF_REGION_LEADER: {
 | |
|     if (OB_FAIL(mock_addr_list(1/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   case MOCKLOCALITY::REGION_MODE_DIFF_REGION_FOLLOWER: {
 | |
|     if (OB_FAIL(mock_addr_list(2/*addr_count*/, addr_list))) {
 | |
|       LOG_WARN("failed to mock addr list", K(ret));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(0), "idc1"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(0), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(0)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_idc(addr_list.at(1), "idc2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     } else if (OB_FAIL(locality_manager.record_server_region(addr_list.at(1), "region2"))) {
 | |
|       LOG_WARN("failed to record server region", K(ret), K(addr_list.at(1)));
 | |
|     }
 | |
|     break;
 | |
|   }
 | |
|   default:
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   if (OB_FAIL(ret)) {
 | |
|     // do nothing
 | |
|   } else if (OB_FAIL(mock_dst_addr(addr))) {
 | |
|     LOG_WARN("failed to mock dst addr", K(ret));
 | |
|   } else if (OB_FAIL(locality_manager.record_server_idc(addr, "idc1"))) {
 | |
|     LOG_WARN("failed to record server idc", K(ret));
 | |
|   } else if (OB_FAIL(locality_manager.record_server_region(addr, "region1"))) {
 | |
|     LOG_WARN("failed to record server region", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_leader_addr(common::ObAddr &addr)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.1:1234", addr))) {
 | |
|     LOG_WARN("failed to mock leader addr", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_rs_recommand_addr(common::ObAddr &addr)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.4:1234", addr))) {
 | |
|     LOG_WARN("failed to mock recommand addr", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg(const common::ObReplicaMember &replica, ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
|   const share::ObLSID ls_id(1);
 | |
|   mock_arg.ls_id_ = ls_id;
 | |
|   mock_arg.type_ = ObMigrationOpType::TYPE::MIGRATE_LS_OP;
 | |
|   mock_arg.cluster_id_  = 0;
 | |
|   mock_arg.priority_ = ObMigrationOpPriority::PRIO_HIGH;
 | |
|   mock_arg.src_ = replica;
 | |
|   common::ObReplicaMember dst_replica;
 | |
|   common::ObAddr addr;
 | |
|   common::ObReplicaType type = common::ObReplicaType::REPLICA_TYPE_FULL;
 | |
|   common::ObRegion region("shanghai");
 | |
|   if (OB_FAIL(mock_dst_addr(addr))) {
 | |
|     LOG_WARN("failed to mock addr", K(ret));
 | |
|   } else if (OB_FAIL(mock_replica_member(addr, region, type, dst_replica))) {
 | |
|     LOG_WARN("failed to mock replica member", K(ret));
 | |
|   }
 | |
|   mock_arg.dst_ = dst_replica;
 | |
|   mock_arg.paxos_replica_number_ = 3;
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_valid_ls_meta(obrpc::ObFetchLSMetaInfoResp &res)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   const share::ObLSID ls_id(1);
 | |
|   res.version_ = CLUSTER_CURRENT_VERSION;
 | |
|   res.has_transfer_table_ = false;
 | |
|   res.ls_meta_package_.ls_meta_.tenant_id_ = 1001;
 | |
|   res.ls_meta_package_.ls_meta_.ls_id_ = ls_id;
 | |
|   res.ls_meta_package_.ls_meta_.gc_state_ = logservice::LSGCState::NORMAL;
 | |
|   res.ls_meta_package_.ls_meta_.rebuild_seq_ = 0;
 | |
|   res.ls_meta_package_.ls_meta_.clog_checkpoint_scn_.set_base();
 | |
|   res.ls_meta_package_.ls_meta_.migration_status_ = ObMigrationStatus::OB_MIGRATION_STATUS_NONE;
 | |
|   res.ls_meta_package_.ls_meta_.restore_status_ = share::ObLSRestoreStatus::NONE;
 | |
|   res.ls_meta_package_.dup_ls_meta_.ls_id_ = ls_id;
 | |
|   const palf::LSN lsn(184467440737095516);
 | |
|   res.ls_meta_package_.palf_meta_.prev_log_info_.lsn_ = lsn;
 | |
|   res.ls_meta_package_.palf_meta_.curr_lsn_ = lsn;
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg_for_checkpoint(ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
|   common::ObReplicaMember src_replica;
 | |
|   common::ObReplicaType type = common::ObReplicaType::REPLICA_TYPE_FULL;
 | |
|   common::ObRegion region("shanghai");
 | |
|   common::ObAddr src_addr;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.1:1234", src_addr))) {
 | |
|     LOG_WARN("failed to mock ", K(ret));
 | |
|   } else if (OB_FAIL(mock_replica_member(src_addr, region, type, src_replica))) {
 | |
|     LOG_WARN("failed to mock replica member", K(ret));
 | |
|   } else if (OB_FAIL(mock_migrate_arg(src_replica, mock_arg))) {
 | |
|     LOG_WARN("failed to mock migrate arg", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg_for_rs_recommand(ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
|   common::ObReplicaMember src_replica;
 | |
|   common::ObReplicaType type = common::ObReplicaType::REPLICA_TYPE_READONLY;
 | |
|   common::ObRegion region("shanghai");
 | |
|   common::ObAddr src_addr;
 | |
|   if (OB_FAIL(mock_rs_recommand_addr(src_addr))) {
 | |
|     LOG_WARN("failed to mock ", K(ret));
 | |
|   } else if (OB_FAIL(mock_replica_member(src_addr, region, type, src_replica))) {
 | |
|     LOG_WARN("failed to mock replica member", K(ret));
 | |
|   } else if (OB_FAIL(mock_migrate_arg(src_replica, mock_arg))) {
 | |
|     LOG_WARN("failed to mock migrate arg", K(ret));
 | |
|   } else {
 | |
|     mock_arg.dst_.replica_type_ = common::ObReplicaType::REPLICA_TYPE_READONLY;
 | |
|     mock_arg.data_src_ = src_replica;
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg_for_location(ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
|   common::ObReplicaMember src_replica;
 | |
|   common::ObReplicaType type = common::ObReplicaType::REPLICA_TYPE_READONLY;
 | |
|   common::ObRegion region("shanghai");
 | |
|   common::ObAddr src_addr;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.4:1234", src_addr))) {
 | |
|     LOG_WARN("failed to mock ", K(ret));
 | |
|   } else if (OB_FAIL(mock_replica_member(src_addr, region, type, src_replica))) {
 | |
|     LOG_WARN("failed to mock replica member", K(ret));
 | |
|   } else if (OB_FAIL(mock_migrate_arg(src_replica, mock_arg))) {
 | |
|     LOG_WARN("failed to mock migrate arg", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg_for_r_type(ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
| 
 | |
|   if (OB_FAIL(mock_migrate_arg_for_location(mock_arg))) {
 | |
|     LOG_WARN("failed to mock ", K(ret), K(mock_arg));
 | |
|   } else {
 | |
|     mock_arg.dst_.replica_type_ = common::ObReplicaType::REPLICA_TYPE_READONLY;
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static share::SCN mock_ckpt_inc(share::SCN &local_ls_checkpoint_scn)
 | |
| {
 | |
|   share::SCN result;
 | |
|   result = share::SCN::scn_inc(local_ls_checkpoint_scn);
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| static int get_checkpoint_policy(const ObMigrationOpArg &arg, const uint64_t tenant_id,
 | |
|     ObStorageHASrcProvider::ChooseSourcePolicy &policy)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   bool enable_choose_source_policy = false;
 | |
|   const char *str = "idc";
 | |
|   if (OB_FAIL(ObStorageHAChooseSrcHelper::get_policy_type(arg, tenant_id,
 | |
|       enable_choose_source_policy, str, policy))) {
 | |
|     LOG_WARN("failed to get policy type", K(ret), K(arg), K(tenant_id));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int get_recommand_policy(const ObMigrationOpArg &arg, const uint64_t tenant_id,
 | |
|     ObStorageHASrcProvider::ChooseSourcePolicy &policy)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   bool enable_choose_source_policy = true;
 | |
|   const char *str = "idc";
 | |
|   if (OB_FAIL(ObStorageHAChooseSrcHelper::get_policy_type(arg, tenant_id,
 | |
|       enable_choose_source_policy, str, policy))) {
 | |
|     LOG_WARN("failed to get policy type", K(ret), K(arg), K(tenant_id));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int get_idc_policy(const ObMigrationOpArg &arg, const uint64_t tenant_id,
 | |
|     ObStorageHASrcProvider::ChooseSourcePolicy &policy)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   bool enable_choose_source_policy = true;
 | |
|   const char *str = "idc";
 | |
|   if (OB_FAIL(ObStorageHAChooseSrcHelper::get_policy_type(arg, tenant_id,
 | |
|       enable_choose_source_policy, str, policy))) {
 | |
|     LOG_WARN("failed to get policy type", K(ret), K(arg), K(tenant_id));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int get_region_policy(const ObMigrationOpArg &arg, const uint64_t tenant_id,
 | |
|     ObStorageHASrcProvider::ChooseSourcePolicy &policy)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   bool enable_choose_source_policy = true;
 | |
|   const char *str = "region";
 | |
|   if (OB_FAIL(ObStorageHAChooseSrcHelper::get_policy_type(arg, tenant_id,
 | |
|       enable_choose_source_policy, str, policy))) {
 | |
|     LOG_WARN("failed to get policy type", K(ret), K(arg), K(tenant_id));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg_for_rebuild(ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
|   common::ObReplicaMember src_replica;
 | |
|   common::ObReplicaType type = common::ObReplicaType::REPLICA_TYPE_FULL;
 | |
|   common::ObRegion region("shanghai");
 | |
|   common::ObAddr src_addr;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.4:1234", src_addr))) {
 | |
|     LOG_WARN("failed to mock ", K(ret));
 | |
|   } else if (OB_FAIL(mock_replica_member(src_addr, region, type, src_replica))) {
 | |
|     LOG_WARN("failed to mock replica member", K(ret));
 | |
|   } else if (OB_FAIL(mock_migrate_arg(src_replica, mock_arg))) {
 | |
|     LOG_WARN("failed to mock migrate arg", K(ret));
 | |
|   } else {
 | |
|     mock_arg.type_ = ObMigrationOpType::TYPE::REBUILD_LS_OP;
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_migrate_arg_init_fail(ObMigrationOpArg &mock_arg)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   mock_arg.reset();
 | |
|   common::ObReplicaMember src_replica;
 | |
|   common::ObReplicaType type = common::ObReplicaType::REPLICA_TYPE_FULL;
 | |
|   common::ObRegion region("shanghai");
 | |
|   common::ObAddr src_addr;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.4:1234", src_addr))) {
 | |
|     LOG_WARN("failed to mock ", K(ret));
 | |
|   } else if (OB_FAIL(mock_replica_member(src_addr, region, type, src_replica))) {
 | |
|     LOG_WARN("failed to mock replica member", K(ret));
 | |
|   } else if (OB_FAIL(mock_migrate_arg(src_replica, mock_arg))) {
 | |
|     LOG_WARN("failed to mock migrate arg", K(ret));
 | |
|   } else {
 | |
|     mock_arg.type_ = ObMigrationOpType::TYPE::MAX_LS_OP;
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static int mock_check_replica_type_addr(common::ObAddr &addr)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   if (OB_FAIL(mock_addr("192.168.1.4:1234", addr))) {
 | |
|     LOG_WARN("failed to mock leader addr", K(ret));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| }
 | |
| }
 | 
