oceanbase/unittest/share/test_unit_getter.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

202 lines
7.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 RS
#include "gtest/gtest.h"
#include "lib/stat/ob_session_stat.h"
#include "../share/schema/db_initializer.h"
#include "unit_info_builder.h"
#include "share/config/ob_server_config.h"
#include "share/inner_table/ob_inner_table_schema.h"
#include "share/ob_unit_getter.h"
namespace oceanbase
{
using namespace common;
using namespace share::schema;
using namespace share::host;
namespace share
{
class TestUnitGetter : public ::testing::Test
{
public:
TestUnitGetter() {}
virtual ~TestUnitGetter() {}
virtual void SetUp();
virtual void TearDown() {}
protected:
void check_unit(const ObUnit &l, const ObUnit &r);
void check_config(const ObUnitConfig &l, const ObUnitConfig &r);
void check_pool(const ObResourcePool &l, const ObResourcePool &r);
DBInitializer db_initer_;
};
void TestUnitGetter::check_unit(const ObUnit &l, const ObUnit &r)
{
ASSERT_EQ(l.unit_id_, r.unit_id_);
ASSERT_EQ(l.resource_pool_id_, r.resource_pool_id_);
ASSERT_EQ(l.zone_, r.zone_);
ASSERT_EQ(l.server_, r.server_);
ASSERT_EQ(l.migrate_from_server_, r.migrate_from_server_);
}
void TestUnitGetter::check_config(const ObUnitConfig &l, const ObUnitConfig &r)
{
// only check resource
ASSERT_EQ(l.max_cpu_, r.max_cpu_);
ASSERT_EQ(l.max_memory_, r.max_memory_);
ASSERT_EQ(l.max_iops_, r.max_iops_);
ASSERT_EQ(l.log_disk_size_, r.log_disk_size_);
ASSERT_EQ(l.max_session_num_, r.max_session_num_);
}
void TestUnitGetter::check_pool(const ObResourcePool &l, const ObResourcePool &r)
{
ASSERT_EQ(l.resource_pool_id_, r.resource_pool_id_);
ASSERT_EQ(l.name_, r.name_);
ASSERT_EQ(l.unit_count_, r.unit_count_);
ASSERT_EQ(l.unit_config_id_, r.unit_config_id_);
ASSERT_EQ(l.tenant_id_, r.tenant_id_);
ASSERT_EQ(l.zone_list_.count(), r.zone_list_.count());
for (int64_t i = 0; i < l.zone_list_.count(); ++i) {
ASSERT_EQ(l.zone_list_.at(i), r.zone_list_.at(i));
}
}
void TestUnitGetter::SetUp()
{
ASSERT_EQ(OB_SUCCESS, db_initer_.init());
const bool only_core_tables = false;
ASSERT_EQ(OB_SUCCESS, db_initer_.create_system_table(only_core_tables));
ASSERT_EQ(OB_SUCCESS, db_initer_.fill_sys_stat_table());
}
TEST_F(TestUnitGetter, basic)
{
UnitInfoBuilder builder(db_initer_.get_sql_proxy());
ObArray<ObZone> zone_list;
ASSERT_EQ(OB_SUCCESS, zone_list.push_back("zone1"));
builder.add_config(1, 50).add_config(2, 40);
builder.add_pool(1, 2, 1, zone_list).add_pool(2, 2, 2, zone_list);
builder.add_unit(1, 1, 1, A).add_unit(2, 1, 2, B)
.add_unit(3, 2, 1, A).add_unit(4, 2, 1, B);
ASSERT_EQ(OB_SUCCESS, builder.write_table());
ObIArray<ObUnitConfig> &configs = builder.get_configs();
ObUnitInfoGetter getter;
ASSERT_EQ(OB_SUCCESS, getter.init(db_initer_.get_sql_proxy()));
ObArray<ObUnitInfoGetter::ObTenantConfig> tenant_configs;
int ret = getter.get_server_tenant_configs(A, tenant_configs);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(1, tenant_configs.count());
ObUnitConfig sum_config;
sum_config.reset();
sum_config += configs.at(0);
sum_config += configs.at(1);
ASSERT_EQ(tenant_configs.at(0).tenant_id_, OB_SYS_TENANT_ID);
check_config(tenant_configs.at(0).config_, sum_config);
tenant_configs.reuse();
ASSERT_EQ(OB_SUCCESS, getter.get_server_tenant_configs(E, tenant_configs));
ObArray<ObUnitInfoGetter::ObServerConfig> server_configs;
ASSERT_EQ(OB_SUCCESS, getter.get_tenant_server_configs(OB_SYS_TENANT_ID, server_configs));
ASSERT_EQ(3, server_configs.count()); //include pre_server E
ASSERT_EQ(A, server_configs.at(0).server_);
check_config(configs.at(0) + configs.at(1), server_configs.at(0).config_);
ASSERT_EQ(E, server_configs.at(1).server_);
check_config(configs.at(0) + configs.at(1) + configs.at(0) + configs.at(1), server_configs.at(1).config_);
ASSERT_EQ(B, server_configs.at(2).server_);
check_config(configs.at(0) + configs.at(1), server_configs.at(2).config_);
}
TEST_F(TestUnitGetter, check_tenant_small)
{
UnitInfoBuilder builder(db_initer_.get_sql_proxy());
ObArray<ObZone> zone_list;
ASSERT_EQ(OB_SUCCESS, zone_list.push_back("zone1"));
builder.add_config(1, 50);
builder.add_pool(1, 1, 1, zone_list, 1) // invalid pool, change unit_count zero with sql then
.add_pool(2, 2, 1, zone_list, 2) // pool with unit_count 2
.add_pool(3, 1, 1, zone_list, 3) // big tenant with two pools
.add_pool(4, 1, 1, zone_list, 3)
.add_pool(5, 1, 1, zone_list, 4); // small tenant
ASSERT_EQ(OB_SUCCESS, builder.write_table());
int64_t affected_rows = 0;
ASSERT_EQ(OB_SUCCESS, db_initer_.get_sql_proxy().write(
"update __all_resource_pool set unit_count = 0 where resource_pool_id = 1", affected_rows));
ASSERT_EQ(1, affected_rows);
ObUnitInfoGetter getter;
bool small_tenant = true;
ASSERT_EQ(OB_NOT_INIT, getter.check_tenant_small(1, small_tenant));
ASSERT_EQ(OB_SUCCESS, getter.init(db_initer_.get_sql_proxy()));
ASSERT_EQ(OB_INVALID_ARGUMENT, getter.check_tenant_small(OB_INVALID_ID, small_tenant));
ASSERT_EQ(OB_ERR_UNEXPECTED, getter.check_tenant_small(1, small_tenant));
ASSERT_EQ(OB_TENANT_NOT_EXIST, getter.check_tenant_small(10, small_tenant));
ASSERT_EQ(OB_SUCCESS, getter.check_tenant_small(2, small_tenant));
ASSERT_FALSE(small_tenant);
ASSERT_EQ(OB_SUCCESS, getter.check_tenant_small(3, small_tenant));
ASSERT_FALSE(small_tenant);
ASSERT_EQ(OB_SUCCESS, getter.check_tenant_small(4, small_tenant));
ASSERT_TRUE(small_tenant);
}
TEST_F(TestUnitGetter, unit_stat)
{
UnitInfoBuilder builder(db_initer_.get_sql_proxy());
ObArray<ObZone> zone_list;
ObZone zone("zone1");
ObAddr empty_server;
ASSERT_EQ(OB_SUCCESS, zone_list.push_back("zone1"));
builder.add_config(1, 50).add_config(2, 40);
builder.add_pool(1, 2, 1, zone_list, 1).add_pool(2, 2, 2, zone_list, 2)
.add_pool(3, 1, 1, zone_list, 3);
builder.add_unit(1, 1, 1, A, zone, empty_server).add_unit(2, 1, 2, B)
.add_unit(3, 2, 1, A, zone, E).add_unit(4, 3, 1, D, zone, A);
ASSERT_EQ(OB_SUCCESS, builder.write_table());
ObUnitInfoGetter getter;
ASSERT_EQ(OB_SUCCESS, getter.init(db_initer_.get_sql_proxy()));
ObArray<ObUnitInfoGetter::ObTenantConfig> tenant_configs;
int ret = getter.get_server_tenant_configs(A, tenant_configs);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(3, tenant_configs.count());
for (int64_t i = 0; i < tenant_configs.count(); i++) {
if (tenant_configs.at(i).tenant_id_ == 1) {
ASSERT_EQ(ObUnitInfoGetter::UNIT_NORMAL, tenant_configs.at(i).unit_stat_);
} else if (tenant_configs.at(i).tenant_id_ == 2) {
ASSERT_EQ(ObUnitInfoGetter::UNIT_MIGRATE_IN, tenant_configs.at(i).unit_stat_);
} else if (tenant_configs.at(i).tenant_id_ == 3) {
ASSERT_EQ(ObUnitInfoGetter::UNIT_MIGRATE_OUT, tenant_configs.at(i).unit_stat_);
} else {
ASSERT_EQ(OB_SUCCESS, 1);
}
}
}
}//end namespace share
}//end namespace oceanbase
int main(int argc, char **argv)
{
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
::testing::InitGoogleTest(&argc,argv);
oceanbase::common::ObClusterVersion::get_instance().init(CLUSTER_VERSION_2200);
return RUN_ALL_TESTS();
}