535 lines
14 KiB
C++
535 lines
14 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.
|
|
*/
|
|
|
|
#include "logservice/ob_log_handler.h"
|
|
#include "logservice/palf/palf_handle.h"
|
|
#include "logservice/ob_log_service.h"
|
|
#include "logservice/palf/palf_env.h"
|
|
#include "share/scn.h"
|
|
#include "logservice/ob_log_base_type.h"
|
|
#ifdef OB_BUILD_SHARED_STORAGE
|
|
#include "log/ob_log_iterator_storage.h"
|
|
#endif
|
|
|
|
#ifndef MOCK_OB_LOG_HANDLER_H_
|
|
#define MOCK_OB_LOG_HANDLER_H_
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace palf;
|
|
|
|
namespace storage
|
|
{
|
|
|
|
class MockObLogHandler : public logservice::ObILogHandler
|
|
{
|
|
public:
|
|
MockObLogHandler(){};
|
|
virtual bool is_valid() const { return true; }
|
|
virtual int append(const void *buffer,
|
|
const int64_t nbytes,
|
|
const share::SCN &ref_scn,
|
|
const bool need_nonblock,
|
|
const bool allow_compress,
|
|
logservice::AppendCb *cb,
|
|
palf::LSN &lsn,
|
|
share::SCN &scn)
|
|
{
|
|
UNUSED(need_nonblock);
|
|
UNUSED(allow_compress);
|
|
UNUSED(buffer);
|
|
UNUSED(nbytes);
|
|
UNUSED(ref_scn);
|
|
UNUSED(cb);
|
|
UNUSED(lsn);
|
|
UNUSED(scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
virtual int append_big_log(const void *buffer,
|
|
const int64_t nbytes,
|
|
const share::SCN &ref_scn,
|
|
const bool need_nonblock,
|
|
const bool allow_compress,
|
|
logservice::AppendCb *cb,
|
|
palf::LSN &lsn,
|
|
share::SCN &scn)
|
|
{
|
|
UNUSED(need_nonblock);
|
|
UNUSED(allow_compress);
|
|
UNUSED(buffer);
|
|
UNUSED(nbytes);
|
|
UNUSED(ref_scn);
|
|
UNUSED(cb);
|
|
UNUSED(lsn);
|
|
UNUSED(scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
virtual int append(const void *buffer,
|
|
const int64_t nbytes,
|
|
const int64_t ref_ts_ns,
|
|
const bool need_nonblock,
|
|
logservice::AppendCb *cb,
|
|
palf::LSN &lsn,
|
|
int64_t &ts_ns)
|
|
{
|
|
UNUSED(need_nonblock);
|
|
UNUSED(buffer);
|
|
UNUSED(nbytes);
|
|
UNUSED(ref_ts_ns);
|
|
UNUSED(cb);
|
|
UNUSED(lsn);
|
|
UNUSED(ts_ns);
|
|
return OB_SUCCESS;
|
|
}
|
|
virtual int set_election_priority(palf::election::ElectionPriority *) { return OB_SUCCESS; }
|
|
virtual int reset_election_priority() { return OB_SUCCESS; }
|
|
virtual int get_role(common::ObRole &role, int64_t &proposal_id) const
|
|
{
|
|
UNUSED(role);
|
|
UNUSED(proposal_id);
|
|
return OB_SUCCESS;
|
|
}
|
|
virtual int get_access_mode(int64_t &mode_version, AccessMode &access_mode) const
|
|
{
|
|
UNUSED(access_mode);
|
|
UNUSED(mode_version);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
virtual int get_append_mode_initial_scn(SCN &initial_scn) const
|
|
{
|
|
UNUSED(initial_scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
virtual int change_access_mode(const int64_t mode_version,
|
|
const AccessMode &access_mode,
|
|
const share::SCN &ref_scn)
|
|
{
|
|
UNUSED(mode_version);
|
|
UNUSED(access_mode);
|
|
UNUSED(ref_scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
virtual int change_access_mode(const int64_t mode_version,
|
|
const AccessMode &access_mode,
|
|
const int64_t ref_ts_ns)
|
|
{
|
|
UNUSED(mode_version);
|
|
UNUSED(access_mode);
|
|
UNUSED(ref_ts_ns);
|
|
return OB_SUCCESS;
|
|
}
|
|
virtual int get_pending_end_lsn(palf::LSN &pending_end_lsn) const
|
|
{
|
|
UNUSED(pending_end_lsn);
|
|
return OB_SUCCESS;
|
|
}
|
|
int seek(const palf::LSN &start_lsn,
|
|
palf::PalfBufferIterator &iter)
|
|
{
|
|
UNUSED(start_lsn);
|
|
UNUSED(iter);
|
|
return OB_SUCCESS;
|
|
};
|
|
int seek(const palf::LSN &start_lsn,
|
|
palf::PalfGroupBufferIterator &iter)
|
|
{
|
|
UNUSED(start_lsn);
|
|
UNUSED(iter);
|
|
return OB_SUCCESS;
|
|
};
|
|
int set_initial_member_list(const common::ObMemberList &member_list,
|
|
const int64_t paxos_replica_num,
|
|
const common::GlobalLearnerList &learner_list)
|
|
{
|
|
UNUSED(member_list);
|
|
UNUSED(paxos_replica_num);
|
|
UNUSED(learner_list);
|
|
return OB_SUCCESS;
|
|
}
|
|
int set_initial_member_list(const common::ObMemberList &member_list,
|
|
const common::ObMember &arb_replica,
|
|
const int64_t paxos_replica_num,
|
|
const common::GlobalLearnerList &learner_list)
|
|
{
|
|
UNUSEDx(member_list, arb_replica, paxos_replica_num);
|
|
UNUSED(learner_list);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_end_scn(share::SCN &scn) const
|
|
{
|
|
UNUSED(scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_end_ts_ns(int64_t &ts) const
|
|
{
|
|
UNUSED(ts);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_global_learner_list(common::GlobalLearnerList &learner_list) const
|
|
{
|
|
UNUSED(learner_list);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_paxos_member_list(common::ObMemberList &member_list, int64_t &paxos_replica_num) const
|
|
{
|
|
UNUSED(member_list);
|
|
UNUSED(paxos_replica_num);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_paxos_member_list_and_learner_list(common::ObMemberList &member_list,
|
|
int64_t &paxos_replica_num,
|
|
common::GlobalLearnerList &learner_list) const
|
|
{
|
|
UNUSEDx(member_list, paxos_replica_num, learner_list);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_stable_membership(palf::LogConfigVersion &config_version,
|
|
common::ObMemberList &member_list,
|
|
int64_t &paxos_replica_num,
|
|
common::GlobalLearnerList &learner_list) const
|
|
{
|
|
UNUSEDx(config_version, member_list, paxos_replica_num, learner_list);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_max_lsn(palf::LSN &lsn) const
|
|
{
|
|
UNUSED(lsn);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_max_scn(share::SCN &scn) const
|
|
{
|
|
UNUSED(scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_max_ts_ns(int64_t &ts_ns) const
|
|
{
|
|
UNUSED(ts_ns);
|
|
return OB_SUCCESS;
|
|
}
|
|
int locate_by_scn_coarsely(const share::SCN &scn, LSN &result_lsn)
|
|
{
|
|
LSN tmp(scn.get_val_for_inner_table_field());
|
|
result_lsn = tmp;
|
|
return OB_SUCCESS;
|
|
}
|
|
int locate_by_ts_ns_coarsely(const int64_t ts_ns, LSN &result_lsn)
|
|
{
|
|
LSN tmp(ts_ns);
|
|
result_lsn = tmp;
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int advance_base_lsn(const LSN &lsn)
|
|
{
|
|
base_lsn_ = lsn;
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int locate_by_lsn_coarsely(const palf::LSN &lsn, share::SCN &result_scn)
|
|
{
|
|
result_scn = result_scn_;
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int locate_by_lsn_coarsely(const palf::LSN &lsn, int64_t &result_ts_ns)
|
|
{
|
|
result_ts_ns = result_ts_ns_;
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int get_begin_lsn(LSN &lsn) const
|
|
{
|
|
UNUSED(lsn);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int get_end_lsn(LSN &lsn) const
|
|
{
|
|
UNUSED(lsn);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int get_palf_base_info(const palf::LSN &base_lsn, palf::PalfBaseInfo &palf_base_info)
|
|
{
|
|
UNUSED(base_lsn);
|
|
UNUSED(palf_base_info);
|
|
return OB_SUCCESS;
|
|
}
|
|
int is_in_sync(bool &is_log_sync, bool &is_need_rebuild) const
|
|
{
|
|
UNUSED(is_log_sync);
|
|
UNUSED(is_need_rebuild);
|
|
return OB_SUCCESS;
|
|
}
|
|
int advance_base_info(const palf::PalfBaseInfo &palf_base_info, const bool is_rebuild)
|
|
{
|
|
UNUSED(palf_base_info);
|
|
UNUSED(is_rebuild);
|
|
return OB_SUCCESS;
|
|
}
|
|
bool is_sync_enabled() const
|
|
{
|
|
return true;
|
|
}
|
|
bool is_replay_enabled() const
|
|
{
|
|
return true;
|
|
}
|
|
int enable_sync()
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
int disable_sync()
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_leader_config_version(palf::LogConfigVersion &config_version) const
|
|
{
|
|
UNUSED(config_version);
|
|
return OB_SUCCESS;
|
|
}
|
|
int change_replica_num(const common::ObMemberList &member_list,
|
|
const int64_t curr_replica_num,
|
|
const int64_t new_replica_num,
|
|
const int64_t timeout_us)
|
|
{
|
|
UNUSEDx(member_list, curr_replica_num, new_replica_num, timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int force_set_as_single_replica()
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
int force_set_member_list(const common::ObMemberList &new_member_list, const int64_t new_replica_num)
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
int add_member(const common::ObMember &member,
|
|
const int64_t paxos_replica_num,
|
|
const palf::LogConfigVersion &config_version,
|
|
const int64_t timeout_ns)
|
|
{
|
|
UNUSEDx(member, paxos_replica_num, config_version, timeout_ns);
|
|
return OB_SUCCESS;
|
|
}
|
|
int remove_member(const common::ObMember &member,
|
|
const int64_t paxos_replica_num,
|
|
const int64_t timeout_ns)
|
|
{
|
|
UNUSED(member);
|
|
UNUSED(paxos_replica_num);
|
|
UNUSED(timeout_ns);
|
|
return OB_SUCCESS;
|
|
}
|
|
int replace_member(const common::ObMember &added_member,
|
|
const common::ObMember &removed_member,
|
|
const palf::LogConfigVersion &config_version,
|
|
const int64_t timeout_ns)
|
|
{
|
|
UNUSED(added_member);
|
|
UNUSED(removed_member);
|
|
UNUSED(config_version);
|
|
UNUSED(timeout_ns);
|
|
return OB_SUCCESS;
|
|
}
|
|
int add_learner(const common::ObMember &added_learner,
|
|
const int64_t timeout_us)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
UNUSED(added_learner);
|
|
UNUSED(timeout_us);
|
|
return ret;
|
|
}
|
|
|
|
int remove_learner(const common::ObMember &removed_learner,
|
|
const int64_t timeout_us)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
UNUSED(removed_learner);
|
|
UNUSED(timeout_us);
|
|
return ret;
|
|
}
|
|
|
|
int replace_learners(const common::ObMemberList &added_learners,
|
|
const common::ObMemberList &removed_learners,
|
|
const int64_t timeout_us)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
UNUSEDx(added_learners, removed_learners, timeout_us);
|
|
return ret;
|
|
}
|
|
|
|
int replace_member_with_learner(const common::ObMember &added_member,
|
|
const common::ObMember &removed_member,
|
|
const palf::LogConfigVersion &config_version,
|
|
const int64_t timeout_us)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
UNUSEDx(added_member, removed_member, timeout_us);
|
|
return ret;
|
|
}
|
|
|
|
|
|
int switch_learner_to_acceptor(const common::ObMember &learner,
|
|
const int64_t new_replica_num,
|
|
const palf::LogConfigVersion &config_version,
|
|
const int64_t timeout_us)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
UNUSED(config_version);
|
|
UNUSEDx(learner, new_replica_num, timeout_us);
|
|
return ret;
|
|
}
|
|
int switch_acceptor_to_learner(const common::ObMember &member,
|
|
const int64_t new_replica_num,
|
|
const int64_t timeout_us)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
UNUSEDx(member, new_replica_num, timeout_us);
|
|
return ret;
|
|
}
|
|
int add_arbitration_member(const common::ObMember &added_member, const int64_t timeout_us)
|
|
{
|
|
UNUSEDx(added_member, timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int remove_arbitration_member(const common::ObMember &removed_member, const int64_t timeout_us)
|
|
{
|
|
UNUSEDx(removed_member, timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int degrade_acceptor_to_learner(const palf::LogMemberAckInfoList °rade_servers,
|
|
const int64_t timeout_us)
|
|
{
|
|
UNUSEDx(degrade_servers, timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int upgrade_learner_to_acceptor(const palf::LogMemberAckInfoList &upgrade_servers,
|
|
const int64_t timeout_us)
|
|
{
|
|
UNUSEDx(upgrade_servers, timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_member_gc_stat(const common::ObAddr &addr, bool &is_valid_member, obrpc::LogMemberGCStat &stat) const
|
|
{
|
|
UNUSEDx(addr, is_valid_member, stat);
|
|
return OB_SUCCESS;
|
|
}
|
|
void wait_append_sync()
|
|
{
|
|
return;
|
|
}
|
|
|
|
int pend_submit_replay_log()
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int restore_submit_replay_log()
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
int try_lock_config_change(const int64_t lock_owner, const int64_t timeout_us)
|
|
{
|
|
UNUSED(lock_owner);
|
|
UNUSED(timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int unlock_config_change(const int64_t lock_owner, const int64_t timeout_us)
|
|
{
|
|
UNUSED(lock_owner);
|
|
UNUSED(timeout_us);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_config_change_lock_stat(int64_t &lock_owner, bool &is_locked)
|
|
{
|
|
lock_owner = palf::OB_INVALID_CONFIG_CHANGE_LOCK_OWNER;
|
|
is_locked = false;
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
LSN base_lsn_;
|
|
int64_t result_ts_ns_;
|
|
share::SCN result_scn_;
|
|
int enable_replay(const palf::LSN &initial_lsn,
|
|
const share::SCN &initial_scn)
|
|
{
|
|
UNUSED(initial_lsn);
|
|
UNUSED(initial_scn);
|
|
return OB_SUCCESS;
|
|
}
|
|
int enable_replay(const palf::LSN &initial_lsn,
|
|
const int64_t &initial_log_ts)
|
|
{
|
|
UNUSED(initial_lsn);
|
|
UNUSED(initial_log_ts);
|
|
return OB_SUCCESS;
|
|
}
|
|
int disable_replay()
|
|
{
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_max_decided_scn(share::SCN &scn)
|
|
{
|
|
scn.set_max();
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_max_decided_scn_as_leader(share::SCN &scn) const
|
|
{
|
|
scn.set_max();
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_max_decided_log_ts_ns(int64_t &log_ts)
|
|
{
|
|
log_ts = INT64_MAX;
|
|
return OB_SUCCESS;
|
|
}
|
|
int enable_vote() { return OB_SUCCESS; }
|
|
int disable_vote(const bool need_check_log_missing)
|
|
{
|
|
UNUSED(need_check_log_missing);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_election_leader(common::ObAddr &addr) const
|
|
{
|
|
UNUSED(addr);
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_parent(common::ObAddr &parent) const
|
|
{
|
|
UNUSED(parent);
|
|
return OB_SUCCESS;
|
|
}
|
|
int register_rebuild_cb(palf::PalfRebuildCb *rebuild_cb)
|
|
{
|
|
UNUSED(rebuild_cb);
|
|
return OB_SUCCESS;
|
|
}
|
|
int unregister_rebuild_cb() { return OB_SUCCESS; }
|
|
bool is_offline() const {return false;};
|
|
int offline() {return OB_SUCCESS;};
|
|
int online(const LSN &lsn, const share::SCN &scn) { UNUSED(lsn); UNUSED(scn); return OB_SUCCESS;};
|
|
int is_replay_fatal_error(bool &has_fatal_error) {has_fatal_error = false; return OB_SUCCESS;}
|
|
};
|
|
|
|
} // namespace storage
|
|
} // namespace oceanbase
|
|
|
|
|
|
#endif
|
|
|