oceanbase/unittest/rootserver/test_server_manager.cpp
2024-02-08 01:29:33 +00:00

828 lines
33 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 USING_LOG_PREFIX RS
#include "gtest/gtest.h"
#include <gmock/gmock.h>
#define private public
#define protected public
#include "../share/schema/db_initializer.h"
#include "lib/stat/ob_session_stat.h"
#include "share/cache/ob_kv_storecache.h"
#include "rootserver/ob_server_manager.h"
#include "rootserver/ob_unit_manager.h"
#include "rootserver/ob_zone_manager.h"
#include "rootserver/ob_leader_coordinator.h"
#include "share/config/ob_server_config.h"
#include "share/ob_lease_struct.h"
#include "share/ob_rpc_struct.h"
#include "../share/partition_table/fake_part_property_getter.h"
#include "share/ob_tenant_mgr.h"
#undef private
#undef protected
#include "rpc/mock_ob_srv_rpc_proxy.h"
#include "mock_freeze_info_manager.h"
namespace oceanbase
{
using namespace common;
using namespace share;
using namespace share::schema;
using namespace obrpc;
using namespace host;
namespace rootserver
{
class ObFakeServerChangeCB : public ObIServerChangeCallback
{
public:
ObFakeServerChangeCB() {}
virtual ~ObFakeServerChangeCB() {}
virtual int on_server_change()
{
return OB_SUCCESS;
}
};
class ObFakeCB : public ObIStatusChangeCallback
{
public:
ObFakeCB() : return_success_(true) {}
int wakeup_balancer() { return OB_SUCCESS; }
int wakeup_daily_merger() { return OB_SUCCESS; }
int on_server_status_change(const common::ObAddr &server);
int on_start_server(const common::ObAddr &server) {UNUSED(server); return OB_SUCCESS;}
int on_stop_server(const common::ObAddr &server) {UNUSED(server); return OB_SUCCESS;}
void set_return_success(const bool return_success) { return_success_ = return_success; }
private:
bool return_success_;
};
int ObFakeCB::on_server_status_change(const common::ObAddr &server)
{
UNUSED(server);
int ret = OB_SUCCESS;
if (return_success_) {
ret = OB_SUCCESS;
} else {
ret = OB_ERROR;
}
return ret;
}
class FakeZoneManager : public ObZoneManager
{
public:
FakeZoneManager() {}
virtual ~FakeZoneManager() {}
virtual int check_zone_active(const common::ObZone &zone, bool &zone_active) const
{
zone_active = (zone == "1" || zone == "2");
return OB_SUCCESS;
}
};
class FakeUnitManager : public ObUnitManager
{
public:
FakeUnitManager(ObServerManager &server_mgr, ObZoneManager &zone_mgr)
: ObUnitManager(server_mgr, zone_mgr)
{
}
virtual ~FakeUnitManager() {}
virtual int migrate_out_units(const ObAddr &server, const ObIArray<ObAddr> &, bool &empty)
{
ObAddr inner_server;
inner_server.set_ip_addr("127.0.0.1", 9999);
if (server == inner_server) {
empty = false;
} else {
empty = true;
}
return OB_SUCCESS;
}
virtual int cancel_migrate_out_units(const common::ObAddr &server)
{
UNUSED(server);
return OB_SUCCESS;
}
virtual int check_server_empty(const common::ObAddr &server, bool &empty) const
{
ObAddr inner_server;
inner_server.set_ip_addr("127.0.0.1", 9999);
if (server == inner_server) {
empty = true;
} else {
empty = false;
}
return OB_SUCCESS;
}
};
class FakeLeaderCoordinator : public ObLeaderCoordinator
{
public:
virtual void signal();
};
void FakeLeaderCoordinator::signal()
{
//do nothing
}
ObServerConfig &config_ = ObServerConfig::get_instance();
class TestServerManager : public ::testing::Test
{
public:
TestServerManager();
virtual ~TestServerManager();
virtual void SetUp();
virtual void TearDown();
protected:
ObFakeCB cb_;
ObFakeServerChangeCB cb2_;
MockObSrvRpcProxy rpc_proxy_;
MockFreezeInfoManager freeze_info_manager_;
ObServerManager server_manager_;
FakeZoneManager zone_mgr_;
FakeUnitManager unit_mgr_;
FakeLeaderCoordinator leader_coordinator_;
DBInitializer db_initer_;
uint64_t server_id_;
void build_status(ObServerStatus::DisplayStatus status, const int64_t now,
const ObZone &zone, const ObAddr &server,
ObServerStatus &server_status);
};
TestServerManager::TestServerManager()
: cb_(), cb2_(), server_manager_(), zone_mgr_(), unit_mgr_(server_manager_, zone_mgr_),
server_id_(OB_INIT_SERVER_ID)
{
}
TestServerManager::~TestServerManager()
{
}
template <typename T>
ObArray<T> to_array(const T &t) { ObArray<T> res; res.push_back(t); return res; }
void TestServerManager::TearDown()
{
ObKVGlobalCache::get_instance().destroy();
}
void TestServerManager::SetUp()
{
ASSERT_EQ(OB_SUCCESS, db_initer_.init());
ObKVGlobalCache::get_instance().init();
ASSERT_EQ(OB_SUCCESS, db_initer_.create_system_table(false));
ASSERT_EQ(OB_SUCCESS, db_initer_.fill_sys_stat_table(OB_SYS_TENANT_ID));
const int64_t now = ::oceanbase::common::ObTimeUtility::current_time();
ObAddr rs_addr = F;
ASSERT_EQ(OB_SUCCESS, server_manager_.init(cb_, cb2_, db_initer_.get_sql_proxy(), unit_mgr_,
zone_mgr_, leader_coordinator_, config_, rs_addr,
rpc_proxy_));
server_manager_.reset();
ObServerManager::ObServerStatusArray server_statuses;
ObServerStatus server_status;
ObAddr server;
// offline server status
server_status.reset();
server = A;
build_status(ObServerStatus::OB_SERVER_INACTIVE, now, "1", server, server_status);
ASSERT_EQ(OB_SUCCESS, server_statuses.push_back(server_status));
// serving server status
server_status.reset();
server = B;
build_status(ObServerStatus::OB_SERVER_ACTIVE, now, "1", server, server_status);
ASSERT_EQ(OB_SUCCESS, server_statuses.push_back(server_status));
// delete server status
server_status.reset();
server = C;
build_status(ObServerStatus::OB_SERVER_DELETING, now, "1", server, server_status);
ASSERT_EQ(OB_SUCCESS, server_statuses.push_back(server_status));
ASSERT_EQ(OB_SUCCESS, server_manager_.load_server_statuses(server_statuses));
ASSERT_EQ(true, server_manager_.has_build());
// ObServerManager::load_server_status() will set heartbeat status to lease_expired if alive,
// set B to alive manually.
server = B;
ObServerStatus ss;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, ss));
ss.hb_status_ = ObServerStatus::OB_HEARTBEAT_ALIVE;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_server_status(ss));
}
void TestServerManager::build_status(ObServerStatus::DisplayStatus status, const int64_t now,
const ObZone &zone, const ObAddr &server,
ObServerStatus &server_status)
{
if (ObServerStatus::OB_SERVER_INACTIVE == status) {
// lease outdate 4s
server_status.last_hb_time_ = now - config_.lease_time - 4000000;
server_status.admin_status_ = ObServerStatus::OB_SERVER_ADMIN_NORMAL;
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED;
} else if (ObServerStatus::OB_SERVER_ACTIVE == status) {
// 1s
server_status.last_hb_time_ = now - 1000000;
server_status.admin_status_ = ObServerStatus::OB_SERVER_ADMIN_NORMAL;
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_ALIVE;
} else if (ObServerStatus::OB_SERVER_DELETING == status) {
server_status.last_hb_time_ = 0;
server_status.admin_status_ = ObServerStatus::OB_SERVER_ADMIN_DELETING;
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED;
}
ASSERT_TRUE(strlen("dev1.0") == snprintf(server_status.build_version_, OB_SERVER_VERSION_LENGTH,
"%s", "dev1.0"));
server_status.zone_ = zone;
server_status.server_ = server;
server_status.id_ = server_id_;
++server_id_;
}
TEST_F(TestServerManager, basic)
{
ObServerManager server_mgr;
ObServerInfoList server_info_list;
uint64_t server_id = OB_INVALID_ID;
bool to_alive = false;
bool update_delay_time_flag = false;
ASSERT_EQ(OB_NOT_INIT, server_mgr.add_server_list(server_info_list, server_id));
ObLeaseRequest lq;
ASSERT_EQ(OB_NOT_INIT, server_mgr.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ObAddr server;
server = B;
bool is_alive = false;
ASSERT_EQ(OB_NOT_INIT, server_mgr.check_server_alive(server, is_alive));
ObZone zone;
int64_t count = 0;
ObServerManager::ObServerArray servers;
ASSERT_EQ(OB_NOT_INIT, server_mgr.get_alive_servers(zone, servers));
ASSERT_EQ(OB_NOT_INIT, server_mgr.get_alive_server_count(zone, count));
ASSERT_EQ(OB_NOT_INIT, server_mgr.get_servers_of_zone(zone, servers));
ASSERT_EQ(OB_NOT_INIT, server_mgr.check_servers());
ObServerStatus status;
ASSERT_EQ(OB_NOT_INIT, server_mgr.get_server_status(server, status));
ASSERT_EQ(OB_NOT_INIT, server_mgr.update_server_status(status));
ObServerManager::ObServerStatusArray statuses;
ASSERT_EQ(OB_NOT_INIT, server_mgr.load_server_statuses(statuses));
ASSERT_EQ(OB_NOT_INIT, server_mgr.get_server_statuses(zone, statuses));
ASSERT_EQ(OB_NOT_INIT, server_mgr.get_server_zone(server, zone));
ASSERT_EQ(OB_NOT_INIT, server_mgr.add_server(server, zone));
ASSERT_EQ(OB_NOT_INIT, server_mgr.delete_server(to_array(server), zone));
ASSERT_EQ(OB_NOT_INIT, server_mgr.end_delete_server(server, zone, true));
ASSERT_EQ(OB_NOT_INIT, server_mgr.start_server(server, zone));
ASSERT_EQ(OB_NOT_INIT, server_mgr.stop_server(server, zone));
server_mgr.reset();
LOG_INFO("server manager", K(server_mgr));
}
#define GET_STR(fun, ...) ({ const char *__str = NULL; ret = fun(__VA_ARGS__, __str); __str;})
#define GET_STATUS(fun, ...) ({ ObServerStatus::DisplayStatus __s; ret = fun(__VA_ARGS__, __s); __s; })
TEST_F(TestServerManager, server_status_func)
{
ObServerStatus server_status;
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED;
server_status.admin_status_ = ObServerStatus::OB_SERVER_ADMIN_NORMAL;
int ret = OB_SUCCESS;
ASSERT_STREQ("inactive", GET_STR(ObServerStatus::display_status_str, server_status.get_display_status()));
ASSERT_EQ(server_status.get_display_status(), GET_STATUS(ObServerStatus::str2display_status, "inactive"));
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_ALIVE;
ASSERT_STREQ("active", GET_STR(ObServerStatus::display_status_str, server_status.get_display_status()));
ASSERT_EQ(server_status.get_display_status(), GET_STATUS(ObServerStatus::str2display_status, "active"));
server_status.admin_status_ = ObServerStatus::OB_SERVER_ADMIN_DELETING;
ASSERT_STREQ("deleting", GET_STR(ObServerStatus::display_status_str, server_status.get_display_status()));
ASSERT_EQ(server_status.get_display_status(), GET_STATUS(ObServerStatus::str2display_status, "deleting"));
ASSERT_STREQ(NULL, GET_STR(ObServerStatus::display_status_str, ObServerStatus::OB_DISPLAY_MAX));
ASSERT_NE(OB_SUCCESS, ret);
ASSERT_EQ(ObServerStatus::OB_DISPLAY_MAX, GET_STATUS(ObServerStatus::str2display_status, "randomxxx"));
ASSERT_NE(OB_SUCCESS, ret);
ASSERT_FALSE(server_status.is_valid());
server_status.server_ = B;
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_MAX;
ASSERT_FALSE(server_status.is_valid());
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_ALIVE;
ASSERT_FALSE(server_status.is_valid());
server_status.id_ = OB_INIT_SERVER_ID;
ASSERT_TRUE(server_status.is_valid());
}
TEST_F(TestServerManager, receive_hb)
{
int64_t alive_count = 0;
bool is_alive = false;
bool to_alive = false;
bool update_delay_time_flag = false;
ObServerManager::ObServerArray server_list;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_alive_servers("1", server_list));
ASSERT_EQ(1, server_list.count());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_alive_server_count("1", alive_count));
ASSERT_EQ(1, alive_count);
ObLeaseRequest lq;
uint64_t server_id = OB_INVALID_ID;
// receive hb of not exist server
lq.server_ = A1;
lq.zone_ = "1";
lq.inner_port_ = 3306;
lq.resource_info_.cpu_ = 1;
lq.resource_info_.mem_in_use_ = 0;
lq.resource_info_.mem_total_ = 1024;
lq.resource_info_.disk_in_use_ = 0;
lq.resource_info_.disk_total_ = 1024;
ASSERT_TRUE(strlen("dev1.0") == snprintf(lq.build_version_, OB_SERVER_VERSION_LENGTH,
"%s", "dev1.0"));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_FALSE(is_alive);
ASSERT_EQ(OB_SERVER_NOT_IN_WHITE_LIST, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_FALSE(is_alive);
// receive hb of non exist server
lq.server_ = D;
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_FALSE(is_alive);
ASSERT_EQ(OB_SERVER_NOT_IN_WHITE_LIST, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_FALSE(is_alive);
// receive hb of offline server
lq.server_ = A;
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_FALSE(is_alive);
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_TRUE(is_alive);
// receive hb of serving server
lq.server_ = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_TRUE(is_alive);
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_TRUE(is_alive);
// receive hb of serving but svn version change server
ASSERT_TRUE(strlen("dev1.111") == snprintf(lq.build_version_, OB_SERVER_VERSION_LENGTH,
"%s", "dev1.111"));
lq.server_ = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_TRUE(is_alive);
ASSERT_EQ(OB_SUCCESS, server_manager_.get_alive_servers("1", server_list));
ASSERT_EQ(2, server_list.count());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_alive_server_count("1", alive_count));
ASSERT_EQ(2, alive_count);
// rs change, so rs_addr change, server with root_server change from false to true
MockObSrvRpcProxy rpc_proxy;
MockFreezeInfoManager freeze_info_manager;
ObServerManager temp_server_manager;
ASSERT_EQ(OB_SUCCESS, temp_server_manager.init(cb_, cb2_, db_initer_.get_sql_proxy(), unit_mgr_,
zone_mgr_, leader_coordinator_, config_, lq.server_,
rpc_proxy));
ObArray<ObServerStatus> statuses;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_statuses(ObZone(""), statuses));
ASSERT_EQ(OB_SUCCESS, temp_server_manager.load_server_statuses(statuses));
ASSERT_EQ(OB_SUCCESS, temp_server_manager.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, temp_server_manager.check_server_alive(lq.server_, is_alive));
ASSERT_TRUE(is_alive);
ObServerStatus status;
ASSERT_EQ(OB_SUCCESS, temp_server_manager.get_server_status(lq.server_, status));
ASSERT_TRUE(status.with_rootserver_);
}
TEST_F(TestServerManager, get_set_server_status)
{
ObServerStatus server_status;
ObAddr server;
server = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
ASSERT_TRUE(server_status.is_active());
server_status.hb_status_ = ObServerStatus::OB_HEARTBEAT_LEASE_EXPIRED;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_server_status(server_status));
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
ASSERT_FALSE(server_status.is_active());
// not exist server status
server = E;
ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.get_server_status(server, server_status));
server_status.server_ = server;
ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.update_server_status(server_status));
}
TEST_F(TestServerManager, check_servers)
{
ObServerStatus server_status;
const int64_t now = ::oceanbase::common::ObTimeUtility::current_time();
ObAddr server;
server = A;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
server_status.last_hb_time_ = now;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_server_status(server_status));
server = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
server_status.last_hb_time_ = now - config_.lease_time - 4000000L;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_server_status(server_status));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_servers());
server = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
ASSERT_FALSE(server_status.is_alive());
// block migrate in time
server = A;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
server_status.block_migrate_in_time_ = now - config_.migration_disable_time- 1;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_server_status(server_status));
bool migrate_in_blocked = false;
ASSERT_EQ(OB_SUCCESS, server_manager_.check_migrate_in_blocked(server, migrate_in_blocked));
ASSERT_TRUE(migrate_in_blocked);
ASSERT_EQ(OB_SUCCESS, server_manager_.check_servers());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
ASSERT_EQ(0, server_status.block_migrate_in_time_);
ASSERT_EQ(OB_SUCCESS, server_manager_.check_migrate_in_blocked(server, migrate_in_blocked));
ASSERT_FALSE(migrate_in_blocked);
}
TEST_F(TestServerManager, load_server_statuses)
{
ObServerManager::ObServerStatusArray server_statuses;
// server already exist, will not add to server manager,
// server manager has newer server status
ObServerStatus server_status;
ObAddr server;
const int64_t now = ::oceanbase::common::ObTimeUtility::current_time();
server_status.reset();
server = A;
build_status(ObServerStatus::OB_SERVER_DELETING, now, "1", server, server_status);
ASSERT_EQ(OB_SUCCESS, server_statuses.push_back(server_status));
ASSERT_EQ(OB_SUCCESS, server_manager_.load_server_statuses(server_statuses));
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_statuses("", server_statuses));
ASSERT_EQ(1, server_statuses.count());
ASSERT_EQ(ObServerStatus::OB_SERVER_ADMIN_DELETING, server_statuses.at(0).admin_status_);
}
TEST_F(TestServerManager, get)
{
ObServerManager::ObServerStatusArray server_statuses;
// add a server of other zone
ObLeaseRequest lq;
uint64_t server_id = OB_INVALID_ID;
bool to_alive = false;
bool update_delay_time_flag = false;
lq.server_ = A1;
lq.zone_ = "2";
ASSERT_TRUE(strlen("dev1.0") == snprintf(lq.build_version_, OB_SERVER_VERSION_LENGTH,
"%s", "dev1.0"));
obrpc::ObServerInfo server_info;
server_info.server_ = lq.server_;
server_info.zone_ = lq.zone_;
lq.inner_port_ = 3306;
lq.resource_info_.cpu_ = 1;
lq.resource_info_.mem_in_use_ = 0;
lq.resource_info_.mem_total_ = 1024;
lq.resource_info_.disk_in_use_ = 0;
lq.resource_info_.disk_total_ = 1024;
ObSArray<obrpc::ObServerInfo> server_infos;
ASSERT_EQ(OB_SUCCESS, server_infos.push_back(server_info));
ASSERT_EQ(OB_SUCCESS, server_manager_.add_server_list(server_infos, server_id));
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_statuses("1", server_statuses));
ASSERT_EQ(3, server_statuses.count());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_statuses("2", server_statuses));
ASSERT_EQ(1, server_statuses.count());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_statuses("", server_statuses));
ASSERT_EQ(4, server_statuses.count());
ObServerManager::ObServerArray servers;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_servers_of_zone("1", servers));
ASSERT_EQ(3, servers.count());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_servers_of_zone("2", servers));
ASSERT_EQ(1, servers.count());
ASSERT_EQ(OB_SUCCESS, server_manager_.get_servers_of_zone("", servers));
ASSERT_EQ(4, servers.count());
ObZone zone;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_zone(lq.server_, zone));
ASSERT_EQ(ObZone("2"), zone);
LOG_INFO("Print", K(server_manager_));
int64_t lease_time = 0;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_lease_duration(lease_time));
ASSERT_EQ(lease_time, db_initer_.get_config().lease_time);
}
TEST_F(TestServerManager, commit_error)
{
bool is_alive = false;
cb_.set_return_success(false);
// if commit_task failed, server manager and __all_server will be not consistent
ObLeaseRequest lq;
uint64_t server_id = OB_INVALID_ID;
bool to_alive = false;
bool update_delay_time_flag = false;
lq.server_ = A1;
lq.zone_ = "1";
lq.inner_port_ = 3306;
lq.resource_info_.cpu_ = 1;
lq.resource_info_.mem_in_use_ = 0;
lq.resource_info_.mem_total_ = 1024;
lq.resource_info_.disk_in_use_ = 0;
lq.resource_info_.disk_total_ = 1024;
ASSERT_TRUE(strlen("dev1.0") == snprintf(lq.build_version_, OB_SERVER_VERSION_LENGTH,
"%s", "dev1.0"));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_FALSE(is_alive);
obrpc::ObServerInfo server_info;
server_info.server_ = lq.server_;
server_info.zone_ = lq.zone_;
ObSArray<obrpc::ObServerInfo> server_infos;
ASSERT_EQ(OB_SUCCESS, server_infos.push_back(server_info));
ASSERT_EQ(OB_SUCCESS, server_manager_.add_server_list(server_infos, server_id));
ASSERT_EQ(OB_ERROR, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
ASSERT_TRUE(is_alive);
const int64_t now = ::oceanbase::common::ObTimeUtility::current_time();
ObServerStatus server_status;
ObAddr server;
server = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
server_status.last_hb_time_ = now - config_.lease_time - 4000000L;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_server_status(server_status));
ASSERT_EQ(OB_ERROR, server_manager_.check_servers());
}
TEST_F(TestServerManager, heartbeatchecker)
{
ObHeartbeatChecker checker;
ASSERT_EQ(OB_SUCCESS, checker.init(server_manager_));
ASSERT_EQ(OB_INIT_TWICE, checker.init(server_manager_));
checker.start();
usleep(200 * 100 * 1000L); // check_server will be invoked 200 times
ObServerStatus server_status;
ObAddr server;
server = B;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(server, server_status));
ASSERT_FALSE(server_status.is_active());
checker.stop();
checker.wait();
}
//TEST_F(TestServerManager, maintain_server)
//{
// ObLeaseRequest lq;
// uint64_t server_id = OB_INVALID_ID;
// bool to_alive = false;
// lq.server_ = E;
// lq.zone_ = "2";
// lq.inner_port_ = 3306;
// lq.resource_info_.cpu_ = 1;
// lq.resource_info_.mem_in_use_ = 0;
// lq.resource_info_.mem_total_ = 1024;
// lq.resource_info_.disk_in_use_ = 0;
// lq.resource_info_.disk_total_ = 1024;
// ASSERT_TRUE(strlen("dev1.0") == snprintf(lq.build_version_, OB_SERVER_VERSION_LENGTH,
// "%s", "dev1.0"));
// ASSERT_EQ(OB_SERVER_NOT_IN_WHITE_LIST, server_manager_.receive_hb(lq, server_id, to_alive));
// bool is_alive = false;
// ASSERT_EQ(OB_SUCCESS, server_manager_.check_server_alive(lq.server_, is_alive));
// ASSERT_FALSE(is_alive);
//
// // add server
// ObAddr invalid_server;
// ASSERT_EQ(OB_INVALID_ARGUMENT, server_manager_.add_server(invalid_server, lq.zone_));
// ASSERT_EQ(OB_SUCCESS, server_manager_.add_server(lq.server_, lq.zone_));
// ASSERT_EQ(OB_ENTRY_EXIST, server_manager_.add_server(lq.server_, lq.zone_));
// ASSERT_EQ(OB_INVALID_ARGUMENT, server_manager_.start_server(invalid_server, lq.zone_));
// ASSERT_EQ(OB_SERVER_ZONE_NOT_MATCH, server_manager_.start_server(lq.server_, "5"));
// ASSERT_EQ(OB_SUCCESS, server_manager_.start_server(lq.server_, lq.zone_));
// ObServerStatus server_status;
// ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(lq.server_, server_status));
// ASSERT_FALSE(server_status.is_active());
// ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive));
// ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(lq.server_, server_status));
// ASSERT_TRUE(server_status.is_active());
// ObLeaseRequest not_match_lq = lq;
// not_match_lq.zone_ = "1";
// ASSERT_EQ(OB_SERVER_ZONE_NOT_MATCH, server_manager_.receive_hb(not_match_lq, server_id, to_alive));
//
// ObAddr not_exist_server;
// not_exist_server = A1;
// ObZone not_match_zone = "1";
// // delete server, invalid server and not exist server
// ASSERT_EQ(OB_INVALID_ARGUMENT, server_manager_.delete_server(to_array(invalid_server), not_match_zone));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.delete_server(to_array(not_exist_server), not_match_zone));
// ASSERT_EQ(OB_INVALID_ARGUMENT, server_manager_.end_delete_server(invalid_server, not_match_zone));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.end_delete_server(not_exist_server, not_match_zone));
//
// //add or stop server, invalid server and not exist server
// ASSERT_EQ(OB_INVALID_ARGUMENT, server_manager_.start_server(invalid_server, not_match_zone));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.start_server(not_exist_server, not_match_zone));
// ASSERT_EQ(OB_INVALID_ARGUMENT, server_manager_.stop_server(invalid_server, not_match_zone));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.stop_server(not_exist_server, not_match_zone));
//
// //stop server twice
// ASSERT_EQ(OB_SUCCESS, server_manager_.stop_server(lq.server_, lq.zone_));
// ASSERT_EQ(OB_SUCCESS, server_manager_.stop_server(lq.server_, lq.zone_));
// //start server again
// ASSERT_EQ(OB_SUCCESS, server_manager_.start_server(lq.server_, lq.zone_));
// ASSERT_EQ(OB_SUCCESS, server_manager_.start_server(lq.server_, lq.zone_));
// //stop servers in multiple zone
// ObAddr server;
// server = A;
// ASSERT_EQ(OB_SUCCESS, server_manager_.stop_server(lq.server_, lq.zone_));
// ASSERT_EQ(OB_STOP_SERVER_IN_MULTIPLE_ZONES, server_manager_.stop_server(server, "1"));
//
// // delete server, then cancel delete
// ASSERT_EQ(OB_SERVER_ZONE_NOT_MATCH, server_manager_.delete_server(to_array(lq.server_), not_match_zone));
// ASSERT_EQ(OB_SUCCESS, server_manager_.delete_server(to_array(lq.server_), lq.zone_));
// ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(lq.server_, server_status));
// ASSERT_EQ(ObServerStatus::OB_SERVER_DELETING, server_status.get_display_status());
// ASSERT_EQ(OB_SERVER_ZONE_NOT_MATCH, server_manager_.delete_server(to_array(lq.server_), not_match_zone));
// ASSERT_EQ(OB_SUCCESS, server_manager_.end_delete_server(lq.server_, lq.zone_, false));
// ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(lq.server_, server_status));
// ASSERT_EQ(ObServerStatus::OB_SERVER_ACTIVE, server_status.get_display_status());
// ASSERT_EQ(OB_SERVER_NOT_DELETING, server_manager_.end_delete_server(lq.server_, lq.zone_, false));
//
// // delete server, then commit delete
// ASSERT_EQ(OB_SUCCESS, server_manager_.delete_server(to_array(lq.server_), lq.zone_));
// ASSERT_EQ(OB_SUCCESS, server_manager_.end_delete_server(lq.server_, lq.zone_, true));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.get_server_status(lq.server_, server_status));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.end_delete_server(lq.server_, lq.zone_, true));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.delete_server(to_array(lq.server_), lq.zone_));
//
// ObZone not_exist_zone = "not_exist";
// ASSERT_EQ(OB_ZONE_NOT_ACTIVE, server_manager_.add_server(lq.server_, not_exist_zone));
// ASSERT_EQ(OB_SUCCESS, server_manager_.add_server(lq.server_, lq.zone_));
// ASSERT_EQ(OB_SERVER_ZONE_NOT_MATCH, server_manager_.delete_server(to_array(lq.server_), not_exist_zone));
// ASSERT_EQ(OB_SERVER_ZONE_NOT_MATCH, server_manager_.end_delete_server(lq.server_, not_exist_zone, true));
//
// // empty server, delete then add server again
// ObAddr empty_server;
// empty_server.set_ip_addr("127.0.0.1", 1111);
// ASSERT_EQ(OB_SUCCESS, server_manager_.add_server(empty_server, "1"));
// ASSERT_EQ(OB_SUCCESS, server_manager_.delete_server(to_array(empty_server), "1"));
// ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(empty_server, server_status));
// ASSERT_EQ(OB_SUCCESS, server_manager_.end_delete_server(empty_server, server_status.zone_, true));
// ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.get_server_status(empty_server, server_status));
// ASSERT_EQ(OB_SUCCESS, server_manager_.add_server(empty_server, "1"));
//}
TEST_F(TestServerManager, update_merged_version)
{
ObAddr s1, s2, s3;
s1 = A;
s2 = B;
s3 = C;
ObLeaseRequest lq;
lq.zone_ = "1";
lq.server_ = s1;
lq.inner_port_ = 3306;
lq.resource_info_.cpu_ = 1;
lq.resource_info_.mem_in_use_ = 0;
lq.resource_info_.mem_total_ = 1024;
lq.resource_info_.disk_in_use_ = 0;
lq.resource_info_.disk_total_ = 1024;
uint64_t server_id;
bool to_alive = false;
bool update_delay_time_flag = false;
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
lq.server_ = s2;
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
lq.server_ = s3;
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
bool merged = false;
ASSERT_EQ(OB_SUCCESS, server_manager_.update_merged_version(s1, 2, merged));
ASSERT_FALSE(merged);
ASSERT_EQ(OB_SUCCESS, server_manager_.update_merged_version(s2, 2, merged));
ASSERT_FALSE(merged);
ASSERT_EQ(OB_SUCCESS, server_manager_.update_merged_version(s3, 2, merged));
ASSERT_TRUE(merged);
}
TEST_F(TestServerManager, block_migrate_in)
{
ObAddr s1, not_exist_server;
s1 = B;
not_exist_server = A1;
bool is_block = true;
ASSERT_EQ(OB_SUCCESS, server_manager_.check_migrate_in_blocked(s1, is_block));
ASSERT_FALSE(is_block);
ASSERT_EQ(OB_SUCCESS, server_manager_.block_migrate_in(s1));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_migrate_in_blocked(s1, is_block));
ASSERT_TRUE(is_block);
ASSERT_EQ(OB_SUCCESS, server_manager_.unblock_migrate_in(s1));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_migrate_in_blocked(s1, is_block));
ASSERT_FALSE(is_block);
is_block = true;
ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.check_migrate_in_blocked(not_exist_server, is_block));
ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.block_migrate_in(not_exist_server));
}
TEST_F(TestServerManager, in_service)
{
ObAddr s1, not_exist_server;
s1 = A;
not_exist_server = A1;
bool in_service = false;
ASSERT_EQ(OB_SUCCESS, server_manager_.check_in_service(s1, in_service));
ASSERT_FALSE(in_service);
ObLeaseRequest lq;
lq.zone_ = "1";
lq.server_ = s1;
lq.start_service_time_ = ObTimeUtility::current_time();
lq.inner_port_ = 3306;
lq.resource_info_.cpu_ = 1;
lq.resource_info_.mem_in_use_ = 0;
lq.resource_info_.mem_total_ = 1024;
lq.resource_info_.disk_in_use_ = 0;
lq.resource_info_.disk_total_ = 1024;
uint64_t server_id;
bool to_alive = false;
bool update_delay_time_flag = false;
ASSERT_EQ(OB_SUCCESS, server_manager_.receive_hb(lq, server_id, to_alive, update_delay_time_flag));
ASSERT_EQ(OB_SUCCESS, server_manager_.check_in_service(s1, in_service));
ASSERT_TRUE(in_service);
in_service = false;
ASSERT_EQ(OB_ENTRY_NOT_EXIST, server_manager_.check_in_service(not_exist_server, in_service));
}
TEST_F(TestServerManager, with_partition)
{
ASSERT_EQ(OB_SUCCESS, server_manager_.set_with_partition(B));
ASSERT_NE(OB_SUCCESS, server_manager_.set_with_partition(A)); // non-alive can not set with partition flag
ObServerStatus A_s;
ObServerStatus B_s;
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(A, A_s));
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(B, B_s));
ASSERT_TRUE(B_s.with_partition_);
ASSERT_EQ(OB_SUCCESS, server_manager_.clear_with_partition(A, A_s.last_hb_time_));
// last hb time mismatch, return success, keep with partition flag unchanged.
ASSERT_EQ(OB_SUCCESS, server_manager_.clear_with_partition(B, B_s.last_hb_time_ + 1));
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(B, B_s));
ASSERT_TRUE(B_s.with_partition_);
ASSERT_EQ(OB_SUCCESS, server_manager_.clear_with_partition(B, B_s.last_hb_time_));
ASSERT_EQ(OB_SUCCESS, server_manager_.get_server_status(B, B_s));
ASSERT_FALSE(B_s.with_partition_);
}
}//end namespace rootserver
}//end namespace oceanbase
int main(int argc, char **argv)
{
system("rm -f test_server_manager.log*");
ObLogger &logger = ObLogger::get_logger();
logger.set_file_name("test_server_manager.log", true);
logger.set_log_level(OB_LOG_LEVEL_INFO);
::testing::InitGoogleTest(&argc,argv);
oceanbase::common::ObTenantManager::get_instance().init(10);
oceanbase::common::ObTenantManager::get_instance().add_tenant(OB_SYS_TENANT_ID);
oceanbase::common::ObTenantManager::get_instance().set_tenant_mem_limit(OB_SYS_TENANT_ID, 1024L * 1024L * 1024L, 1024L * 1024L * 1024L);
return RUN_ALL_TESTS();
}