oceanbase
169 строк · 6.4 Кб
1/**
2* Copyright (c) 2021 OceanBase
3* OceanBase CE is licensed under Mulan PubL v2.
4* You can use this software according to the terms and conditions of the Mulan PubL v2.
5* You may obtain a copy of Mulan PubL v2 at:
6* http://license.coscl.org.cn/MulanPubL-2.0
7* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10* See the Mulan PubL v2 for more details.
11*/
12
13#include "ob_simple_log_cluster_testbase.h"
14#include "common/ob_member_list.h"
15#include "share/allocator/ob_tenant_mutil_allocator_mgr.h"
16#include "ob_mittest_utils.h"
17#include "lib/alloc/memory_dump.h"
18#include "lib/alloc/alloc_func.cpp"
19#include "lib/allocator/ob_mem_leak_checker.h"
20#include "lib/allocator/ob_libeasy_mem_pool.h"
21#include <algorithm>
22
23namespace oceanbase
24{
25namespace unittest
26{
27// int64_t ObSimpleLogClusterTestBase::member_cnt_ = 3;
28// int64_t ObSimpleLogClusterTestBase::node_cnt_ = 7;
29std::vector<ObISimpleLogServer*> ObSimpleLogClusterTestBase::cluster_;
30bool ObSimpleLogClusterTestBase::is_started_ = false;
31common::ObMemberList ObSimpleLogClusterTestBase::member_list_ = ObMemberList();
32common::ObArrayHashMap<common::ObAddr, common::ObRegion> ObSimpleLogClusterTestBase::member_region_map_;
33common::ObMemberList ObSimpleLogClusterTestBase::node_list_ = ObMemberList();
34int64_t ObSimpleLogClusterTestBase::node_idx_base_ = 1002;
35char ObSimpleLogClusterTestBase::sig_buf_[sizeof(ObSignalWorker) + sizeof(observer::ObSignalHandle)];
36ObSignalWorker *ObSimpleLogClusterTestBase::sig_worker_ = new (sig_buf_) ObSignalWorker();
37observer::ObSignalHandle *ObSimpleLogClusterTestBase::signal_handle_ = new (sig_worker_ + 1) observer::ObSignalHandle();
38bool ObSimpleLogClusterTestBase::disable_hot_cache_ = false;
39
40void ObSimpleLogClusterTestBase::SetUpTestCase()
41{
42SERVER_LOG(INFO, "SetUpTestCase", K(member_cnt_), K(node_cnt_));
43int ret = OB_SUCCESS;
44if (!is_started_) {
45ret = start();
46}
47ASSERT_EQ(ret, OB_SUCCESS);
48}
49
50void ObSimpleLogClusterTestBase::TearDownTestCase()
51{
52SERVER_LOG(INFO, "TearDownTestCase", K(member_cnt_), K(node_cnt_));
53int ret = OB_SUCCESS;
54
55if (cluster_.size() != 0) {
56ret = close();
57ASSERT_EQ(ret, OB_SUCCESS);
58}
59for (auto svr : cluster_) {
60if (OB_NOT_NULL(svr)) {
61ob_delete(svr);
62}
63}
64}
65
66int ObSimpleLogClusterTestBase::start()
67{
68int ret = OB_SUCCESS;
69int64_t member_cnt = 0;
70ObTenantMutilAllocatorMgr::get_instance().init();
71ObMemoryDump::get_instance().init();
72// set easy allocator for watching easy memory holding
73easy_pool_set_allocator(ob_easy_realloc);
74ev_set_allocator(ob_easy_realloc);
75lib::set_memory_limit(10L * 1000L * 1000L * 1000L);
76if (sig_worker_ != nullptr && OB_FAIL(sig_worker_->start())) {
77SERVER_LOG(ERROR, "Start signal worker error", K(ret));
78} else if (signal_handle_ != nullptr && OB_FAIL(signal_handle_->start())) {
79SERVER_LOG(ERROR, "Start signal handle error", K(ret));
80} else if (OB_FAIL(member_region_map_.init("TestBase", OB_MAX_MEMBER_NUMBER))) {
81} else if (OB_FAIL(generate_sorted_server_list_(node_cnt_))) {
82} else {
83// 如果需要新增arb server,将其作为memberlist最后一项
84// TODO by runlin, 这个是暂时的解决方法,以后可以走加减成员的流程
85const int64_t arb_idx = member_cnt_ - 1;
86int64_t node_id = node_idx_base_;
87for (int i = 0; OB_SUCC(ret) && i < node_cnt_; i++) {
88ObISimpleLogServer *svr = NULL;
89if (i == arb_idx && true == need_add_arb_server_) {
90svr = OB_NEW(ObSimpleArbServer, "TestBase");
91} else {
92svr = OB_NEW(ObSimpleLogServer, "TestBase");
93}
94common::ObAddr server;
95if (OB_FAIL(node_list_.get_server_by_index(i, server))) {
96} else if (OB_FAIL(svr->simple_init(test_name_, server, node_id, true))) {
97SERVER_LOG(WARN, "simple_init failed", K(ret), K(i), K_(node_list));
98} else if (OB_FAIL(svr->simple_start(true))) {
99SERVER_LOG(WARN, "simple_start failed", K(ret), K(i), K_(node_list));
100} else {
101node_id += 2;
102cluster_.push_back(svr);
103}
104if (i < ObSimpleLogClusterTestBase::member_cnt_ && OB_SUCC(ret)) {
105common::ObMember member;
106if (OB_FAIL(member_list_.add_member(ObMember(server, 1)))) {
107} else if (OB_FAIL(member_region_map_.insert(server, DEFAULT_REGION_NAME))) {
108SERVER_LOG(WARN, "member_region_map_.insert failed", K(ret), K(server), K_(node_list));
109}
110}
111usleep(500);
112SERVER_LOG(INFO, "ObSimpleLogClusterTestBase start success", K(node_id), K(server));
113}
114if (OB_SUCC(ret)) {
115is_started_ = true;
116}
117SERVER_LOG(INFO, "ObSimpleLogClusterTestBase started", K(ret), K_(member_cnt), K_(node_cnt), K_(node_list), K(member_list_));
118}
119return ret;
120}
121
122int ObSimpleLogClusterTestBase::close()
123{
124int ret = OB_SUCCESS;
125for (auto svr : cluster_) {
126ret = svr->simple_close(true);
127if (OB_FAIL(ret)) {
128SERVER_LOG(WARN, "simple_close failed", K(ret));
129break;
130}
131}
132return ret;
133}
134
135int ObSimpleLogClusterTestBase::generate_sorted_server_list_(const int64_t node_cnt)
136{
137int ret = OB_SUCCESS;
138// each get_rpc_port calling will get two available ports,
139// so just get node_cnt / 2 + 1 times
140const int64_t get_port_cnt = node_cnt / 2 + 1;
141for (int i = 0; i < get_port_cnt; i++) {
142int server_fd = 0;
143const std::string local_ip = get_local_ip();
144const int64_t port = get_rpc_port(server_fd);
145common::ObAddr addr;
146if (0 == port) {
147ret = OB_ERR_UNEXPECTED;
148SERVER_LOG(ERROR, "get_rpc_port failed", K(ret), K(port));
149break;
150} else if (local_ip == "") {
151ret = OB_ERR_UNEXPECTED;
152} else if (false == addr.set_ip_addr(local_ip.c_str(), port)) {
153SERVER_LOG(ERROR, "set_ip_addr failed", K(local_ip.c_str()), K(port), K(addr));
154} else if (OB_FAIL(node_list_.add_server(addr))) {
155PALF_LOG(WARN, "add_server failed", K(ret));
156} else if (false == addr.set_ip_addr(local_ip.c_str(), port + 1)) {
157SERVER_LOG(ERROR, "set_ip_addr failed", K(local_ip.c_str()), K(port), K(addr));
158} else if (node_list_.get_member_number() < node_cnt && OB_FAIL(node_list_.add_server(addr))) {
159PALF_LOG(WARN, "add_server failed", K(ret));
160}
161}
162if (OB_SUCC(ret)) {
163SERVER_LOG(INFO, "simple log cluster node_list", K_(node_list));
164}
165return ret;
166}
167
168} // end unittest
169} // end oceanbase
170