Files
oceanbase/tools/obcdc/src/ob_log_part_trans_parser.h
2022-03-25 18:10:38 +08:00

119 lines
3.7 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.
*/
#ifndef OCEANBASE_LIBOBLOG_OB_LOG_PART_TRANS_PARSER_H_
#define OCEANBASE_LIBOBLOG_OB_LOG_PART_TRANS_PARSER_H_
#include "lib/utility/ob_macro_utils.h"
#include "ob_log_tenant.h" // ObLogTenant
#include <stdint.h>
namespace oceanbase
{
namespace liboblog
{
class PartTransTask;
class IObLogPartTransParser
{
public:
virtual ~IObLogPartTransParser() {}
enum { DATA_OP_TIMEOUT = 200 * 1000 };
public:
virtual int parse(PartTransTask &task, volatile bool &stop_flag) = 0;
virtual int parse(ObLogEntryTask &task, volatile bool &stop_flag) = 0;
};
////////////////////////////////////// ObLogPartTransParser //////////////////////////////////////
// thread safe
class MutatorRow;
class IObLogBRPool;
class IObLogMetaManager;
class ObLogPartTransParser : public IObLogPartTransParser
{
public:
ObLogPartTransParser();
virtual ~ObLogPartTransParser();
public:
virtual int parse(PartTransTask &task, volatile bool &stop_flag);
virtual int parse(ObLogEntryTask &task, volatile bool &stop_flag);
public:
int init(IObLogBRPool *br_pool,
IObLogMetaManager *meta_manager,
const int64_t cluster_id);
void destroy();
private:
bool is_rollback_savepoint_stmt_(MutatorRow &row) const
{
return row.is_rollback_stmt();
}
int handle_ddl_part_rollback_savepoint_(const uint64_t row_index,
PartTransTask &part_trans_task,
MutatorRow &row);
int handle_dml_part_rollback_savepoint_(const uint64_t row_index,
PartTransTask &part_trans_task,
ObLogEntryTask &log_entry_task,
MutatorRow &row);
int parse_ddl_redo_log_(PartTransTask &task, volatile bool &stop_flag);
int parse_stmts_(ObLogTenant *tenant,
const char *redo_data,
const int64_t redo_data_len,
ObLogEntryTask &redo_log_entry_task,
PartTransTask &task,
uint64_t &row_index,
volatile bool &stop_flag);
// 1. Non-PG partitions do not filter row data for now. TODO: Turn on later
// 2. For PG partitions, filter out non-whitelisted and common index data based on TableIDCache filtering
// 3. Do not filter DDL partition data to avoid transaction data and DDL data dependency
int filter_row_data_(ObLogTenant *tenant,
const char *redo_data,
const int64_t redo_data_len,
const int64_t cur_pos,
PartTransTask &task,
bool &need_filter,
int32_t &row_size,
volatile bool &stop_flag);
// DDL data/non-PG partitioned data all need to be deserialized in whole rows, no filtering
bool should_not_filter_row_(PartTransTask &task);
int parse_ddl_stmts_(const uint64_t row_index, MutatorRow &row, PartTransTask &task);
int parse_dml_stmts_(const uint64_t row_index,
MutatorRow &row,
ObLogEntryTask &redo_log_entry_task,
PartTransTask &part_trans_task,
const bool is_rollback = false);
int64_t get_row_seq_(PartTransTask &task, MutatorRow &row) const;
private:
bool inited_;
IObLogBRPool *br_pool_;
IObLogMetaManager *meta_manager_;
// The cluster ID of this cluster
// Set as the unique ID of the DDL
int64_t cluster_id_;
private:
DISALLOW_COPY_AND_ASSIGN(ObLogPartTransParser);
};
} /* liboblog */
} /* oceanbase */
#endif