921 lines
36 KiB
C++
921 lines
36 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.
|
|
*
|
|
* This file defines test_ob_cdc_part_trans_resolver.cpp
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX OBLOG
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "log_generator.h" // must at last of header list
|
|
#define private public
|
|
#include "logservice/libobcdc/src/ob_cdc_part_trans_resolver.h"
|
|
#undef private
|
|
#include "share/ob_define.h"
|
|
#include "storage/ob_storage_log_type.h"
|
|
#include "storage/tx/ob_trans_log.h"
|
|
#include "logservice/logfetcher/ob_log_fetch_stat_info.h"
|
|
#include "logservice/libobcdc/src/ob_log_utils.h"
|
|
#include "logservice/libobcdc/src/ob_log_ls_fetch_ctx.h"
|
|
#include "logservice/libobcdc/src/ob_log_ls_fetch_mgr.h"
|
|
#include "logservice/libobcdc/src/ob_log_entry_task_pool.h"
|
|
#include "logservice/libobcdc/src/ob_log_part_progress_controller.h"
|
|
#include "logservice/libobcdc/src/ob_log_part_trans_resolver_factory.h"
|
|
#include "logservice/libobcdc/src/ob_log_sys_ls_task_handler.h"
|
|
#include "logservice/libobcdc/src/ob_log_cluster_id_filter.h"
|
|
#include "logservice/libobcdc/src/ob_log_committer.h"
|
|
#include "logservice/libobcdc/src/ob_log_fetcher_dispatcher.h"
|
|
#include "logservice/libobcdc/src/ob_log_instance.h"
|
|
#include "logservice/libobcdc/src/ob_log_resource_collector.h"
|
|
|
|
using namespace oceanbase;
|
|
using namespace common;
|
|
using namespace libobcdc;
|
|
using namespace transaction;
|
|
using namespace storage;
|
|
using namespace logfetcher;
|
|
|
|
#define PREPARE_ENV(tenant_id, ls_id, tx_id, cluster_id) \
|
|
bool stop_flag = false; \
|
|
logservice::TenantLSID tls_id(tenant_id, share::ObLSID(ls_id)); \
|
|
EXPECT_TRUE(tls_id.is_valid()); \
|
|
IObCDCPartTransResolver::MissingLogInfo missing_info; \
|
|
logfetcher::TransStatInfo tsi; \
|
|
int64_t start_ts_ns = 1; \
|
|
palf::LSN start_lsn(0); \
|
|
EXPECT_TRUE(start_lsn.is_valid());
|
|
|
|
|
|
#define GET_LS_FETCH_MGR(ls_fetch_mgr) \
|
|
ObLogInstance *instance = ObLogInstance::get_instance(); \
|
|
ObConcurrentFIFOAllocator fifo_allocator; \
|
|
PartProgressController progress_controller; \
|
|
EXPECT_EQ(OB_SUCCESS, progress_controller.init(10)); \
|
|
ObLogPartTransResolverFactory resolver_factory; \
|
|
ObLogTransTaskPool<PartTransTask> task_pool; \
|
|
EXPECT_EQ(OB_SUCCESS, fifo_allocator.init(16 * _G_, 16 * _M_, OB_MALLOC_NORMAL_BLOCK_SIZE)); \
|
|
EXPECT_EQ(OB_SUCCESS, task_pool.init(&fifo_allocator, PREALLOC_POOL_SIZE, true, PREALLOC_PAGE_COUNT)); \
|
|
ObLogEntryTaskPool log_entry_task_pool; \
|
|
EXPECT_EQ(OB_SUCCESS, log_entry_task_pool.init(10/* fixed_log_entry_task_count */)); \
|
|
MockFetcherDispatcher fetcher_dispatcher; \
|
|
MockResourceCollector resource_collector; \
|
|
instance->resource_collector_ = &resource_collector; \
|
|
ObLogSysLsTaskHandler sys_ls_handler; \
|
|
ObLogCommitter committer; \
|
|
EXPECT_EQ(OB_SUCCESS, fetcher_dispatcher.init(&sys_ls_handler, &committer, 0)); \
|
|
ObLogClusterIDFilter cluster_id_filter; \
|
|
const char *cluster_id_black_list = "2147473648"; \
|
|
double a = 1.0; \
|
|
void *fetcher = &a; \
|
|
EXPECT_EQ(OB_SUCCESS, cluster_id_filter.init(cluster_id_black_list, 2147473648, 2147483647)); \
|
|
EXPECT_EQ(OB_SUCCESS, resolver_factory.init(task_pool, log_entry_task_pool, fetcher_dispatcher, cluster_id_filter)); \
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_mgr.init(1, progress_controller, resolver_factory, fetcher));
|
|
|
|
|
|
#define PREPARE_LS_FETCH_CTX() \
|
|
const uint64_t tenant_id = 1002; /*should be user tenant but not meta_tenant or sys_tenant*/ \
|
|
const int64_t ls_id = 1001; \
|
|
const int64_t tx_id = 111111; \
|
|
const uint64_t cluster_id = 1; \
|
|
PREPARE_ENV(tenant_id, ls_id, tx_id, cluster_id); \
|
|
ObLogLSFetchMgr ls_fetch_mgr; \
|
|
GET_LS_FETCH_MGR(ls_fetch_mgr); \
|
|
LSFetchCtx *ls_fetch_ctx = NULL; \
|
|
ObLogFetcherStartParameters start_paras; \
|
|
start_paras.reset(start_ts_ns, start_lsn); \
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_mgr.add_ls(tls_id, start_paras, false, \
|
|
ClientFetchingMode::FETCHING_MODE_INTEGRATED, "|")); \
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_mgr.get_ls_fetch_ctx(tls_id, ls_fetch_ctx)); \
|
|
ObTxLogGenerator log_generator(tenant_id, ls_id, tx_id, cluster_id);
|
|
|
|
|
|
#define GET_PART_TRANS_TASK() \
|
|
ObCDCPartTransResolver *resolver = static_cast<ObCDCPartTransResolver*>(ls_fetch_ctx->get_part_trans_resolver()); \
|
|
PartTransTask *part_trans_task = NULL; \
|
|
EXPECT_EQ(OB_SUCCESS, resolver->obtain_task_(tx_id, part_trans_task, false));
|
|
|
|
|
|
#define DESTROY_OBLOG_INSTANCE() \
|
|
instance->resource_collector_ = NULL; \
|
|
ObLogInstance::destroy_instance();
|
|
|
|
namespace oceanbase
|
|
{
|
|
namespace libobcdc
|
|
{
|
|
class MockFetcherDispatcher : public ObLogFetcherDispatcher
|
|
{
|
|
virtual int dispatch(PartTransTask &task, volatile bool &stop_flag) override
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
};
|
|
class MockResourceCollector : public ObLogResourceCollector
|
|
{
|
|
virtual int revert(PartTransTask *task)
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
};
|
|
}
|
|
namespace unittest
|
|
{
|
|
|
|
// Task Pool
|
|
static const int64_t PREALLOC_POOL_SIZE = 10 * 1024;
|
|
static const int64_t TRANS_TASK_BLOCK_SIZE = 4 * 1024 *1024;
|
|
static const int64_t PREALLOC_PAGE_COUNT = 1024;
|
|
|
|
// test trans count
|
|
static const int64_t TRANS_COUNT = 100;
|
|
// redo log count
|
|
static const int64_t TRANS_REDO_LOG_COUNT = 100;
|
|
|
|
void call_sort_and_unique_missing_log_ids(IObCDCPartTransResolver::MissingLogInfo &missing_info)
|
|
{
|
|
LOG_DEBUG("MISSING LOG [BEGIN]", K(missing_info));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.sort_and_unique_missing_log_lsn());
|
|
LOG_DEBUG("MISSING LOG [END]", K(missing_info));
|
|
}
|
|
|
|
TEST(ObCDCPartTransResolver, test_misslog_info_basic)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
IObCDCPartTransResolver::MissingLogInfo missing_info;
|
|
ObLogLSNArray &missing_log_id = missing_info.get_miss_redo_lsn_arr();
|
|
|
|
// prepare data
|
|
palf::LSN lsn_1(1);
|
|
palf::LSN lsn_2(2);
|
|
palf::LSN lsn_3(3);
|
|
palf::LSN lsn_4(4);
|
|
palf::LSN lsn_5(5);
|
|
palf::LSN record_lsn(6);
|
|
ObLogLSNArray local_lsn_arr;
|
|
local_lsn_arr.reset();
|
|
local_lsn_arr.push_back(lsn_1);
|
|
local_lsn_arr.push_back(lsn_2);
|
|
local_lsn_arr.push_back(lsn_3);
|
|
local_lsn_arr.push_back(lsn_4);
|
|
|
|
// 1. one miss log with id 1
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
call_sort_and_unique_missing_log_ids(missing_info);
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
|
|
// 2. two miss log with id 1
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
call_sort_and_unique_missing_log_ids(missing_info);
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
|
|
// 3. repeatable miss log with id 1
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
call_sort_and_unique_missing_log_ids(missing_info);
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
|
|
// 4. multi repeatable miss log
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_2));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_2));
|
|
EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_2));
|
|
call_sort_and_unique_missing_log_ids(missing_info);
|
|
EXPECT_EQ(2, missing_info.get_total_misslog_cnt());
|
|
for (int64_t idx=0; OB_SUCC(ret) && idx < missing_log_id.count(); ++idx) {
|
|
EXPECT_EQ(idx+1, missing_log_id.at(idx));
|
|
}
|
|
|
|
// // 5. multi repeatable miss log
|
|
// missing_info.reset();
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_missing_log_lsn_arr(local_lsn_arr));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(lsn_1));
|
|
// call_sort_and_unique_missing_log_ids(missing_info);
|
|
// EXPECT_EQ(2, missing_info.get_total_misslog_cnt());
|
|
// for (int64_t idx=0; OB_SUCC(ret) && idx < missing_log_id.count(); ++idx) {
|
|
// EXPECT_EQ(idx+1, missing_log_id.at(idx));
|
|
// }
|
|
|
|
// // 6. multi repeatable miss log
|
|
// missing_info.reset();
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// call_sort_and_unique_missing_log_ids(missing_info);
|
|
// EXPECT_EQ(2, missing_info.get_total_misslog_cnt());
|
|
// for (int64_t idx=0; OB_SUCC(ret) && idx < missing_log_id.count(); ++idx) {
|
|
// EXPECT_EQ(idx+1, missing_log_id.at(idx));
|
|
// }
|
|
|
|
|
|
// // 7. multi repeatable miss log
|
|
// missing_info.reset();
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// call_sort_and_unique_missing_log_ids(missing_info);
|
|
// EXPECT_EQ(4, missing_info.get_total_misslog_cnt());
|
|
// for (int64_t idx=0; OB_SUCC(ret) && idx < missing_log_id.count(); ++idx) {
|
|
// EXPECT_EQ(idx+1, missing_log_id.at(idx));
|
|
// }
|
|
|
|
// // 8. multi repeatable miss log
|
|
// missing_info.reset();
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// call_sort_and_unique_missing_log_ids(missing_info);
|
|
// EXPECT_EQ(4, missing_info.get_total_misslog_cnt());
|
|
// for (int64_t idx=0; OB_SUCC(ret) && idx < missing_log_id.count(); ++idx) {
|
|
// EXPECT_EQ(idx+1, missing_log_id.at(idx));
|
|
// }
|
|
|
|
// // 9. multi repeatable miss log
|
|
// missing_info.reset();
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(1));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(2));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(3));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// EXPECT_EQ(OB_SUCCESS, missing_info.push_back_single_miss_log_lsn(4));
|
|
// call_sort_and_unique_missing_log_ids(missing_info);
|
|
// EXPECT_EQ(4, missing_info.get_total_misslog_cnt());
|
|
// for (int64_t idx=0; OB_SUCC(ret) && idx < missing_log_id.count(); ++idx) {
|
|
// EXPECT_EQ(idx+1, missing_log_id.at(idx));
|
|
// }
|
|
}
|
|
|
|
|
|
TEST(ObCDCPartTransResolver, test_ls_fetch_ctx)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
|
|
log_generator.gen_redo_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
LOG_DEBUG("redo-0", K(log_entry), K(lsn));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
log_generator.gen_redo_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
LOG_DEBUG("redo-1", K(log_entry), K(lsn));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_commit_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
LOG_DEBUG("redo-2", K(log_entry), K(lsn));
|
|
LogEntry offline_ls_entry;
|
|
LSN offline_lsn;
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_ls_offline_log_entry(offline_ls_entry, offline_lsn));
|
|
EXPECT_EQ(OB_INVALID_DATA, ls_fetch_ctx->read_log(offline_ls_entry, offline_lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(offline_ls_entry, offline_lsn, missing_info, tsi, stop_flag));
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_mgr.remove_ls(tls_id));
|
|
EXPECT_EQ(OB_ENTRY_NOT_EXIST, ls_fetch_mgr.get_ls_fetch_ctx(tls_id, ls_fetch_ctx));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// seq1: redo + commit_info + commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq1)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_commit_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// seq2: redo | redo + commit_info + commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq2)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
|
|
log_generator.gen_redo_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_commit_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of seq2
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq2_miss)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
|
|
log_generator.gen_redo_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_commit_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry2, lsn2));
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
LOG_DEBUG("read log2", K(lsn), K(lsn2), K(missing_info));
|
|
EXPECT_TRUE(missing_info.need_reconsume_commit_log_entry());
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn, missing_info.get_miss_redo_lsn_arr().at(0));
|
|
missing_info.reset();
|
|
missing_info.set_resolving_miss_log();
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
EXPECT_EQ(0, new_miss_log.get_total_misslog_cnt());
|
|
IObCDCPartTransResolver::MissingLogInfo reconsume_miss_info;
|
|
reconsume_miss_info.set_reconsuming();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, reconsume_miss_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// seq3: redo + commit_info | commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq3)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_commit_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry2, lsn2));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
// GET_PART_TRANS_TASK();
|
|
// LOG_DEBUG("part_trans_task", KPC(part_trans_task), K(lsn), K(log_entry), K(lsn2), K(log_entry2));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(0, missing_info.get_total_misslog_cnt());
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of seq3
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq3_miss)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry, lsn));
|
|
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_commit_log();
|
|
EXPECT_EQ(OB_SUCCESS, log_generator.gen_log_entry(log_entry2, lsn2));
|
|
LOG_DEBUG("test_sp_tx_seq3_miss", K(lsn), K(log_entry), K(lsn2), K(log_entry2));
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
missing_info.set_resolving_miss_log();
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
EXPECT_EQ(0, new_miss_log.get_total_misslog_cnt());
|
|
EXPECT_TRUE(missing_info.need_reconsume_commit_log_entry());
|
|
IObCDCPartTransResolver::MissingLogInfo reconsume_miss_info;
|
|
reconsume_miss_info.set_reconsuming();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, reconsume_miss_info, tsi, stop_flag));
|
|
EXPECT_EQ(0, reconsume_miss_info.get_total_misslog_cnt());
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// seq4: redo | redo + commit_info | commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq4)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
LOG_DEBUG("test_sp_tx_seq4");
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of seq4(before commit_info_log)
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq4_miss_1)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn, missing_info.get_miss_redo_lsn_arr().at(0));
|
|
EXPECT_FALSE(missing_info.need_reconsume_commit_log_entry()); // commit_info entry is not miss_log, need reconsume
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
IObCDCPartTransResolver::MissingLogInfo reconsume_miss_info;
|
|
reconsume_miss_info.set_reconsuming();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, reconsume_miss_info, tsi, stop_flag));
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of seq4(before commit_log)
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq4_miss_2)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn2, missing_info.miss_record_or_state_log_lsn_);
|
|
EXPECT_TRUE(missing_info.need_reconsume_commit_log_entry());
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_miss_tx_log(log_entry2, lsn2, tsi, new_miss_log));
|
|
EXPECT_EQ(1, new_miss_log.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn, new_miss_log.get_miss_redo_lsn_arr().at(0));
|
|
EXPECT_FALSE(new_miss_log.need_reconsume_commit_log_entry());
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log_2;
|
|
new_miss_log_2.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log_2));
|
|
|
|
IObCDCPartTransResolver::MissingLogInfo reconsume_miss_info;
|
|
reconsume_miss_info.set_reconsuming();
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, reconsume_miss_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// seq5: redo | commit_info | commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq5)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch middle of seq5(before log_entry2)
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq5_miss)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn, missing_info.get_miss_redo_lsn_arr().at(0));
|
|
EXPECT_FALSE(missing_info.need_reconsume_commit_log_entry()); // commit_info entry is not miss_log, need reconsume
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// seq6: redo | rollback_to | redo + commit_info + commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq6)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_rollback_to_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of seq6(before log_entry3)
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq6_miss)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_rollback_to_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(2, missing_info.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn, missing_info.get_miss_redo_lsn_arr().at(0));
|
|
EXPECT_EQ(lsn2, missing_info.get_miss_redo_lsn_arr().at(1));
|
|
EXPECT_TRUE(missing_info.need_reconsume_commit_log_entry());
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
EXPECT_EQ(0, new_miss_log.get_total_misslog_cnt());
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry2, lsn2, tsi, new_miss_log));
|
|
|
|
IObCDCPartTransResolver::MissingLogInfo reconsume_miss_info;
|
|
reconsume_miss_info.set_reconsuming();
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, reconsume_miss_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// dist tx is focus on prepare log.
|
|
// dist_seq1: redo + commit_info | prepare | commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_dist)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_prepare_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of dist_seq1(before prepare)
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_dist_miss1)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_prepare_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
EXPECT_FALSE(missing_info.need_reconsume_commit_log_entry());
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
EXPECT_EQ(0, new_miss_log.get_total_misslog_cnt());
|
|
missing_info.reset();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// fetch from middle of dist_seq1(before commit)
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_dist_miss2)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
LogEntry log_entry3;
|
|
palf::LSN lsn3;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_prepare_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry3, lsn3);
|
|
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn2, missing_info.miss_record_or_state_log_lsn_);
|
|
EXPECT_TRUE(missing_info.need_reconsume_commit_log_entry());
|
|
IObCDCPartTransResolver::MissingLogInfo new_miss_log;
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_miss_tx_log(log_entry2, lsn2, tsi, new_miss_log));
|
|
EXPECT_EQ(1, new_miss_log.get_total_misslog_cnt());
|
|
EXPECT_EQ(lsn, new_miss_log.miss_record_or_state_log_lsn_);
|
|
new_miss_log.reset();
|
|
new_miss_log.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_miss_tx_log(log_entry, lsn, tsi, new_miss_log));
|
|
EXPECT_EQ(0, new_miss_log.get_total_misslog_cnt());
|
|
missing_info.reset();
|
|
missing_info.set_reconsuming();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry3, lsn3, missing_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// dist tx is focus on prepare log.
|
|
// dist_seq2: redo + commit_info + prepare | commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_dist2)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_prepare_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// dist tx is focus on prepare log.
|
|
// dist_seq3: commit_info + prepare | commit
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_dist3)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
log_generator.gen_commit_info_log();
|
|
log_generator.gen_prepare_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
// dist_seq4: commit(may occour while transfer case)
|
|
// currently disabled cause transfer is not implied yet. will add case for transfer.
|
|
TEST(ObCDCPartTransResolver, DISABLED_test_sp_tx_dist4)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
log_generator.gen_commit_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_record)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry_rc0;
|
|
palf::LSN lsn_rc0;
|
|
LogEntry log_entry1;
|
|
palf::LSN lsn1;
|
|
LogEntry log_entry_rc1;
|
|
palf::LSN lsn_rc1;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
LogEntry log_entry_rc2;
|
|
palf::LSN lsn_rc2;
|
|
// generate and log_entry below
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_record_log();
|
|
log_generator.gen_log_entry(log_entry_rc0, lsn_rc0);
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry1, lsn1);
|
|
log_generator.gen_record_log();
|
|
log_generator.gen_log_entry(log_entry_rc1, lsn_rc1);
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
log_generator.gen_record_log();
|
|
log_generator.gen_log_entry(log_entry_rc2, lsn_rc2);
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry_rc0, lsn_rc0, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry1, lsn1, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry_rc1, lsn_rc1, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry_rc2, lsn_rc2, missing_info, tsi, stop_flag));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_record_miss)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
LogEntry log_entry_rc0;
|
|
palf::LSN lsn_rc0;
|
|
LogEntry log_entry1;
|
|
palf::LSN lsn1;
|
|
LogEntry log_entry_rc1;
|
|
palf::LSN lsn_rc1;
|
|
LogEntry log_entry2;
|
|
palf::LSN lsn2;
|
|
LogEntry log_entry_rc2;
|
|
palf::LSN lsn_rc2;
|
|
// generate and log_entry below
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry, lsn);
|
|
log_generator.gen_record_log();
|
|
log_generator.gen_log_entry(log_entry_rc0, lsn_rc0);
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry1, lsn1);
|
|
log_generator.gen_record_log();
|
|
log_generator.gen_log_entry(log_entry_rc1, lsn_rc1);
|
|
log_generator.gen_redo_log();
|
|
log_generator.gen_log_entry(log_entry2, lsn2);
|
|
log_generator.gen_record_log();
|
|
log_generator.gen_log_entry(log_entry_rc2, lsn_rc2);
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry1, lsn1, missing_info, tsi, stop_flag));
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry_rc1, lsn_rc1, missing_info, tsi, stop_flag));
|
|
EXPECT_TRUE(missing_info.miss_record_or_state_log_lsn_.is_valid());
|
|
EXPECT_EQ(1, missing_info.get_total_misslog_cnt());
|
|
LOG_INFO("", K(lsn), K(lsn_rc0), K(lsn1), K(lsn_rc1), K(lsn2), K(lsn_rc2), K(missing_info));
|
|
// EXPECT_EQ(lsn, missing_info.miss_redo_or_state_lsn_arr_.at(0));
|
|
IObCDCPartTransResolver::MissingLogInfo missing_info1;
|
|
missing_info1.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_ITEM_NOT_SETTED, ls_fetch_ctx->read_log(log_entry_rc0, lsn_rc0, missing_info1, tsi, stop_flag));
|
|
EXPECT_EQ(lsn, missing_info1.get_miss_redo_lsn_arr().at(0));
|
|
IObCDCPartTransResolver::MissingLogInfo missing_info2;
|
|
missing_info2.set_resolving_miss_log();
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry, lsn, missing_info2, tsi, stop_flag));
|
|
IObCDCPartTransResolver::MissingLogInfo missing_info3;
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry2, lsn2, missing_info3, tsi, stop_flag));
|
|
EXPECT_EQ(OB_SUCCESS, ls_fetch_ctx->read_log(log_entry_rc2, lsn_rc2, missing_info3, tsi, stop_flag));
|
|
LOG_INFO("missing_infos", K(missing_info), K(missing_info1), K(missing_info2), K(missing_info3));
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
TEST(ObCDCPartTransResolver, test_sp_tx_seq_example)
|
|
{
|
|
PREPARE_LS_FETCH_CTX();
|
|
LogEntry log_entry;
|
|
palf::LSN lsn;
|
|
// generate and log_entry below
|
|
|
|
DESTROY_OBLOG_INSTANCE();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
// ObLogger::get_logger().set_mod_log_levels("ALL.*:DEBUG, TLOG.*:DEBUG");
|
|
// testing::FLAGS_gtest_filter = "DO_NOT_RUN";
|
|
system("rm -f test_ob_cdc_part_trans_resolver.log");
|
|
ObLogger &logger = ObLogger::get_logger();
|
|
bool not_output_obcdc_log = true;
|
|
logger.set_file_name("test_ob_cdc_part_trans_resolver.log", not_output_obcdc_log, false);
|
|
logger.set_log_level(OB_LOG_LEVEL_DEBUG);
|
|
logger.set_mod_log_levels("ALL.*:DEBUG;TLOG.*:DEBUG");
|
|
logger.set_enable_async_log(false);
|
|
testing::InitGoogleTest(&argc,argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|