Files
oceanbase/unittest/election/test_election_group_cache.cpp
gm 4a92b6d7df reformat source code
according to code styles, 'AccessModifierOffset' should be -2.
2021-06-17 10:40:36 +08:00

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;
}