Files
oceanbase/mittest/simple_server/rootservice/test_ls_recovery_stat.cpp

116 lines
3.8 KiB
C++

// owner: msy164651
// owner group: rs
/**
* 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 <gmock/gmock.h>
#define private public
#define protected public
#include "env/ob_simple_cluster_test_base.h"
namespace oceanbase
{
using namespace unittest;
using namespace share;
using namespace common;
namespace rootserver
{
using ::testing::_;
using ::testing::Invoke;
using ::testing::Return;
class TestLSRecoveryGuard : public unittest::ObSimpleClusterTestBase
{
public:
TestLSRecoveryGuard() : unittest::ObSimpleClusterTestBase("test_ls_recovery_stat") {}
protected:
uint64_t tenant_id_;
};
TEST_F(TestLSRecoveryGuard, sys_recovery_guard)
{
int ret = OB_SUCCESS;
{
//不init直接析构
ObLSRecoveryGuard guard;
}
{
//init 系统租户,析构
ObLSRecoveryGuard guard;
ASSERT_EQ(OB_SUCCESS, guard.init(OB_SYS_TENANT_ID, SYS_LS));
}
{
//init不存在的租户,或者日志流
ObLSRecoveryGuard guard;
ASSERT_EQ(OB_TENANT_NOT_IN_SERVER, guard.init(1002, SYS_LS));
}
}
TEST_F(TestLSRecoveryGuard, user_recovery_guard)
{
int ret = OB_SUCCESS;
ASSERT_EQ(OB_SUCCESS, create_tenant());
tenant_id_ = 1002;
SCN readable_scn;
palf::LogConfigVersion config_version;
{
ObLSRecoveryGuard guard;
ObLSID ls_id(10000000);
ASSERT_EQ(OB_LS_NOT_EXIST, guard.init(tenant_id_, ls_id));
}
{
ObLSRecoveryGuard guard;
//加锁成功后,不在汇报,但是可以在统计
ASSERT_EQ(OB_SUCCESS, guard.init(tenant_id_, SYS_LS, 300 * 1000));
readable_scn = guard.ls_recovery_stat_->readable_scn_upper_limit_;
//内存中的scn还是可以推高的
SCN readable_scn_memory = guard.ls_recovery_stat_->replicas_scn_.at(0).get_readable_scn();
config_version = guard.ls_recovery_stat_->config_version_in_inner_;
ASSERT_EQ(1, guard.ls_recovery_stat_->ref_cnt_);
ObLSRecoveryGuard guard1;
//不能加锁成功
ASSERT_EQ(OB_EAGAIN, guard1.init(tenant_id_, SYS_LS, 2 * 1000 * 1000));
ASSERT_EQ(OB_INIT_TWICE, guard.init(tenant_id_, SYS_LS));
ASSERT_EQ(1, guard.ls_recovery_stat_->ref_cnt_);
ASSERT_EQ(OB_SUCCESS, guard.ls_recovery_stat_->reset_inner_readable_scn());
usleep(3000 * 1000);//sleep 300ms,应该设置成最新
ASSERT_EQ(readable_scn.get_val_for_sql(), guard.ls_recovery_stat_->readable_scn_upper_limit_.get_val_for_sql());
ASSERT_NE(readable_scn_memory.get_val_for_sql(), guard.ls_recovery_stat_->replicas_scn_.at(0).readable_scn_.get_val_for_sql());
}
//释放后,可以推过
usleep(3000 * 1000);
{
ObLSRecoveryGuard guard;
ASSERT_EQ(OB_SUCCESS, guard.init(tenant_id_, SYS_LS, 300 * 1000));
ASSERT_NE(readable_scn.get_val_for_sql(), guard.ls_recovery_stat_->readable_scn_upper_limit_.get_val_for_sql());
readable_scn = guard.ls_recovery_stat_->readable_scn_upper_limit_;
ASSERT_EQ(OB_SUCCESS, guard.ls_recovery_stat_->reset_inner_readable_scn());
ASSERT_EQ(OB_NEED_RETRY, guard.ls_recovery_stat_->set_inner_readable_scn(config_version,readable_scn, true));
ASSERT_EQ(OB_SUCCESS, guard.ls_recovery_stat_->set_inner_readable_scn(config_version, readable_scn, false));
}
}
} // namespace share
} // namespace oceanbase
int main(int argc, char **argv)
{
oceanbase::unittest::init_log_and_gtest(argc, argv);
OB_LOGGER.set_log_level("INFO");
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}