[CP] Fix start transfer in is not pre barrier in redo stage bug.
This commit is contained in:
@ -30,6 +30,8 @@ storage_dml_unittest(test_tablet_aggregated_info test_tablet_aggregated_info.cpp
|
||||
# storage_unittest(test_speed_limit test_speed_limit.cpp)
|
||||
storage_dml_unittest(test_tablet_block_id_list test_tablet_block_id_list.cpp)
|
||||
storage_dml_unittest(test_ls_tablet_info_writer_and_reader test_ls_tablet_info_writer_and_reader.cpp)
|
||||
storage_dml_unittest(test_transfer_barrier test_transfer_barrier.cpp)
|
||||
|
||||
|
||||
add_subdirectory(checkpoint)
|
||||
add_subdirectory(blocksstable)
|
||||
|
||||
187
mittest/mtlenv/storage/test_transfer_barrier.cpp
Normal file
187
mittest/mtlenv/storage/test_transfer_barrier.cpp
Normal file
@ -0,0 +1,187 @@
|
||||
/**
|
||||
* 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 <gtest/gtest.h>
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
#define protected public
|
||||
#define private public
|
||||
|
||||
#include "storage/schema_utils.h"
|
||||
#include "storage/ob_storage_schema.h"
|
||||
#include "storage/blocksstable/ob_sstable_meta.h"
|
||||
#include "storage/ls/ob_ls.h"
|
||||
#include "storage/meta_mem/ob_meta_obj_struct.h"
|
||||
#include "storage/meta_mem/ob_tenant_meta_mem_mgr.h"
|
||||
#include "storage/tablet/ob_tablet_meta.h"
|
||||
#include "storage/tablet/ob_tablet_table_store.h"
|
||||
#include "storage/tx_storage/ob_ls_service.h"
|
||||
#include "mtlenv/mock_tenant_module_env.h"
|
||||
#include "storage/test_dml_common.h"
|
||||
#include "storage/column_store/ob_column_oriented_sstable.h"
|
||||
#include "storage/ob_storage_schema_util.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::PRE_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();
|
||||
}
|
||||
@ -39,7 +39,8 @@ ObTxLogTypeChecker::need_replay_barrier(const ObTxLogType log_type,
|
||||
|| data_source_type == ObTxDataSourceType::UNBIND_TABLET_NEW_MDS
|
||||
|| data_source_type == ObTxDataSourceType::START_TRANSFER_OUT
|
||||
|| data_source_type == ObTxDataSourceType::START_TRANSFER_OUT_PREPARE
|
||||
|| data_source_type == ObTxDataSourceType::FINISH_TRANSFER_OUT) {
|
||||
|| data_source_type == ObTxDataSourceType::FINISH_TRANSFER_OUT
|
||||
|| data_source_type == ObTxDataSourceType::START_TRANSFER_IN) {
|
||||
|
||||
barrier_flag = logservice::ObReplayBarrierType::PRE_BARRIER;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user