From 99db3122b5635c34aa489833e35a896a5fde4c55 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 6 Feb 2023 14:42:41 +0800 Subject: [PATCH] [rebuild] add get_election_leader() --- src/logservice/ob_log_handler.cpp | 6 ++++++ src/logservice/ob_log_handler.h | 8 ++++++++ src/logservice/palf/palf_handle.cpp | 6 ++++++ src/logservice/palf/palf_handle.h | 1 + src/logservice/palf/palf_handle_impl.cpp | 24 ++++++++++++++++++++++++ src/logservice/palf/palf_handle_impl.h | 3 +++ unittest/storage/mock_ob_log_handler.h | 5 +++++ 7 files changed, 53 insertions(+) diff --git a/src/logservice/ob_log_handler.cpp b/src/logservice/ob_log_handler.cpp index bb09115d6c..6c542bfd42 100644 --- a/src/logservice/ob_log_handler.cpp +++ b/src/logservice/ob_log_handler.cpp @@ -404,6 +404,12 @@ int ObLogHandler::get_global_learner_list(common::GlobalLearnerList &learner_lis return palf_handle_.get_global_learner_list(learner_list); } +int ObLogHandler::get_election_leader(common::ObAddr &addr) const +{ + RLockGuard guard(lock_); + return palf_handle_.get_election_leader(addr); +} + int ObLogHandler::enable_sync() { RLockGuard guard(lock_); diff --git a/src/logservice/ob_log_handler.h b/src/logservice/ob_log_handler.h index 0a1da03cce..e955e24a72 100644 --- a/src/logservice/ob_log_handler.h +++ b/src/logservice/ob_log_handler.h @@ -96,6 +96,7 @@ public: virtual int get_end_scn(share::SCN &scn) const = 0; virtual int get_paxos_member_list(common::ObMemberList &member_list, int64_t &paxos_replica_num) const = 0; virtual int get_global_learner_list(common::GlobalLearnerList &learner_list) const = 0; + virtual int get_election_leader(common::ObAddr &addr) const = 0; virtual int change_replica_num(const common::ObMemberList &member_list, const int64_t curr_replica_num, const int64_t new_replica_num, @@ -292,6 +293,13 @@ public: // @brief, get global learner list of this paxos group // @param[out] common::GlobalLearnerList& int get_global_learner_list(common::GlobalLearnerList &learner_list) const override final; + // @brief, get leader from election, used for non_palf_leader rebuilding + // @param[out] addr: address of leader + // retval: + // OB_SUCCESS + // OB_NOT_INIT + // OB_LEADER_NOT_EXIST + int get_election_leader(common::ObAddr &addr) const override final; // PalfBaseInfo include the 'base_lsn' and the 'prev_log_info' of sliding window. // @param[in] const LSN&, base_lsn of ls. // @param[out] PalfBaseInfo&, palf_base_info diff --git a/src/logservice/palf/palf_handle.cpp b/src/logservice/palf/palf_handle.cpp index 9695940b51..10d44095d2 100644 --- a/src/logservice/palf/palf_handle.cpp +++ b/src/logservice/palf/palf_handle.cpp @@ -288,6 +288,12 @@ int PalfHandle::get_paxos_member_list(common::ObMemberList &member_list, int64_t return palf_handle_impl_->get_paxos_member_list(member_list, paxos_replica_num); } +int PalfHandle::get_election_leader(common::ObAddr &addr) const +{ + CHECK_VALID; + return palf_handle_impl_->get_election_leader(addr); +} + int PalfHandle::change_replica_num(const common::ObMemberList &member_list, const int64_t curr_replica_num, const int64_t new_replica_num, diff --git a/src/logservice/palf/palf_handle.h b/src/logservice/palf/palf_handle.h index fef27cce2e..98ed86ec45 100644 --- a/src/logservice/palf/palf_handle.h +++ b/src/logservice/palf/palf_handle.h @@ -178,6 +178,7 @@ public: int get_global_learner_list(common::GlobalLearnerList &learner_list) const; int get_paxos_member_list(common::ObMemberList &member_list, int64_t &paxos_replica_num) const; + int get_election_leader(common::ObAddr &addr) const; // @brief: a special config change interface, change replica number of paxos group // @param[in] common::ObMemberList: current memberlist, for pre-check diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index b31327fb34..2eefcdebc1 100644 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -489,6 +489,14 @@ int PalfHandleImpl::get_paxos_member_list( return ret; } +int PalfHandleImpl::get_election_leader(ObAddr &addr) const +{ + int ret = OB_SUCCESS; + RLockGuard guard(lock_); + ret = get_election_leader_without_lock_(addr); + return ret; +} + int PalfHandleImpl::config_change_pre_check(const ObAddr &server, const LogGetMCStReq &req, LogGetMCStResp &resp) @@ -3478,6 +3486,22 @@ int PalfHandleImpl::append_disk_log_to_sw_(const LSN &start_lsn) return ret; } +int PalfHandleImpl::get_election_leader_without_lock_(ObAddr &addr) const +{ + int ret = OB_SUCCESS; + int64_t unused_leader_epoch = -1; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + PALF_LOG(ERROR, "PalfHandleImpl has not inited", K(ret)); + } else if (OB_FAIL(election_.get_current_leader_likely(addr, unused_leader_epoch))) { + PALF_LOG(WARN, "get_election_leader failed", K(ret), KPC(this)); + } else if (OB_UNLIKELY(!addr.is_valid())) { + ret = OB_LEADER_NOT_EXIST; + PALF_LOG(WARN, "election has no leader", K(ret), KPC(this)); + } + return ret; +} + int PalfHandleImpl::revoke_leader(const int64_t proposal_id) { int ret = OB_SUCCESS; diff --git a/src/logservice/palf/palf_handle_impl.h b/src/logservice/palf/palf_handle_impl.h index 37ebecfadd..13c4960482 100644 --- a/src/logservice/palf/palf_handle_impl.h +++ b/src/logservice/palf/palf_handle_impl.h @@ -238,6 +238,7 @@ public: virtual int get_global_learner_list(common::GlobalLearnerList &learner_list) const = 0; virtual int get_paxos_member_list(common::ObMemberList &member_list, int64_t &paxos_replica_num) const = 0; + virtual int get_election_leader(common::ObAddr &addr) const = 0; // @brief: a special config change interface, change replica number of paxos group // @param[in] common::ObMemberList: current memberlist, for pre-check @@ -634,6 +635,7 @@ public: int change_leader_to(const common::ObAddr &dest_addr) override final; int get_global_learner_list(common::GlobalLearnerList &learner_list) const override final; int get_paxos_member_list(common::ObMemberList &member_list, int64_t &paxos_replica_num) const override final; + int get_election_leader(common::ObAddr &addr) const; int change_replica_num(const common::ObMemberList &member_list, const int64_t curr_replica_num, const int64_t new_replica_num, @@ -913,6 +915,7 @@ private: int check_need_advance_base_info_(const LSN &base_lsn, const LogInfo &base_prev_log_info, const bool is_rebuild); + int get_election_leader_without_lock_(ObAddr &addr) const; // ========================= flashback ============================== int can_do_flashback_(const int64_t mode_version, const share::SCN &flashback_scn, diff --git a/unittest/storage/mock_ob_log_handler.h b/unittest/storage/mock_ob_log_handler.h index b7a321d175..b90d163d97 100644 --- a/unittest/storage/mock_ob_log_handler.h +++ b/unittest/storage/mock_ob_log_handler.h @@ -409,6 +409,11 @@ public: } int enable_vote() { return OB_SUCCESS; } int disable_vote() { return OB_SUCCESS; } + int get_election_leader(common::ObAddr &addr) const + { + UNUSED(addr); + return OB_SUCCESS; + } int register_rebuild_cb(palf::PalfRebuildCb *rebuild_cb) { UNUSED(rebuild_cb); -- GitLab