190 lines
8.1 KiB
C++
190 lines
8.1 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 "../share/schema/db_initializer.h"
|
|
#include "lib/stat/ob_session_stat.h"
|
|
#include "rootserver/ob_server_table_operator.h"
|
|
#include "lib/time/ob_time_utility.h"
|
|
#include "share/config/ob_server_config.h"
|
|
#include "share/ob_lease_struct.h"
|
|
#include "server_status_builder.h"
|
|
#include "lib/mysqlclient/ob_mysql_transaction.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace common;
|
|
using namespace share;
|
|
using namespace share::schema;
|
|
namespace rootserver
|
|
{
|
|
class TestServerTabbleOperator : public ::testing::Test
|
|
{
|
|
public:
|
|
TestServerTabbleOperator() {}
|
|
virtual ~TestServerTabbleOperator() {}
|
|
virtual void SetUp();
|
|
virtual void TearDown() {}
|
|
protected:
|
|
void check_result(const ObIArray<ObServerStatus> &statuses,
|
|
const ObIArray<ObServerStatus> &cmp_statuses);
|
|
DBInitializer db_initer_;
|
|
ObServerTableOperator st_operator_;
|
|
};
|
|
|
|
void TestServerTabbleOperator::SetUp()
|
|
{
|
|
ASSERT_EQ(OB_SUCCESS, db_initer_.init());
|
|
|
|
ASSERT_EQ(OB_SUCCESS, db_initer_.create_system_table(false));
|
|
}
|
|
|
|
void TestServerTabbleOperator::check_result(const ObIArray<ObServerStatus> &statuses,
|
|
const ObIArray<ObServerStatus> &cmp_statuses)
|
|
{
|
|
ASSERT_EQ(statuses.count(), cmp_statuses.count());
|
|
for (int64_t i = 0; i < statuses.count(); ++i) {
|
|
ASSERT_EQ(statuses.at(i).zone_, cmp_statuses.at(i).zone_);
|
|
ASSERT_EQ(statuses.at(i).server_, cmp_statuses.at(i).server_);
|
|
ASSERT_EQ(statuses.at(i).sql_port_, cmp_statuses.at(i).sql_port_);
|
|
ASSERT_EQ(statuses.at(i).register_time_, cmp_statuses.at(i).register_time_);
|
|
//ASSERT_EQ(statuses.at(i).last_hb_time_, cmp_statuses.at(i).last_hb_time_);
|
|
ASSERT_EQ(statuses.at(i).admin_status_, cmp_statuses.at(i).admin_status_)
|
|
<< "left: " << to_cstring(statuses.at(i)) << "right: " << to_cstring(cmp_statuses.at(i));
|
|
ASSERT_EQ(statuses.at(i).hb_status_, cmp_statuses.at(i).hb_status_);
|
|
ASSERT_EQ(statuses.at(i).get_display_status(), cmp_statuses.at(i).get_display_status());
|
|
ASSERT_EQ(statuses.at(i).block_migrate_in_time_, cmp_statuses.at(i).block_migrate_in_time_);
|
|
ASSERT_EQ(statuses.at(i).start_service_time_, cmp_statuses.at(i).start_service_time_);
|
|
ASSERT_EQ(statuses.at(i).with_rootserver_, cmp_statuses.at(i).with_rootserver_);
|
|
ASSERT_EQ(statuses.at(i).with_partition_, cmp_statuses.at(i).with_partition_);
|
|
ASSERT_STREQ(statuses.at(i).build_version_, cmp_statuses.at(i).build_version_);
|
|
}
|
|
}
|
|
|
|
TEST_F(TestServerTabbleOperator, common)
|
|
{
|
|
ObServerTableOperator not_init_st_operator;
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.init(db_initer_.get_sql_proxy()));
|
|
ASSERT_EQ(OB_INIT_TWICE, st_operator_.init(db_initer_.get_sql_proxy()));
|
|
ObServerStatusBuilder builder;
|
|
ASSERT_EQ(OB_SUCCESS, builder.init(db_initer_.get_config()));
|
|
const int64_t now = ObTimeUtility::current_time();
|
|
|
|
ObAddr invalid_server;
|
|
ObServerStatus invalid_status;
|
|
ObAddr A(ObAddr::IPV4, "127.0.0.1", 4444);
|
|
ObAddr B(ObAddr::IPV4, "127.0.0.1", 5555);
|
|
ObZone zone = "test";
|
|
builder.add(ObServerStatus::OB_SERVER_INACTIVE, now, A, zone)
|
|
.add(ObServerStatus::OB_SERVER_ACTIVE, now, B, zone);
|
|
ObServerManager::ObServerStatusArray &server_statuses = builder.get_server_statuses();
|
|
server_statuses.at(0).block_migrate_in_time_ = 0;
|
|
server_statuses.at(1).block_migrate_in_time_ = now;
|
|
server_statuses.at(0).start_service_time_ = 0;
|
|
server_statuses.at(1).start_service_time_ = now;
|
|
|
|
// add two server
|
|
ASSERT_EQ(OB_NOT_INIT, not_init_st_operator.update(server_statuses.at(0)));
|
|
ASSERT_EQ(OB_INVALID_ARGUMENT, st_operator_.update(invalid_status));
|
|
invalid_status.server_ = A; // server valid, but status still not valid
|
|
ASSERT_EQ(OB_INVALID_ARGUMENT, st_operator_.update(invalid_status));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update(server_statuses.at(0)));
|
|
// udpate again shoud success two
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update(server_statuses.at(0)));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update(server_statuses.at(1)));
|
|
|
|
// get
|
|
ObArray<ObServerStatus> got_server_statuses;
|
|
ASSERT_EQ(OB_NOT_INIT, not_init_st_operator.get(got_server_statuses));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
for(int64_t i = 0;i < got_server_statuses.count(); i++) {
|
|
LOG_WARN("print get server status", K(got_server_statuses.at(i)));
|
|
}
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(got_server_statuses.at(0).is_migrate_in_blocked());
|
|
ASSERT_TRUE(got_server_statuses.at(1).is_migrate_in_blocked());
|
|
ASSERT_FALSE(got_server_statuses.at(0).in_service());
|
|
ASSERT_TRUE(got_server_statuses.at(1).in_service());
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
|
|
// reset rootserver and get
|
|
got_server_statuses.reset();
|
|
server_statuses.at(0).with_rootserver_ = true;
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update(server_statuses.at(0)));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.reset_rootserver(B));
|
|
server_statuses.at(0).with_rootserver_ = false;
|
|
got_server_statuses.reset();
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
|
|
// remove one
|
|
common::ObMySQLTransaction trans;
|
|
ASSERT_EQ(OB_SUCCESS, trans.start(&db_initer_.get_sql_proxy()));
|
|
ASSERT_EQ(OB_NOT_INIT, not_init_st_operator.remove(B, trans));
|
|
ASSERT_EQ(OB_INVALID_ARGUMENT, st_operator_.remove(invalid_server, trans));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.remove(B, trans));
|
|
server_statuses.pop_back();
|
|
got_server_statuses.reset();
|
|
ASSERT_EQ(OB_SUCCESS, trans.end(true));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
|
|
// update status and get
|
|
ASSERT_EQ(OB_SUCCESS, trans.start(&db_initer_.get_sql_proxy()));
|
|
ObServerStatus &As = server_statuses.at(0);
|
|
ASSERT_EQ(A, As.server_);
|
|
ASSERT_EQ(OB_NOT_INIT, not_init_st_operator.update_status(
|
|
A, ObServerStatus::OB_SERVER_DELETING, As.last_hb_time_, trans));
|
|
ASSERT_EQ(OB_INVALID_ARGUMENT, st_operator_.update_status(
|
|
invalid_server, ObServerStatus::OB_SERVER_DELETING, As.last_hb_time_, trans));
|
|
As.admin_status_ = ObServerStatus::OB_SERVER_ADMIN_DELETING;
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update_status(
|
|
A, ObServerStatus::OB_SERVER_DELETING, As.last_hb_time_, trans));
|
|
got_server_statuses.reset();
|
|
ASSERT_EQ(OB_SUCCESS, trans.end(true));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
|
|
// set && clear with_partition flag
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update_with_partition(As.server_, true));
|
|
As.with_partition_ = true;
|
|
got_server_statuses.reset();
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update_with_partition(A, false));
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.update_with_partition(B, false));
|
|
As.with_partition_ = false;
|
|
got_server_statuses.reset();
|
|
ASSERT_EQ(OB_SUCCESS, st_operator_.get(got_server_statuses));
|
|
check_result(server_statuses, got_server_statuses);
|
|
ASSERT_FALSE(this->HasFatalFailure());
|
|
}
|
|
|
|
}//end namespace rootserver
|
|
}//end namesapce oceanbase
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
|
|
::testing::InitGoogleTest(&argc,argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|