/** * 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_UNITTEST_ENGINE_TABLE_OB_FAKE_PARTITION_SERVICE_ #define OCEANBASE_UNITTEST_ENGINE_TABLE_OB_FAKE_PARTITION_SERVICE_ #include "storage/ob_partition_service.h" #include "storage/ob_partition_service.h" #include "share/ob_scanner.h" #include "share/ob_partition_modify.h" #include "common/row/ob_row.h" namespace oceanbase { namespace sql { class ObFakeTableScanIterator : public common::ObNewRowIterator { public: ObFakeTableScanIterator() : col_num_(0) {} virtual ~ObFakeTableScanIterator() {} virtual int get_next_row(common::ObNewRow*& row); inline virtual void reset() { row_store_it_.reset(); } inline void init(const common::ObRowStore::Iterator& iter, int64_t col_num) { row_store_it_ = iter; col_num_ = col_num; } private: common::ObRowStore::Iterator row_store_it_; int64_t col_num_; private: DISALLOW_COPY_AND_ASSIGN(ObFakeTableScanIterator); }; } // namespace sql namespace storage { class ObFakePartitionServiceForSQL : public oceanbase::storage::ObPartitionService { public: ObFakePartitionServiceForSQL(); virtual ~ObFakePartitionServiceForSQL(); virtual int init(const blocksstable::ObStorageEnv& env, const common::ObAddr& self_addr, ObIPartitionComponentFactory* cp_fty, share::schema::ObMultiVersionSchemaService* schema_service, share::ObIPartitionLocationCache* location_cache, common::ObIRSCb* rs_cb, rpc::frame::ObReqTransport* req_transport); virtual int start(); virtual int destroy(); virtual void set_component_service(ObIPartitionComponentFactory& cp_fty); virtual int load_partition(const char* buf, const int64_t buf_len, int64_t& pos); virtual int replay_base_storage_log( const int64_t log_seq_num, const int64_t subcmd, const char* buf, const int64_t len, int64_t& pos); virtual int create_partition(const common::ObPartitionKey& key, const common::ObVersion data_version, const int64_t replica_num, const common::ObMemberList& mem_list); virtual int online_partition(); virtual int online_partition(const common::ObPartitionKey& pkey, const int64_t publish_version) { UNUSED(pkey); UNUSED(publish_version); return OB_SUCCESS; } virtual int remove_partition(const common::ObPartitionKey& key); virtual int remove_orphans(); virtual int freeze(); virtual int on_leader_takeover(const common::ObPartitionKey& partition_key); virtual int64_t get_min_using_file_id() const; virtual share::schema::ObMultiVersionSchemaService* get_schema_service(); virtual ObIPartitionComponentFactory* get_cp_fty(); virtual int start_trans( const uint64_t tenant_id, const transaction::ObStartTransParam& req, transaction::ObTransDesc& trans_desc); virtual int end_trans(bool is_rollback, const transaction::ObTransDesc& trans_desc); virtual int start_stmt( const uint64_t tenant_id, transaction::ObTransDesc& trans_desc, const common::ObPartitionArray& participants); virtual int end_stmt(bool is_rollback, const transaction::ObTransDesc& trans_desc); virtual int table_scan(ObTableScanParam& param, common::ObNewRowIterator*& result); virtual int revert_scan_iter(common::ObNewRowIterator* iter); virtual int delete_rows(const transaction::ObTransDesc& trans_desc, const int64_t timeout, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows); virtual int insert_rows(const transaction::ObTransDesc& trans_desc, const int64_t timeout, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows); virtual int update_rows(const transaction::ObTransDesc& trans_desc, const int64_t timeout, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, const common::ObIArray& updated_column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows); virtual int lock_rows(const transaction::ObTransDesc& trans_desc, const int64_t timeout, const common::ObPartitionKey& pkey, common::ObNewRowIterator* row_iter, const ObLockFlag lock_flag, int64_t& affected_rows); virtual int fetch_conflict_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& in_column_ids, const common::ObIArray& out_column_ids, common::ObNewRowIterator& check_row_iter, common::ObIArray& dup_row_iters); virtual int get_all_partitions(common::ObIArray& partition_list); virtual int get_partition(const common::ObPartitionKey& pkey, ObIPartitionGroup*& partition); virtual int get_partition_count(int64_t& partition_count) const; virtual bool is_empty() const; virtual int replay_redo_log( const common::ObPartitionKey& pkey, const ObStoreCtx& ctx, const int64_t ts, const char* buf, const int64_t size); virtual transaction::ObTransService* get_trans_service(); virtual clog::ObICLogMgr* get_clog_mgr(); virtual int prepare_major_freeze( const obrpc::ObPartitionList& partitions, const int64_t frozen_version, const int64_t frozen_timestamp); virtual int commit_major_freeze( const obrpc::ObPartitionList& partitions, const int64_t frozen_version, const int64_t frozen_timestamp); virtual int abort_major_freeze( const obrpc::ObPartitionList& partitions, const int64_t frozen_version, const int64_t frozen_timestamp); virtual int set_major_freeze_status( const common::ObPartitionKey& pkey, const int64_t frozen_version, const int64_t major_freeze_status); virtual int get_major_freeze_status( const common::ObPartitionKey& pkey, int64_t& frozen_version, int64_t& major_freeze_status); virtual int replay(const ObPartitionKey& partition, const char* log, const int64_t size); virtual int finish_replay(const ObPartitionKey& partition); virtual int leader_freeze_success(const ObPartitionKey& pkey, const int64_t freeze_cmd); virtual int leader_freeze_fail(const ObPartitionKey& pkey, const int64_t freeze_cmd); virtual int follower_freeze_success(const ObPartitionKey& pkey, const int64_t freeze_cmd); virtual int follower_freeze_fail(const ObPartitionKey& pkey, const int64_t freeze_cmd); virtual int submit_freeze_log_success(const int64_t cmd_type, const ObPartitionKey& pkey); virtual int get_role(const common::ObPartitionKey& pkey, common::ObRole& role) const; virtual int get_leader_curr_member_list(const common::ObPartitionKey& pkey, common::ObMemberList& member_list) const; virtual int get_active_memtable_version(const ObPartitionKey& pkey, int64_t& version); virtual int activate_tenant(const uint64_t tenant_id) { UNUSED(tenant_id); return OB_SUCCESS; } virtual int inactivate_tenant(const uint64_t tenant_id) { UNUSED(tenant_id); return OB_SUCCESS; } inline int add_row(const common::ObNewRow& row) { return scanner_.add_row(row); } inline void set_col_num(int64_t col_num) { col_num_ = col_num; } virtual int migrate_replica_batch(const obrpc::ObMigrateReplicaBatchArg& arg) { UNUSED(arg); return OB_ERROR; } //========================For ObIDataAccessService============================== virtual int table_scan(ObVTableScanParam& param, ObNewRowIterator*& result) { UNUSED(param); UNUSED(result); return OB_SUCCESS; } virtual int join_mv_scan( storage::ObTableScanParam& left_param, storage::ObTableScanParam& right_param, common::ObNewRowIterator*& result) { UNUSED(left_param); UNUSED(right_param); UNUSED(result); return OB_SUCCESS; } virtual int get_checksum_method( const common::ObPartitionKey& pkey, const int64_t snapshot_version, int64_t& checksum_method) const { UNUSED(pkey); UNUSED(snapshot_version); UNUSED(checksum_method); return OB_SUCCESS; } //========================For ObPartitionService============================== // replay the redo log. virtual int replay(const int64_t log_seq_num, const int64_t subcmd, const char* buf, const int64_t len) { UNUSED(log_seq_num); UNUSED(subcmd); UNUSED(buf); UNUSED(len); return OB_SUCCESS; } // parse the redo log to stream virtual int parse(const int64_t subcmd, const char* buf, const int64_t len, FILE* stream) { UNUSED(subcmd); UNUSED(buf); UNUSED(len); UNUSED(stream); return OB_SUCCESS; } //====================================For ObIPSCb=============================== virtual int on_leader_revoke(const common::ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int on_leader_takeover(const common::ObPartitionKey& pkey, const bool is_elected_by_changing_leader) { UNUSED(pkey); UNUSED(is_elected_by_changing_leader); return OB_SUCCESS; } virtual int on_leader_active(const common::ObPartitionKey& pkey, const bool is_elected_by_changing_leader) { UNUSED(pkey); UNUSED(is_elected_by_changing_leader); return OB_SUCCESS; } virtual int on_member_change_success(const common::ObPartitionKey& pkey, const int64_t mc_timestamp, const common::ObMemberList& prev_member_list, const common::ObMemberList& curr_member_list) { UNUSED(pkey); UNUSED(mc_timestamp); UNUSED(prev_member_list); UNUSED(curr_member_list); return OB_SUCCESS; } virtual bool is_take_over_done(const common::ObPartitionKey& pkey) const { UNUSED(pkey); return OB_SUCCESS; } virtual bool is_revoke_done(const common::ObPartitionKey& pkey) const { UNUSED(pkey); return OB_SUCCESS; } virtual bool is_tenant_active(const common::ObPartitionKey& pkey) const { UNUSED(pkey); return OB_SUCCESS; } virtual bool is_tenant_active(const uint64_t tenant_id) const { UNUSED(tenant_id); return OB_SUCCESS; } virtual int get_leader_from_loc_cache_across_cluster( const common::ObPartitionKey& pkey, common::ObAddr& leader, int64_t& cluster_id, const bool is_need_renew = false) { UNUSED(pkey); UNUSED(leader); UNUSED(is_need_renew); UNUSED(cluster_id); return OB_SUCCESS; } virtual int get_leader_from_loc_cache( const common::ObPartitionKey& pkey, common::ObAddr& leader, const bool is_need_renew = false) { UNUSED(pkey); UNUSED(leader); UNUSED(is_need_renew); return OB_SUCCESS; } virtual int handle_log_missing(const common::ObPartitionKey& pkey, const common::ObAddr& server) { UNUSED(pkey); UNUSED(server); return OB_SUCCESS; } virtual int get_server_region(const common::ObAddr& server, common::ObRegion& region) const { UNUSED(server); UNUSED(region); return OB_SUCCESS; } //====================================For ObIPSCb=============================== virtual int stop() { return OB_SUCCESS; } virtual int wait() { return OB_SUCCESS; } virtual int get_safe_publish_version(const common::ObPartitionKey& pkey, int64_t& publish_version) { UNUSED(pkey); UNUSED(publish_version); return OB_SUCCESS; } virtual bool is_election_candidate(const common::ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int create_batch_partition_groups( const common::ObIArray& batch_arg, common::ObIArray& batch_res) { UNUSED(batch_arg); UNUSED(batch_res); return OB_SUCCESS; } virtual int create_batch_pg_partitions( const common::ObIArray& batch_arg, common::ObIArray& batch_res) { UNUSED(batch_arg); UNUSED(batch_res); return OB_SUCCESS; } virtual int remove_partition_from_pg(const ObPartitionKey& pg_key, const ObPartitionKey& pkey) { UNUSED(pg_key); UNUSED(pkey); return OB_SUCCESS; } virtual int online_partition( const common::ObPartitionKey& pkey, const common::ObVersion& mem_version, const int64_t publish_version) { UNUSED(pkey); UNUSED(mem_version); UNUSED(publish_version); return OB_SUCCESS; } virtual obrpc::ObCommonRpcProxy& get_rs_rpc_proxy() { return *rs_rpc_proxy_; } virtual ObIPartitionServiceRpc& get_pts_rpc() { return *pts_rpc_; } virtual int reload_config() { return OB_SUCCESS; } virtual int check_schema_version_elapsed( const ObPartitionKey& partition, const int64_t schema_version, int64_t& max_commit_version) { UNUSED(partition); UNUSED(schema_version); UNUSED(max_commit_version); return OB_SUCCESS; } virtual int check_ctx_create_timestamp_elapsed(const common::ObPartitionKey& partition, const int64_t ts) { UNUSED(partition); UNUSED(ts); return OB_SUCCESS; } virtual int check_unique_index_valid( const common::ObPartitionKey& pkey, const uint64_t index_table_id, const int64_t schema_version) { UNUSED(pkey); UNUSED(index_table_id); UNUSED(schema_version); return OB_SUCCESS; } virtual int check_single_replica_major_sstable_exist( const common::ObPartitionKey& pkey, const uint64_t index_table_id) { UNUSED(pkey); UNUSED(index_table_id); return OB_SUCCESS; } virtual int check_all_replica_major_sstable_exist(const common::ObPartitionKey& pkey, const uint64_t index_table_id) { UNUSED(pkey); UNUSED(index_table_id); return OB_SUCCESS; } virtual int check_member_major_sstable_enough( const common::ObPartitionKey& pkey, const common::ObIArray& table_ids) { UNUSED(pkey); UNUSED(table_ids); return OB_SUCCESS; } virtual int start_trans(const uint64_t tenant_id, const uint64_t thread_id, const transaction::ObStartTransParam& req, const int64_t expired_time, const uint32_t session_id, const uint64_t proxy_session_id, transaction::ObTransDesc& trans_desc) { UNUSED(tenant_id); UNUSED(thread_id); UNUSED(req); UNUSED(expired_time); UNUSED(session_id); UNUSED(proxy_session_id); UNUSED(trans_desc); return OB_SUCCESS; } virtual int kill_query_session(const transaction::ObTransDesc& trans_desc, const int status) { UNUSED(trans_desc); UNUSED(status); return OB_SUCCESS; } virtual int get_all_partition_status(int64_t& inactive_num, int64_t& total_num) { UNUSED(inactive_num); UNUSED(total_num); return OB_SUCCESS; } virtual int end_trans(bool is_rollback, transaction::ObTransDesc& trans_desc, sql::ObIEndTransCallback& cb, const int64_t stmt_expired_time) { UNUSED(is_rollback); UNUSED(trans_desc); UNUSED(cb); UNUSED(stmt_expired_time); return OB_SUCCESS; } virtual int start_stmt(const transaction::ObStmtParam& stmt_param, const transaction::ObStmtDesc& stmt_desc, transaction::ObTransDesc& trans_desc, const common::ObPartitionLeaderArray& pla, common::ObPartitionArray& participants) { UNUSED(stmt_param); UNUSED(stmt_desc); UNUSED(trans_desc); UNUSED(pla); UNUSED(participants); return OB_SUCCESS; } virtual int extend_stmt(transaction::ObTransDesc& trans_desc, const ObPartitionLeaderArray& pla) { UNUSED(trans_desc); UNUSED(pla); return OB_SUCCESS; } virtual int end_stmt(bool is_rollback, const ObPartitionArray& cur_stmt_all_participants, const transaction::ObPartitionEpochArray& epoch_arr, const ObPartitionArray& discard_participants, const ObPartitionLeaderArray& pla, transaction::ObTransDesc& trans_desc) { UNUSED(is_rollback); UNUSED(cur_stmt_all_participants); UNUSED(epoch_arr); UNUSED(discard_participants); UNUSED(pla); UNUSED(trans_desc); return OB_SUCCESS; } virtual int start_participant(transaction::ObTransDesc& trans_desc, const common::ObPartitionArray& participants, transaction::ObPartitionEpochArray& partition_epoch_arr, const transaction::ObPartitionSchemaInfoArray& partition_schema_info_arr) { UNUSED(trans_desc); UNUSED(participants); UNUSED(partition_epoch_arr); UNUSED(partition_schema_info_arr); return OB_SUCCESS; } virtual int end_participant( bool is_rollback, transaction::ObTransDesc& trans_desc, const common::ObPartitionArray& participants) { UNUSED(is_rollback); UNUSED(trans_desc); UNUSED(participants); return OB_SUCCESS; } virtual int delete_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(row_iter); UNUSED(affected_rows); return OB_SUCCESS; } virtual int delete_row(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, const common::ObNewRow& row) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(row); return OB_SUCCESS; } virtual int put_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(row_iter); UNUSED(affected_rows); return OB_SUCCESS; } virtual int insert_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(row_iter); UNUSED(affected_rows); return OB_SUCCESS; } virtual int insert_row(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, const common::ObIArray& duplicated_column_ids, const common::ObNewRow& row, const ObInsertFlag flag, int64_t& affected_rows, common::ObNewRowIterator*& duplicated_rows) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(duplicated_column_ids); UNUSED(flag); UNUSED(affected_rows); UNUSED(duplicated_rows); UNUSED(row); return OB_SUCCESS; } virtual int revert_insert_iter(const common::ObPartitionKey& pkey, common::ObNewRowIterator* iter) { UNUSED(iter); UNUSED(pkey); return OB_SUCCESS; } virtual int update_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, const common::ObIArray& updated_column_ids, common::ObNewRowIterator* row_iter, int64_t& affected_rows) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(updated_column_ids); UNUSED(row_iter); UNUSED(affected_rows); return OB_SUCCESS; } virtual int update_row(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const common::ObPartitionKey& pkey, const common::ObIArray& column_ids, const common::ObIArray& updated_column_ids, const common::ObNewRow& old_row, const common::ObNewRow& new_row) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(column_ids); UNUSED(updated_column_ids); UNUSED(old_row); UNUSED(new_row); return OB_SUCCESS; } virtual int lock_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const int64_t abs_lock_timeout, const common::ObPartitionKey& pkey, common::ObNewRowIterator* row_iter, const ObLockFlag lock_flag, int64_t& affected_rows) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(abs_lock_timeout); UNUSED(row_iter); UNUSED(lock_flag); UNUSED(affected_rows); return OB_SUCCESS; } virtual int lock_rows(const transaction::ObTransDesc& trans_desc, const ObDMLBaseParam& dml_param, const int64_t abs_lock_timeout, const common::ObPartitionKey& pkey, const common::ObNewRow& row, const ObLockFlag lock_flag) { UNUSED(trans_desc); UNUSED(dml_param); UNUSED(pkey); UNUSED(abs_lock_timeout); UNUSED(lock_flag); UNUSED(row); return OB_SUCCESS; } virtual int get_all_partitions(ObIPartitionArrayGuard& partitions) { UNUSED(partitions); return OB_SUCCESS; } virtual int get_partition(const common::ObPartitionKey& pkey, ObIPartitionGroupGuard& guard) const { UNUSED(pkey); UNUSED(guard); return OB_SUCCESS; } virtual void revert_replay_status(ObReplayStatus* replay_status) const { UNUSED(replay_status); } virtual ObIPartitionGroupIterator* alloc_pg_iter() { return nullptr; } virtual void revert_pg_iter(ObIPartitionGroupIterator* iter) { UNUSED(iter); } virtual ObPGPartitionIterator* alloc_pg_partition_iter() { return nullptr; } virtual void revert_pg_partition_iter(ObPGPartitionIterator* iter) { UNUSED(iter); } // ========================================================================== // partition service callback function virtual int push_callback_task(const ObCbTask& task) { UNUSED(task); return OB_SUCCESS; } virtual int internal_leader_revoke(const ObCbTask& revoke_task) { UNUSED(revoke_task); return OB_SUCCESS; } virtual int async_leader_revoke(const common::ObPartitionKey& pkey, const uint32_t revoke_type) { UNUSED(pkey); UNUSED(revoke_type); return OB_SUCCESS; } virtual int internal_leader_takeover(const ObCbTask& takeover_task) { UNUSED(takeover_task); return OB_SUCCESS; } virtual int internal_leader_active(const ObCbTask& active_task) { UNUSED(active_task); return OB_SUCCESS; } virtual int raise_memstore(const ObCbTask& raise_task) { UNUSED(raise_task); return OB_SUCCESS; } // ========================================================================== // expose component virtual election::ObIElectionMgr* get_election_mgr() { return nullptr; } virtual ObPartitionSplitWorker* get_split_worker() { return nullptr; } // ========================================================================== // major/minor freeze virtual int prepare_major_freeze( const ObVersion& frozen_version, const int64_t frozen_timestamp, const int64_t schema_version) { UNUSED(frozen_version); UNUSED(frozen_timestamp); UNUSED(schema_version); return OB_SUCCESS; } virtual int commit_major_freeze( const ObVersion& frozen_version, const int64_t frozen_timestamp, const int64_t schema_version) { UNUSED(frozen_version); UNUSED(frozen_timestamp); UNUSED(schema_version); return OB_SUCCESS; } virtual int abort_major_freeze( const ObVersion& frozen_version, const int64_t frozen_timestamp, const int64_t schema_version) { UNUSED(frozen_version); UNUSED(frozen_timestamp); UNUSED(schema_version); return OB_SUCCESS; } virtual int sync_frozen_status(const ObFrozenStatus& frozen_status, const bool& force) { UNUSED(frozen_status); UNUSED(force); return OB_SUCCESS; } virtual int submit_freeze_log_success(const ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int submit_freeze_log_finished(const ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int replay( const ObPartitionKey& partition, const char* log, const int64_t size, const uint64_t log_id, const int64_t log_ts) { UNUSED(partition); UNUSED(log); UNUSED(size); UNUSED(log_id); UNUSED(log_ts); return OB_SUCCESS; } virtual int minor_freeze(const uint64_t tenant_id) { UNUSED(tenant_id); return OB_SUCCESS; } virtual int minor_freeze(const common::ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int freeze_partition(const ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int query_log_info_with_log_id( const ObPartitionKey& pkey, const uint64_t log_id, int64_t& accum_checksum, int64_t& submit_timestamp) { UNUSED(pkey); UNUSED(log_id); UNUSED(accum_checksum); UNUSED(submit_timestamp); return OB_SUCCESS; } virtual int is_log_sync(const common::ObPartitionKey& key, bool& is_sync, uint64_t& last_slide_log_id) { UNUSED(key); UNUSED(is_sync); UNUSED(last_slide_log_id); return OB_SUCCESS; } // ========================================================================== // misc functions virtual int get_curr_leader_and_memberlist(const common::ObPartitionKey& pkey, common::ObAddr& leader, common::ObRole& role, common::ObMemberList& member_list, ObChildReplicaList& children_list, ObReplicaType& replica_type) const { UNUSED(pkey); UNUSED(leader); UNUSED(role); UNUSED(member_list); UNUSED(children_list); UNUSED(replica_type); return OB_SUCCESS; } virtual int get_dst_leader_candidate(const common::ObPartitionKey& pkey, common::ObMemberList& member_list) const { UNUSED(pkey); UNUSED(member_list); return OB_SUCCESS; } virtual int get_dst_candidates_array(const common::ObPartitionIArray& pkey_array, const common::ObAddrIArray& dst_server_list, common::ObSArray& candidate_list_array) const { UNUSED(pkey_array); UNUSED(dst_server_list); UNUSED(candidate_list_array); return OB_SUCCESS; } virtual int change_leader(const common::ObPartitionKey& pkey, const common::ObAddr& leader) { UNUSED(pkey); UNUSED(leader); return OB_SUCCESS; } virtual int get_leader(const common::ObPartitionKey& pkey, common::ObAddr& addr) const { UNUSED(pkey); UNUSED(addr); return OB_SUCCESS; } virtual bool is_partition_exist(const common::ObPartitionKey& pkey) const { UNUSED(pkey); return OB_SUCCESS; } virtual bool is_scan_disk_finished() { return OB_SUCCESS; } virtual bool is_inner_table_scan_finish() { return OB_SUCCESS; } // virtual void garbage_clean() = 0; virtual int get_server_locality_array( common::ObIArray& server_locality_array, bool& has_readonly_zone) const { UNUSED(server_locality_array); UNUSED(has_readonly_zone); return OB_SUCCESS; } virtual int force_refresh_locality_info() { return OB_SUCCESS; } // ========================================================================== // partition service rpc functions virtual int add_replica(const common::ObPartitionKey& pkey, const common::ObReplicaMember& dst, /* new replica */ const common::ObReplicaMember& data_src, /* data source */ const int64_t quorum, const share::ObTaskId& task_id) { UNUSED(pkey); UNUSED(dst); UNUSED(data_src); UNUSED(quorum); UNUSED(task_id); return OB_SUCCESS; } virtual int rebuild_replica(const common::ObPartitionKey& pkey, const common::ObReplicaMember& dst, const common::ObReplicaMember& data_src /* data source */, const share::ObTaskId& task_id) { UNUSED(pkey); UNUSED(dst); UNUSED(data_src); UNUSED(task_id); return OB_SUCCESS; } virtual int copy_global_index(const common::ObPartitionKey& pkey, const common::ObReplicaMember& dst, const common::ObReplicaMember& data_src, const share::ObTaskId& task_id) { UNUSED(pkey); UNUSED(dst); UNUSED(data_src); UNUSED(task_id); return OB_SUCCESS; } virtual int copy_local_index(const common::ObPartitionKey& pkey, const uint64_t index_id, const common::ObReplicaMember& dst, const common::ObReplicaMember& data_src, const share::ObTaskId& task_id) { UNUSED(pkey); UNUSED(dst); UNUSED(data_src); UNUSED(index_id); UNUSED(task_id); return OB_SUCCESS; } virtual int change_replica(const common::ObPartitionKey& pkey, const common::ObReplicaMember& dst, const common::ObReplicaMember& data_src, /* data source */ const int64_t quorum, const share::ObTaskId& task_id) { UNUSED(pkey); UNUSED(dst); UNUSED(data_src); UNUSED(quorum); UNUSED(task_id); return OB_SUCCESS; } // delete replicas not in paxos member list virtual int remove_replica(const common::ObPartitionKey& key, const common::ObReplicaMember& dst) { UNUSED(key); UNUSED(dst); return OB_SUCCESS; } // add member to member list (member change log) only leader can receive this rpc. virtual int add_replica_mc(const obrpc::ObMemberChangeArg& arg, obrpc::ObMCLogRpcInfo& mc_log_info) { UNUSED(arg); UNUSED(mc_log_info); return OB_SUCCESS; } // remove member from member list (member change log) only leader can receive this rpc. virtual int remove_replica_mc(const obrpc::ObMemberChangeArg& arg, obrpc::ObMCLogRpcInfo& mc_log_info) { UNUSED(arg); UNUSED(mc_log_info); return OB_SUCCESS; } virtual int change_quorum_mc(const obrpc::ObModifyQuorumArg& arg, obrpc::ObMCLogRpcInfo& mc_log_info) { UNUSED(arg); UNUSED(mc_log_info); return OB_SUCCESS; } virtual int is_member_change_done(const common::ObPartitionKey& key, const uint64_t log_id, const int64_t timestamp) { UNUSED(key); UNUSED(log_id); UNUSED(timestamp); return OB_SUCCESS; } virtual int do_warm_up_request(const obrpc::ObWarmUpRequestArg& arg, const int64_t recieve_ts) { UNUSED(arg); UNUSED(recieve_ts); return OB_SUCCESS; } // ========================================================================== // partition misc virtual int schema_drop_partition(const ObCLogCallbackAsyncTask& offline_task) { UNUSED(offline_task); return OB_SUCCESS; } virtual int submit_offline_partition_task(const common::ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } // ========================================================================== // do not use it unless you are rootserver virtual int get_frozen_status(const int64_t major_version, ObFrozenStatus& frozen_status) { UNUSED(major_version); UNUSED(frozen_status); return OB_SUCCESS; } virtual int insert_frozen_status(const ObFrozenStatus& src) { UNUSED(src); return OB_SUCCESS; } virtual int update_frozen_status(const ObFrozenStatus& src, const ObFrozenStatus& tgt) { UNUSED(src); UNUSED(tgt); return OB_SUCCESS; } virtual int delete_frozen_status(const int64_t major_version) { UNUSED(major_version); return OB_SUCCESS; } virtual int generate_partition_weak_read_snapshot_version( ObIPartitionGroup& partition, bool& need_skip, bool& is_user_partition, int64_t& wrs_version) { UNUSED(partition); UNUSED(need_skip); UNUSED(is_user_partition); UNUSED(wrs_version); return OB_SUCCESS; } virtual int check_can_start_service( bool& can_start_service, int64_t& safe_weak_read_snaspthot, ObPartitionKey& min_slave_read_ts_pkey) { UNUSED(can_start_service); UNUSED(safe_weak_read_snaspthot); UNUSED(min_slave_read_ts_pkey); return OB_SUCCESS; } virtual int admin_wash_ilog_cache(const clog::file_id_t file_id) { UNUSED(file_id); return OB_SUCCESS; } virtual int admin_wash_ilog_cache() { return OB_SUCCESS; } virtual int append_local_sort_data(const common::ObPartitionKey& pkey, const share::ObBuildIndexAppendLocalDataParam& param, common::ObNewRowIterator& iter) { UNUSED(pkey); UNUSED(param); UNUSED(iter); return OB_SUCCESS; } virtual int append_sstable(const common::ObPartitionKey& pkey, const share::ObBuildIndexAppendSSTableParam& param, common::ObNewRowIterator& iter) { UNUSED(pkey); UNUSED(param); UNUSED(iter); return OB_SUCCESS; } // for splitting partition virtual int split_partition( const share::ObSplitPartition& split_info, common::ObIArray& result) { UNUSED(split_info); UNUSED(result); return OB_SUCCESS; } virtual int sync_split_source_log_success( const common::ObPartitionKey& pkey, const int64_t source_log_id, const int64_t source_log_ts) { UNUSED(source_log_id); UNUSED(source_log_ts); UNUSED(pkey); return OB_SUCCESS; } virtual int sync_split_dest_log_success(const common::ObPartitionKey& pkey) { UNUSED(pkey); return OB_SUCCESS; } virtual int split_dest_partition( const common::ObPartitionKey& pkey, const ObPartitionSplitInfo& split_info, enum share::ObSplitProgress& progress) { UNUSED(progress); UNUSED(split_info); UNUSED(pkey); return OB_SUCCESS; } virtual int handle_split_dest_partition_request( const obrpc::ObSplitDestPartitionRequestArg& arg, obrpc::ObSplitDestPartitionResult& result) { UNUSED(result); UNUSED(arg); return OB_SUCCESS; } virtual int handle_split_dest_partition_result(const obrpc::ObSplitDestPartitionResult& result) { UNUSED(result); return OB_SUCCESS; } virtual int handle_replica_split_progress_request( const obrpc::ObReplicaSplitProgressRequest& arg, obrpc::ObReplicaSplitProgressResult& result) { UNUSED(result); UNUSED(arg); return OB_SUCCESS; } virtual int handle_replica_split_progress_result(const obrpc::ObReplicaSplitProgressResult& result) { UNUSED(result); return OB_SUCCESS; } virtual int set_global_max_decided_trans_version(const int64_t trans_version) { UNUSED(trans_version); return OB_SUCCESS; } virtual const common::ObAddr& get_self_addr() const { return addr_; } virtual int get_all_partition_status(int64_t& inactive_num, int64_t& total_num) const { UNUSED(inactive_num); UNUSED(total_num); return OB_SUCCESS; } virtual int migrate_replica(const common::ObPartitionKey& pkey, const common::ObReplicaMember& src, /* old replica */ const common::ObReplicaMember& dst, /* new replica */ const common::ObReplicaMember& data_src, /* data source */ const int64_t quorum, const share::ObTaskId& task_id) { UNUSED(pkey); UNUSED(src); UNUSED(dst); UNUSED(data_src); UNUSED(task_id); UNUSED(quorum); return OB_SUCCESS; } virtual int query_range_to_macros(common::ObIAllocator& allocator, const common::ObPartitionKey& pkey_, const common::ObIArray& ranges, const int64_t type, uint64_t* macros_count, const int64_t* total_task_count, ObIArray* splitted_ranges, common::ObIArray* split_index) { UNUSED(allocator); UNUSED(pkey_); UNUSED(ranges); UNUSED(type); UNUSED(macros_count); UNUSED(total_task_count); UNUSED(splitted_ranges); UNUSED(split_index); return OB_SUCCESS; } virtual int check_all_replica_major_sstable_exist( const common::ObPartitionKey& pkey, const uint64_t index_table_id, int64_t& max_timestamp) { UNUSED(index_table_id); UNUSED(max_timestamp); UNUSED(pkey); return OB_SUCCESS; } virtual int revoke_all_election_leader(const int64_t switchover_epoch) { UNUSED(switchover_epoch); return OB_SUCCESS; } virtual int check_all_partition_sync_state(const int64_t switchover_epoch) { UNUSED(switchover_epoch); return OB_SUCCESS; } virtual memtable::ObIMemtableCtxFactory* get_mem_ctx_factory() { return nullptr; } virtual int minor_freeze(const common::ObPartitionKey& pkey, const bool emergency = false) { UNUSED(pkey); UNUSED(emergency); return OB_SUCCESS; } virtual int freeze_partition(const ObPartitionKey& pkey, const bool emergency) { UNUSED(pkey); UNUSED(emergency); return OB_SUCCESS; } virtual int get_dup_replica_type( const common::ObPartitionKey& pkey, const common::ObAddr& server, DupReplicaType& dup_replica_type) { UNUSED(pkey); UNUSED(server); UNUSED(dup_replica_type); return OB_SUCCESS; } virtual int get_dup_replica_type( const uint64_t table_id, const common::ObAddr& server, DupReplicaType& dup_replica_type) { UNUSED(table_id); UNUSED(server); UNUSED(dup_replica_type); return OB_SUCCESS; } virtual int get_replica_status(const common::ObPartitionKey& pkey, share::ObReplicaStatus& replica_status) const { UNUSED(pkey); UNUSED(replica_status); return OB_SUCCESS; } virtual int get_curr_member_list(const common::ObPartitionKey& pkey, common::ObMemberList& member_list) const { UNUSED(pkey); UNUSED(member_list); return OB_SUCCESS; } virtual int add_replica(const obrpc::ObAddReplicaArg& rpc_arg, const share::ObTaskId& task_id) { UNUSED(rpc_arg); UNUSED(task_id); return OB_SUCCESS; } virtual int migrate_replica(const obrpc::ObMigrateReplicaArg& rpc_arg, const share::ObTaskId& task_id) { UNUSED(rpc_arg); UNUSED(task_id); return OB_SUCCESS; } virtual int rebuild_replica(const obrpc::ObRebuildReplicaArg& rpc_arg, const share::ObTaskId& task_id) { UNUSED(rpc_arg); UNUSED(task_id); return OB_SUCCESS; } virtual int copy_global_index(const obrpc::ObCopySSTableArg& rpc_arg, const share::ObTaskId& task_id) { UNUSED(rpc_arg); UNUSED(task_id); return OB_SUCCESS; } virtual int copy_local_index(const obrpc::ObCopySSTableArg& rpc_arg, const share::ObTaskId& task_id) { UNUSED(rpc_arg); UNUSED(task_id); return OB_SUCCESS; } virtual int change_replica(const obrpc::ObChangeReplicaArg& rpc_arg, const share::ObTaskId& task_id) { UNUSED(rpc_arg); UNUSED(task_id); return OB_SUCCESS; } virtual int batch_change_replica(const obrpc::ObChangeReplicaBatchArg& arg) { UNUSED(arg); return OB_SUCCESS; } virtual int batch_remove_replica(const obrpc::ObRemoveReplicaArgs& args) { UNUSED(args); return OB_SUCCESS; } virtual int batch_remove_non_paxos_replica( const obrpc::ObRemoveNonPaxosReplicaBatchArg& args, obrpc::ObRemoveNonPaxosReplicaBatchResult& results) { UNUSED(args); UNUSED(results); return OB_SUCCESS; } virtual int restore_replica(const obrpc::ObRestoreReplicaArg& arg, const share::ObTaskId& task_id) { UNUSED(arg); UNUSED(task_id); return OB_SUCCESS; } virtual int restore_follower_replica(const obrpc::ObCopySSTableBatchArg& arg) { UNUSED(arg); return OB_SUCCESS; } virtual int batch_remove_replica_mc( const obrpc::ObMemberChangeBatchArg& arg, obrpc::ObMemberChangeBatchResult& result) { UNUSED(arg); UNUSED(result); return OB_SUCCESS; } virtual int calc_column_checksum(const common::ObPartitionKey& pkey, const uint64_t index_table_id, const int64_t schema_version, const uint64_t execution_id, const int64_t snapshot_version) { UNUSED(pkey); UNUSED(index_table_id); UNUSED(schema_version); UNUSED(execution_id); UNUSED(snapshot_version); return OB_SUCCESS; } virtual int check_single_replica_major_sstable_exist( const common::ObPartitionKey& pkey, const uint64_t index_table_id, int64_t& timestamp) { UNUSED(pkey); UNUSED(index_table_id); UNUSED(timestamp); return OB_SUCCESS; } virtual int get_server_idc(const common::ObAddr& server, common::ObIDC& idc) const override { UNUSED(server); UNUSED(idc); return OB_SUCCESS; } virtual int get_server_cluster_id(const common::ObAddr& server, int64_t& cluster_id) const override { UNUSED(server); UNUSED(cluster_id); return OB_SUCCESS; } virtual int record_server_region(const common::ObAddr& server, const common::ObRegion& region) { UNUSED(server); UNUSED(region); return OB_SUCCESS; } virtual int record_server_idc(const common::ObAddr& server, const common::ObIDC& idc) override { UNUSED(server); UNUSED(idc); return OB_SUCCESS; } virtual int record_server_cluster_id(const common::ObAddr& server, const int64_t cluster_id) { UNUSED(server); UNUSED(cluster_id); return OB_SUCCESS; } private: common::ObScanner scanner_; int64_t col_num_; obrpc::ObCommonRpcProxy* rs_rpc_proxy_; ObPartitionServiceRpc* pts_rpc_; ObAddr addr_; private: DISALLOW_COPY_AND_ASSIGN(ObFakePartitionServiceForSQL); }; class ObFakePartitionServiceForGI : public ObFakePartitionServiceForSQL { public: class ObGIResult { public: ObGIResult() : macros_count_idx_(), pkeys_(), macros_count_(){}; virtual ~ObGIResult() = default; int macros_count_idx_; ObSEArray pkeys_; ObSEArray macros_count_; TO_STRING_KV(K(macros_count_), K(pkeys_)); }; public: ObFakePartitionServiceForGI() : ObFakePartitionServiceForSQL(), result_set_(), case_idx_(), pkey_idx_() {} virtual ~ObFakePartitionServiceForGI() = default; virtual int query_range_to_macros(common::ObIAllocator& allocator, const common::ObPartitionKey& pkey_, const common::ObIArray& ranges, const int64_t type, uint64_t* macros_count, const int64_t* total_task_count, ObIArray* splitted_ranges, common::ObIArray* split_index) override; private: DISALLOW_COPY_AND_ASSIGN(ObFakePartitionServiceForGI); public: ObSEArray result_set_; private: int case_idx_; int pkey_idx_; }; } // namespace storage } // namespace oceanbase #endif /* OCEANBASE_UNITTEST_ENGINE_TABLE_OB_FAKE_PARTITION_SERVICE_ */