200 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.5 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 SHARE
 | 
						|
#include "lib/stat/ob_session_stat.h"
 | 
						|
#include "share/ob_zone_info.h"
 | 
						|
#include "share/ob_zone_table_operation.h"
 | 
						|
#include <gtest/gtest.h>
 | 
						|
#include "schema/db_initializer.h"
 | 
						|
 | 
						|
 | 
						|
namespace oceanbase
 | 
						|
{
 | 
						|
namespace share
 | 
						|
{
 | 
						|
using namespace common;
 | 
						|
using namespace share::schema;
 | 
						|
 | 
						|
class TestZoneInfo : public ::testing::Test
 | 
						|
{
 | 
						|
public:
 | 
						|
  virtual void SetUp();
 | 
						|
  virtual void TearDown() {}
 | 
						|
 | 
						|
protected:
 | 
						|
  DBInitializer db_initer_;
 | 
						|
  ObGlobalInfo global_info_;
 | 
						|
};
 | 
						|
 | 
						|
void TestZoneInfo::SetUp()
 | 
						|
{
 | 
						|
  int ret = db_initer_.init();
 | 
						|
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  const bool only_core_tables = false;
 | 
						|
  ret = db_initer_.create_system_table(only_core_tables);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  ASSERT_TRUE(global_info_.is_valid());
 | 
						|
 | 
						|
  ret = ObZoneTableOperation::insert_global_info(db_initer_.get_sql_proxy(), global_info_);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestZoneInfo, create_global_info)
 | 
						|
{
 | 
						|
  LOG_INFO("zone info size", K(sizeof(ObGlobalInfo)), K(sizeof(ObZoneInfo)));
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestZoneInfo, zone_item_update)
 | 
						|
{
 | 
						|
  int ret = global_info_.lease_info_version_.update(
 | 
						|
      db_initer_.get_sql_proxy(), global_info_.zone_, 1, "a");
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
  ASSERT_EQ(1, global_info_.lease_info_version_.value_);
 | 
						|
  ASSERT_EQ(1, global_info_.lease_info_version_);
 | 
						|
  ASSERT_STREQ("a", global_info_.lease_info_version_.info_.ptr());
 | 
						|
 | 
						|
  // test copy construct
 | 
						|
  ObGlobalInfo info2 = global_info_;
 | 
						|
  ASSERT_EQ(1, info2.lease_info_version_.value_);
 | 
						|
  ASSERT_EQ(1, info2.lease_info_version_);
 | 
						|
  ASSERT_STREQ("a", info2.lease_info_version_.info_.ptr());
 | 
						|
 | 
						|
  global_info_.reset();
 | 
						|
 | 
						|
  ret = ObZoneTableOperation::load_global_info(db_initer_.get_sql_proxy(), global_info_);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  ASSERT_EQ(1, global_info_.lease_info_version_.value_);
 | 
						|
  ASSERT_STREQ("a", global_info_.lease_info_version_.info_.ptr());
 | 
						|
 | 
						|
  // update in transaction
 | 
						|
  ObZoneItemTransUpdater updater;
 | 
						|
  ret = updater.start(db_initer_.get_sql_proxy());
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
  const int64_t now = ::oceanbase::common::ObTimeUtility::current_time();
 | 
						|
  ret = global_info_.frozen_version_.update(updater, global_info_.zone_, 2);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
  ret = global_info_.frozen_time_.update(updater, global_info_.zone_, now);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  ASSERT_EQ(2, global_info_.frozen_version_.value_);
 | 
						|
  ASSERT_EQ(now, global_info_.frozen_time_.value_);
 | 
						|
 | 
						|
  ret = updater.end(true);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
  ASSERT_EQ(2, global_info_.frozen_version_.value_);
 | 
						|
  ASSERT_EQ(now, global_info_.frozen_time_.value_);
 | 
						|
 | 
						|
  ASSERT_EQ(OB_SUCCESS, updater.start(db_initer_.get_sql_proxy()));
 | 
						|
  ASSERT_EQ(OB_SUCCESS, global_info_.frozen_version_.update(updater, global_info_.zone_, 3));
 | 
						|
  ASSERT_EQ(OB_SUCCESS, global_info_.frozen_time_.update(updater, global_info_.zone_, now + 1));
 | 
						|
  ASSERT_EQ(OB_SUCCESS, global_info_.frozen_version_.update(updater, global_info_.zone_, 4));
 | 
						|
 | 
						|
  ASSERT_EQ(4, global_info_.frozen_version_.value_);
 | 
						|
  ASSERT_EQ(now + 1, global_info_.frozen_time_.value_);
 | 
						|
 | 
						|
  ret = updater.end(false);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  // value rollbacked after transaction rollback.
 | 
						|
  ASSERT_EQ(2, global_info_.frozen_version_.value_);
 | 
						|
  ASSERT_EQ(now, global_info_.frozen_time_.value_);
 | 
						|
 | 
						|
  LOG_INFO("global_info", K_(global_info));
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestZoneInfo, zone_info)
 | 
						|
{
 | 
						|
  const char *zone = "ZJ.HZ.XH";
 | 
						|
  ObZoneInfo zone_info;
 | 
						|
  zone_info.zone_ = zone;
 | 
						|
  zone_info.status_.value_ = ObZoneStatus::ACTIVE;
 | 
						|
  ASSERT_STREQ("ACTIVE", zone_info.get_status_str());
 | 
						|
  ASSERT_TRUE(zone_info.is_valid());
 | 
						|
  int ret = ObZoneTableOperation::insert_zone_info(db_initer_.get_sql_proxy(), zone_info);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  ret = zone_info.last_merged_time_.update(db_initer_.get_sql_proxy(), zone_info.zone_, 2);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
  ASSERT_EQ(2, zone_info.last_merged_time_);
 | 
						|
  zone_info.reset();
 | 
						|
  zone_info.zone_ = zone;
 | 
						|
  ret = ObZoneTableOperation::load_zone_info(db_initer_.get_sql_proxy(), zone_info);
 | 
						|
  ASSERT_EQ(2, zone_info.last_merged_time_);
 | 
						|
 | 
						|
  LOG_INFO("zone_info", K(zone_info));
 | 
						|
 | 
						|
  ObArray<ObZone> zone_list;
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ObZoneTableOperation::get_zone_list(
 | 
						|
  db_initer_.get_sql_proxy(), zone_list));
 | 
						|
  ASSERT_EQ(1, zone_list.size());
 | 
						|
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ObZoneTableOperation::remove_zone_info(
 | 
						|
      db_initer_.get_sql_proxy(), zone));
 | 
						|
 | 
						|
  zone_list.reuse();
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ObZoneTableOperation::get_zone_list(
 | 
						|
  db_initer_.get_sql_proxy(), zone_list));
 | 
						|
  ASSERT_EQ(0, zone_list.size());
 | 
						|
}
 | 
						|
 | 
						|
TEST_F(TestZoneInfo, get_lease_info)
 | 
						|
{
 | 
						|
  const char *zone = "ZJ.HZ.XH";
 | 
						|
  ObZoneInfo zone_info;
 | 
						|
  zone_info.zone_ = zone;
 | 
						|
  zone_info.status_.value_ = ObZoneStatus::ACTIVE;
 | 
						|
  int ret = ObZoneTableOperation::insert_zone_info(db_initer_.get_sql_proxy(), zone_info);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  ObZoneItemTransUpdater updater;
 | 
						|
  updater.start(db_initer_.get_sql_proxy());
 | 
						|
  const ObZone &gz = global_info_.zone_;
 | 
						|
  global_info_.lease_info_version_.update(updater, gz, 4);
 | 
						|
  global_info_.config_version_.update(updater, gz, 3);
 | 
						|
  global_info_.frozen_version_.update(updater, gz, 2);
 | 
						|
  global_info_.try_frozen_version_.update(updater, gz, 2);
 | 
						|
  global_info_.global_broadcast_version_.update(updater, gz, 2);
 | 
						|
 | 
						|
  zone_info.broadcast_version_.update(updater, zone, 2);
 | 
						|
  zone_info.last_merged_version_.update(updater, zone, 2);
 | 
						|
  zone_info.suspend_merging_.update(updater, zone, 1);
 | 
						|
 | 
						|
  updater.end(true);
 | 
						|
 | 
						|
  ObZoneLeaseInfo lease_info;
 | 
						|
  lease_info.zone_ = zone;
 | 
						|
  ret = ObZoneTableOperation::get_zone_lease_info(db_initer_.get_sql_proxy(), lease_info);
 | 
						|
  ASSERT_EQ(OB_SUCCESS, ret);
 | 
						|
  ASSERT_EQ(4, lease_info.lease_info_version_);
 | 
						|
  ASSERT_EQ(3, lease_info.config_version_);
 | 
						|
  ASSERT_EQ(2, lease_info.broadcast_version_);
 | 
						|
  ASSERT_EQ(2, lease_info.last_merged_version_);
 | 
						|
  ASSERT_TRUE(lease_info.suspend_merging_);
 | 
						|
}
 | 
						|
 | 
						|
} // end namespace share
 | 
						|
} // end namespace oceanbase
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
  oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | 
						|
  OB_LOGGER.set_log_level("INFO");
 | 
						|
  testing::InitGoogleTest(&argc, argv);
 | 
						|
  oceanbase::common::ObClusterVersion::get_instance().init(CLUSTER_VERSION_2200);
 | 
						|
  return RUN_ALL_TESTS();
 | 
						|
}
 |