From 85c634e194be84fd838ff98582bec7ab870e6cf3 Mon Sep 17 00:00:00 2001 From: hf0 Date: Wed, 3 Nov 2021 13:46:04 +0800 Subject: [PATCH] optimize get_clog_parent interface. --- src/clog/ob_log_cascading_mgr.cpp | 5 ++++- src/clog/ob_log_cascading_mgr.h | 4 ++++ src/clog/ob_partition_log_service.cpp | 22 ++++++++++++++----- src/clog/ob_partition_log_service.h | 4 ++-- src/storage/ob_partition_migrator.cpp | 2 +- src/storage/ob_partition_service.cpp | 6 ++--- src/storage/ob_rebuild_scheduler.cpp | 2 +- unittest/clog/mock_ob_partition_log_service.h | 2 +- 8 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/clog/ob_log_cascading_mgr.cpp b/src/clog/ob_log_cascading_mgr.cpp index d87a52319..82d46d77c 100644 --- a/src/clog/ob_log_cascading_mgr.cpp +++ b/src/clog/ob_log_cascading_mgr.cpp @@ -229,7 +229,10 @@ int ObLogCascadingMgr::set_parent_(const common::ObAddr& new_parent_addr, const } else { state_mgr_->reset_need_rebuild(); state_mgr_->reset_fetch_state(); - prev_parent_ = parent_; + if (parent_.is_valid()) { + // update prev_parent by valid old parent + prev_parent_ = parent_; + } parent_ = new_parent; if (partition_reach_time_interval(60 * 1000 * 1000, update_parent_warn_time_)) { CLOG_LOG(INFO, diff --git a/src/clog/ob_log_cascading_mgr.h b/src/clog/ob_log_cascading_mgr.h index 071102aee..47688bf6c 100644 --- a/src/clog/ob_log_cascading_mgr.h +++ b/src/clog/ob_log_cascading_mgr.h @@ -98,6 +98,10 @@ public: { return parent_; } + share::ObCascadMember get_prev_parent() const + { + return prev_parent_; + } common::ObAddr get_parent_addr() const { return parent_.get_server(); diff --git a/src/clog/ob_partition_log_service.cpp b/src/clog/ob_partition_log_service.cpp index 053c248e9..b60bd98a0 100644 --- a/src/clog/ob_partition_log_service.cpp +++ b/src/clog/ob_partition_log_service.cpp @@ -1319,7 +1319,7 @@ int ObPartitionLogService::get_leader(common::ObAddr& leader) const return ret; } -int ObPartitionLogService::get_clog_parent(common::ObAddr& parent, int64_t& cluster_id) const +int ObPartitionLogService::get_clog_parent_for_migration(common::ObAddr &parent, int64_t &cluster_id) const { int ret = OB_SUCCESS; RLockGuard guard(lock_); @@ -1330,22 +1330,34 @@ int ObPartitionLogService::get_clog_parent(common::ObAddr& parent, int64_t& clus parent = restore_mgr_.get_restore_leader(); cluster_id = state_mgr_.get_self_cluster_id(); } else { + const bool is_paxos_replica = ObReplicaTypeCheck::is_paxos_replica(mm_.get_replica_type()); const share::ObCascadMember parent_member = cascading_mgr_.get_parent(); + const share::ObCascadMember prev_parent_member = cascading_mgr_.get_prev_parent(); + share::ObCascadMember cascad_leader; + (void)state_mgr_.get_cascad_leader(cascad_leader); if (parent_member.is_valid()) { parent = parent_member.get_server(); cluster_id = parent_member.get_cluster_id(); - } else { + } else if (!is_paxos_replica && prev_parent_member.is_valid()) { + // prev_parent is preferred choice for non-paxos replica + parent = prev_parent_member.get_server(); + cluster_id = prev_parent_member.get_cluster_id(); + } else if (cascad_leader.is_valid()) { // returns corresponding leader when parent is invalid - share::ObCascadMember cascad_leader; - (void)state_mgr_.get_cascad_leader(cascad_leader); parent = cascad_leader.get_server(); cluster_id = cascad_leader.get_cluster_id(); + } else if (prev_parent_member.is_valid()) { + // at last return prev_parent + parent = prev_parent_member.get_server(); + cluster_id = prev_parent_member.get_cluster_id(); + } else { + // it does not have valid parent } } if (!parent.is_valid()) { ret = OB_NEED_RETRY; } - CLOG_LOG(INFO, "get clog parent", K(ret), K_(partition_key), K(parent)); + CLOG_LOG(INFO, "get clog parent", K(ret), K_(partition_key), K(parent), K(cluster_id)); return ret; } diff --git a/src/clog/ob_partition_log_service.h b/src/clog/ob_partition_log_service.h index ee424b611..edbe89390 100644 --- a/src/clog/ob_partition_log_service.h +++ b/src/clog/ob_partition_log_service.h @@ -249,7 +249,7 @@ public: virtual common::ObPartitionKey get_partition_key() const = 0; virtual int get_saved_base_storage_info(common::ObBaseStorageInfo& base_storage_info) const = 0; virtual int get_leader(common::ObAddr& leader) const = 0; - virtual int get_clog_parent(common::ObAddr& parent, int64_t& cluster_id) const = 0; + virtual int get_clog_parent_for_migration(common::ObAddr &parent, int64_t &cluster_id) const = 0; virtual int change_leader(const common::ObAddr& leader, common::ObTsWindows& changing_leader_windows) = 0; virtual int change_restore_leader(const common::ObAddr& leader) = 0; virtual int check_and_set_restore_progress() = 0; @@ -523,7 +523,7 @@ public: virtual common::ObPartitionKey get_partition_key() const override; virtual int get_saved_base_storage_info(common::ObBaseStorageInfo& base_storage_info) const override; virtual int get_leader(common::ObAddr& addr) const override; - virtual int get_clog_parent(common::ObAddr& parent, int64_t& cluster_id) const override; + virtual int get_clog_parent_for_migration(common::ObAddr &parent, int64_t &cluster_id) const; virtual int change_leader(const common::ObAddr& leader, common::ObTsWindows& changing_leader_windows) override; virtual int change_restore_leader(const common::ObAddr& leader) override; virtual int check_and_set_restore_progress() override; diff --git a/src/storage/ob_partition_migrator.cpp b/src/storage/ob_partition_migrator.cpp index 04162881c..550b29b9f 100644 --- a/src/storage/ob_partition_migrator.cpp +++ b/src/storage/ob_partition_migrator.cpp @@ -13261,7 +13261,7 @@ int ObMigrateGetLeaderUtil::get_clog_parent(clog::ObIPartitionLogService &log_se ObAddr parent_src; int64_t cluster_id = -1; - if (OB_FAIL(log_service.get_clog_parent(parent_src, cluster_id))) { + if (OB_FAIL(log_service.get_clog_parent_for_migration(parent_src, cluster_id))) { STORAGE_LOG(WARN, "get parent addr failed", K(ret)); } else { parent_info.src_addr_ = parent_src; diff --git a/src/storage/ob_partition_service.cpp b/src/storage/ob_partition_service.cpp index 5e1956bba..71a2034ab 100644 --- a/src/storage/ob_partition_service.cpp +++ b/src/storage/ob_partition_service.cpp @@ -13386,7 +13386,7 @@ int ObPartitionService::get_primary_cluster_migrate_src(const common::ObPartitio ret = OB_ERR_UNEXPECTED; LOG_WARN("log service should not be NULL", K(ret), K(pkey)); } else if (FALSE_IT(is_restore = partition->get_pg_storage().is_restore())) { - } else if (OB_FAIL(log_service->get_clog_parent(src_info.src_addr_, src_info.cluster_id_))) { + } else if (OB_FAIL(log_service->get_clog_parent_for_migration(src_info.src_addr_, src_info.cluster_id_))) { if (OB_NEED_RETRY == ret) { ret = OB_SUCCESS; } else { @@ -13463,7 +13463,7 @@ int ObPartitionService::get_standby_cluster_migrate_src(const common::ObPartitio ret = OB_ERR_UNEXPECTED; LOG_WARN("log service should not be NULL", K(ret), K(pkey)); } else if (ObRole::STANDBY_LEADER == role) { - if (OB_FAIL(log_service->get_clog_parent(src_info.src_addr_, src_info.cluster_id_))) { + if (OB_FAIL(log_service->get_clog_parent_for_migration(src_info.src_addr_, src_info.cluster_id_))) { if (OB_NEED_RETRY == ret) { ret = OB_SUCCESS; } else { @@ -13472,7 +13472,7 @@ int ObPartitionService::get_standby_cluster_migrate_src(const common::ObPartitio } else if (OB_FAIL(add_migrate_src(src_info, src_set, src_array))) { LOG_WARN("failed to add migrate src", K(ret), K(role), K(src_info), K(pkey)); } else { - LOG_INFO("get_clog_parent", K(src_info)); + LOG_INFO("get_clog_parent_for_migration", K(src_info)); src_info.reset(); } } diff --git a/src/storage/ob_rebuild_scheduler.cpp b/src/storage/ob_rebuild_scheduler.cpp index 2d043f6fd..a2b82ccb6 100644 --- a/src/storage/ob_rebuild_scheduler.cpp +++ b/src/storage/ob_rebuild_scheduler.cpp @@ -245,7 +245,7 @@ int ObRebuildReplicaTaskProducer::build_local_replica_info() // skip } else if (OB_FAIL(partition->get_pg_storage().get_pg_meta(pg_meta))) { STORAGE_LOG(WARN, "failed to get pg meta", K(ret), K(partition->get_partition_key())); - } else if (OB_FAIL(partition->get_log_service()->get_clog_parent(parent_addr, parent_cluster_id))) { + } else if (OB_FAIL(partition->get_log_service()->get_clog_parent_for_migration(parent_addr, parent_cluster_id))) { STORAGE_LOG(WARN, "get parent addr failed", K(ret)); } else { // now only consider memstore pecent 0 is D replica, and read-only replica in ofs mode. diff --git a/unittest/clog/mock_ob_partition_log_service.h b/unittest/clog/mock_ob_partition_log_service.h index cce41464b..41e6383d9 100644 --- a/unittest/clog/mock_ob_partition_log_service.h +++ b/unittest/clog/mock_ob_partition_log_service.h @@ -528,7 +528,7 @@ public: UNUSED(leader); return common::OB_SUCCESS; } - virtual int get_clog_parent(common::ObAddr& parent, int64_t& cluster_id) const + virtual int get_clog_parent_for_migration(common::ObAddr &parent, int64_t &cluster_id) const { UNUSED(parent); UNUSED(cluster_id); -- GitLab