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