Files
oceanbase/mittest/mtlenv/storage/test_transfer_barrier.cpp

178 lines
6.2 KiB
C++

// owner: muwei.ym
// owner group: storage_ha
/**
* 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 STORAGE
#include <gmock/gmock.h>
#define protected public
#define private public
#include "storage/test_dml_common.h"
using namespace oceanbase::common;
using namespace oceanbase::share;
using namespace oceanbase::share::schema;
namespace oceanbase
{
namespace storage
{
class TestTransferBarrier : public ::testing::Test
{
public:
TestTransferBarrier();
virtual ~TestTransferBarrier() = default;
static void SetUpTestCase();
static void TearDownTestCase();
virtual void SetUp() override;
virtual void TearDown() override;
};
TestTransferBarrier::TestTransferBarrier()
{
}
void TestTransferBarrier::SetUpTestCase()
{
int ret = OB_SUCCESS;
ret = MockTenantModuleEnv::get_instance().init();
ASSERT_EQ(OB_SUCCESS, ret);
}
void TestTransferBarrier::TearDownTestCase()
{
MockTenantModuleEnv::get_instance().destroy();
}
void TestTransferBarrier::SetUp()
{
}
void TestTransferBarrier::TearDown()
{
}
TEST_F(TestTransferBarrier, test_transfer_barrier_redo)
{
int ret = OB_SUCCESS;
logservice::ObReplayBarrierType barrier_flag = logservice::ObReplayBarrierType::NO_NEED_BARRIER;
const ObTxLogType log_type = ObTxLogType::TX_MULTI_DATA_SOURCE_LOG;
//PRE_BARRIER
//START_TRANSFER_OUT
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_OUT);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::PRE_BARRIER);
//START_TRANSFER_OUT_PREPARE
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_OUT_PREPARE);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::PRE_BARRIER);
//FINISH_TRANSFER_OUT
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::FINISH_TRANSFER_OUT);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::PRE_BARRIER);
//START_TRANSFER_IN
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_IN);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//STRICT_BARRIER
//FINISH_TRANSFER_IN
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::FINISH_TRANSFER_IN);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//START_TRANSFER_OUT_V2
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_OUT_V2);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//TRANSFER_MOVE_TX_CTX
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::TRANSFER_MOVE_TX_CTX);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
}
TEST_F(TestTransferBarrier, test_transfer_barrier_before_prepare)
{
int ret = OB_SUCCESS;
logservice::ObReplayBarrierType barrier_flag = logservice::ObReplayBarrierType::NO_NEED_BARRIER;
const ObTxLogType log_type = ObTxLogType::TX_COMMIT_INFO_LOG;
//STRICT_BARRIER
//START_TRANSFER_IN
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_IN);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
}
TEST_F(TestTransferBarrier, test_transfer_barrier_before_commit)
{
int ret = OB_SUCCESS;
logservice::ObReplayBarrierType barrier_flag = logservice::ObReplayBarrierType::NO_NEED_BARRIER;
const ObTxLogType log_type = ObTxLogType::TX_COMMIT_LOG;
//STRICT_BARRIER
//START_TRANSFER_IN
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_IN);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//START_TRANSFER_OUT_V2
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_OUT_V2);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//TRANSFER_MOVE_TX_CTX
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::TRANSFER_MOVE_TX_CTX);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//TRANSFER_MOVE_TX_CTX
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::TRANSFER_MOVE_TX_CTX);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
}
TEST_F(TestTransferBarrier, test_transfer_barrier_before_abort)
{
int ret = OB_SUCCESS;
logservice::ObReplayBarrierType barrier_flag = logservice::ObReplayBarrierType::NO_NEED_BARRIER;
const ObTxLogType log_type = ObTxLogType::TX_ABORT_LOG;
//STRICT_BARRIER
//START_TRANSFER_IN
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_IN);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//START_TRANSFER_OUT_V2
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::START_TRANSFER_OUT_V2);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//TRANSFER_MOVE_TX_CTX
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::TRANSFER_MOVE_TX_CTX);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
//TRANSFER_MOVE_TX_CTX
barrier_flag = ObTxLogTypeChecker::need_replay_barrier(log_type, ObTxDataSourceType::TRANSFER_MOVE_TX_CTX);
ASSERT_EQ(barrier_flag, logservice::ObReplayBarrierType::STRICT_BARRIER);
}
} // namespace storage
} // namespace oceanbase
int main(int argc, char **argv)
{
system("rm -f test_transfer_barrier.log*");
OB_LOGGER.set_file_name("test_transfer_barrier.log", true);
OB_LOGGER.set_log_level("INFO");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}