298 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			10 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.
 | |
|  */
 | |
| 
 | |
| #include "election/ob_election_group_mgr.h"
 | |
| #include "election/ob_election_group_cache.h"
 | |
| #include "election/ob_election.h"
 | |
| #include "share/allocator/ob_tenant_mutil_allocator_mgr.h"
 | |
| #include <gtest/gtest.h>
 | |
| #include <iostream>
 | |
| #include <vector>
 | |
| 
 | |
| namespace oceanbase {
 | |
| namespace unittest {
 | |
| using namespace election;
 | |
| using namespace common;
 | |
| using namespace std;
 | |
| 
 | |
| class TestObElectionGroupCache : public ::testing::Test {
 | |
| public:
 | |
|   const vector<ObAddr> ADDR = {ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 34500),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.2", 34501),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.3", 34502),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.4", 34503),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.5", 34504),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.6", 34505),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.7", 34506),
 | |
|       ObAddr(ObAddr::VER::IPV4, "127.0.0.8", 34507)};
 | |
| 
 | |
| public:
 | |
|   TestObElectionGroupCache()
 | |
|   {}
 | |
|   ~TestObElectionGroupCache()
 | |
|   {}
 | |
| 
 | |
|   virtual void SetUp()
 | |
|   {
 | |
|     init();
 | |
|   }
 | |
|   virtual void TearDown()
 | |
|   {}
 | |
| 
 | |
|   void init();
 | |
|   void reset();
 | |
|   void fill_partition_into_group(ObElectionGroupId eg_id);
 | |
|   ObElectionGroupMgr mgr_;
 | |
|   ObElectionGroupCache* election_group_cache_;
 | |
|   ObTimeWheel tw_;
 | |
|   vector<ObPartitionKey> filled_pkey_list;
 | |
| };
 | |
| 
 | |
| void TestObElectionGroupCache::init()
 | |
| {
 | |
|   for (int i = 0; i < MAX_EG_PARTITION_NUM; ++i) {
 | |
|     filled_pkey_list.push_back(ObPartitionKey(i, i, i));
 | |
|   }
 | |
|   tw_.init(1000, 1, "111");
 | |
|   tw_.start();
 | |
|   ::oceanbase::common::ObTenantMutilAllocatorMgr::get_instance().init();
 | |
|   ASSERT_EQ(OB_SUCCESS,
 | |
|       mgr_.init(ADDR[0],
 | |
|           reinterpret_cast<ObIElectionRpc*>(0x01),
 | |
|           &tw_,
 | |
|           reinterpret_cast<ObIElectionMgr*>(0x01),
 | |
|           reinterpret_cast<ObIElectionGroupPriorityGetter*>(0x01)));
 | |
|   mgr_.start();
 | |
|   ASSERT_EQ(OB_SUCCESS, mgr_.get_election_group_cache(election_group_cache_));
 | |
| }
 | |
| 
 | |
| void TestObElectionGroupCache::fill_partition_into_group(ObElectionGroupId eg_id)
 | |
| {
 | |
|   int64_t not_used = 0;
 | |
|   auto group = mgr_.get_election_group(eg_id);
 | |
|   for (int i = 0; i < MAX_EG_PARTITION_NUM; ++i) {
 | |
|     ASSERT_EQ(OB_SUCCESS,
 | |
|         group->move_in_partition(filled_pkey_list[i], lease_t(1, std::numeric_limits<int64_t>::max()), 1, not_used));
 | |
|   }
 | |
|   mgr_.revert_election_group(group);
 | |
| }
 | |
| 
 | |
| TEST_F(TestObElectionGroupCache, normal_test)
 | |
| {
 | |
|   uint64_t tenant_id = 1;
 | |
| 
 | |
|   ASSERT_EQ(0, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(0, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(0, election_group_cache_->get_node_num());
 | |
| 
 | |
|   common::ObMemberList member;
 | |
|   member.add_member(ObMember(ADDR[0], 1));
 | |
|   member.add_member(ObMember(ADDR[1], 2));
 | |
|   member.add_member(ObMember(ADDR[2], 3));
 | |
|   ObElectionGroupKey key1(tenant_id, ADDR[0], 3, member);
 | |
|   ObElectionGroupId eg_id1;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key1, eg_id1));
 | |
| 
 | |
|   ASSERT_EQ(true, eg_id1.is_valid());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key1, eg_id1));
 | |
| 
 | |
|   ASSERT_EQ(true, eg_id1.is_valid());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_node_num());
 | |
| 
 | |
|   common::ObMemberList member2;
 | |
|   member2.add_member(ObMember(ADDR[2], 1));
 | |
|   member2.add_member(ObMember(ADDR[0], 2));
 | |
|   member2.add_member(ObMember(ADDR[1], 4));
 | |
|   ObElectionGroupKey key2(tenant_id, ADDR[0], 3, member2);
 | |
|   ObElectionGroupId eg_id2;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key2, eg_id2));
 | |
| 
 | |
|   ASSERT_EQ(eg_id1, eg_id2);
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_node_num());
 | |
| 
 | |
|   common::ObMemberList member3;
 | |
|   member3.add_member(ObMember(ADDR[0], 1));
 | |
|   member3.add_member(ObMember(ADDR[3], 2));
 | |
|   member3.add_member(ObMember(ADDR[1], 4));
 | |
|   ObElectionGroupKey key3(tenant_id, ADDR[0], 3, member3);
 | |
|   ObElectionGroupId eg_id3;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key3, eg_id3));
 | |
| 
 | |
|   ASSERT_NE(eg_id2, eg_id3);
 | |
|   ASSERT_EQ(2, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->put_eg_id(key3, eg_id3));
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->put_eg_id(key3, eg_id3));
 | |
|   ObElectionGroupId eg_id4;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key3, eg_id4));
 | |
| 
 | |
|   ASSERT_EQ(eg_id3, eg_id4);
 | |
|   ASSERT_EQ(2, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(4, election_group_cache_->get_node_num());
 | |
| 
 | |
|   election_group_cache_->gc_invalid_queue();
 | |
| 
 | |
|   ASSERT_EQ(2, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(4, election_group_cache_->get_node_num());
 | |
| 
 | |
|   fill_partition_into_group(eg_id1);
 | |
| 
 | |
|   ObElectionGroupId eg_id5;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key1, eg_id5));
 | |
|   ASSERT_NE(eg_id1, eg_id5);
 | |
| 
 | |
|   ASSERT_EQ(3, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(4, election_group_cache_->get_node_num());
 | |
| 
 | |
|   fill_partition_into_group(eg_id3);
 | |
| 
 | |
|   ObElectionGroupId eg_id6;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key3, eg_id6));
 | |
|   ASSERT_NE(eg_id3, eg_id6);
 | |
| 
 | |
|   ASSERT_EQ(4, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ObIElectionGroup* group;
 | |
| 
 | |
|   group = mgr_.get_election_group(eg_id5);
 | |
|   fill_partition_into_group(eg_id5);
 | |
|   mgr_.revert_election_group(group);
 | |
| 
 | |
|   // gc
 | |
|   election_group_cache_->gc_invalid_queue();
 | |
| 
 | |
|   ASSERT_EQ(4, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_node_num());
 | |
| 
 | |
|   group = mgr_.get_election_group(eg_id6);
 | |
|   fill_partition_into_group(eg_id6);
 | |
|   mgr_.revert_election_group(group);
 | |
|   election_group_cache_->gc_invalid_queue();
 | |
|   ASSERT_EQ(4, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(0, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(0, election_group_cache_->get_node_num());
 | |
| }
 | |
| 
 | |
| TEST_F(TestObElectionGroupCache, put_egid)
 | |
| {
 | |
| 
 | |
|   uint64_t tenant_id1 = 1;
 | |
|   common::ObMemberList member1;
 | |
|   member1.add_member(ObMember(ADDR[0], 1));
 | |
|   member1.add_member(ObMember(ADDR[1], 2));
 | |
|   member1.add_member(ObMember(ADDR[2], 3));
 | |
|   ObElectionGroupKey key1(tenant_id1, ADDR[0], 3, member1);
 | |
|   ObElectionGroupId eg_id1;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key1, eg_id1));
 | |
| 
 | |
|   ASSERT_EQ(true, eg_id1.is_valid());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->put_eg_id(key1, eg_id1));
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->put_eg_id(key1, eg_id1));
 | |
| 
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(3, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ObIElectionGroup* group;
 | |
| 
 | |
|   group = mgr_.get_election_group(eg_id1);
 | |
|   fill_partition_into_group(eg_id1);
 | |
|   mgr_.revert_election_group(group);
 | |
|   election_group_cache_->gc_invalid_queue();
 | |
| 
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(0, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(0, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->put_eg_id(key1, eg_id1));
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->put_eg_id(key1, eg_id1));
 | |
| 
 | |
|   ASSERT_EQ(1, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(2, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ObElectionGroupId eg_id2;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key1, eg_id2));
 | |
| 
 | |
|   ASSERT_EQ(2, election_group_cache_->get_group_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_queue_num());
 | |
|   ASSERT_EQ(1, election_group_cache_->get_node_num());
 | |
| 
 | |
|   ASSERT_NE(eg_id1, eg_id2);
 | |
| }
 | |
| 
 | |
| TEST_F(TestObElectionGroupCache, defferent_key)
 | |
| {
 | |
| 
 | |
|   uint64_t tenant_id1 = 1;
 | |
|   common::ObMemberList member1;
 | |
|   member1.add_member(ObMember(ADDR[0], 1));
 | |
|   member1.add_member(ObMember(ADDR[1], 2));
 | |
|   member1.add_member(ObMember(ADDR[2], 3));
 | |
|   ObElectionGroupKey key1(tenant_id1, ADDR[0], 3, member1);
 | |
|   ObElectionGroupId eg_id1;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key1, eg_id1));
 | |
| 
 | |
|   uint64_t tenant_id2 = 1;
 | |
|   common::ObMemberList member2;
 | |
|   member2.add_member(ObMember(ADDR[2], 1879));
 | |
|   member2.add_member(ObMember(ADDR[0], 3454));
 | |
|   member2.add_member(ObMember(ADDR[1], 6345654));
 | |
|   ObElectionGroupKey key2(tenant_id2, ADDR[0], 3, member2);
 | |
|   ObElectionGroupId eg_id2;
 | |
|   ASSERT_EQ(OB_SUCCESS, election_group_cache_->get_or_create_eg_id(key2, eg_id2));
 | |
| 
 | |
|   ASSERT_EQ(eg_id1, eg_id2);
 | |
| }
 | |
| 
 | |
| }  // namespace unittest
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   int ret = -1;
 | |
| 
 | |
|   oceanbase::election::ASYNC_LOG_INIT("test_election_groupcache.log", OB_LOG_LEVEL_INFO, true);
 | |
| 
 | |
|   if (OB_FAIL(oceanbase::common::ObClockGenerator::init())) {
 | |
|     ELECT_LOG(WARN, "clock generator init error.", K(ret));
 | |
|   } else {
 | |
|     testing::InitGoogleTest(&argc, argv);
 | |
|     ret = RUN_ALL_TESTS();
 | |
|   }
 | |
| 
 | |
|   oceanbase::election::ASYNC_LOG_DESTROY();
 | |
|   (void)oceanbase::common::ObClockGenerator::destroy();
 | |
| 
 | |
|   return ret;
 | |
| }
 | 
