828 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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();
 | 
						|
}
 |