diff --git a/src/rootserver/freeze/ob_major_merge_scheduler.cpp b/src/rootserver/freeze/ob_major_merge_scheduler.cpp index ba015f713eb4952cc9b8d8a775880c215a2bdd75..2cefdf80c7486adbd6f1822a47b72e8e49ffd3a1 100644 --- a/src/rootserver/freeze/ob_major_merge_scheduler.cpp +++ b/src/rootserver/freeze/ob_major_merge_scheduler.cpp @@ -657,6 +657,8 @@ int ObMajorMergeScheduler::try_update_global_merged_scn(const int64_t expected_e LOG_WARN("not inited", KR(ret)); } else if (OB_FAIL(zone_merge_mgr_->get_snapshot(global_info, infos))) { LOG_WARN("fail to get zone info", KR(ret)); + } else if (global_info.is_merge_error()) { + LOG_WARN("should not update global merged scn, cuz is_merge_error is true", K(global_info)); } else { if (global_info.last_merged_scn_ != global_info.global_broadcast_scn_) { bool merged = true; diff --git a/src/rootserver/freeze/ob_zone_merge_manager.cpp b/src/rootserver/freeze/ob_zone_merge_manager.cpp index fb609d33c71a6005c7eb2909bb1a3db26d8afe12..475ddaba5109ea2f3d545c94e4d4394ff51f0801 100644 --- a/src/rootserver/freeze/ob_zone_merge_manager.cpp +++ b/src/rootserver/freeze/ob_zone_merge_manager.cpp @@ -801,9 +801,12 @@ int ObZoneMergeManagerBase::update_global_merge_info_after_merge(const int64_t e const uint64_t meta_tenant_id = gen_meta_tenant_id(tenant_id_); if (OB_FAIL(check_inner_stat())) { LOG_WARN("fail to check inner stat", KR(ret), K_(tenant_id)); + } else if (global_merge_info_.is_in_verifying_status()) { + LOG_INFO("already in verifying status, no need to update global merge status again", K_(tenant_id), + "global merge status", global_merge_info_.merge_status_); } else if (global_merge_info_.is_merge_error()) { ret = OB_INNER_STAT_ERROR; - LOG_WARN("should not continue checking checksum, cuz is_merge_error is true", KR(ret), K_(global_merge_info)); + LOG_WARN("should not update global merge status, cuz is_merge_error is true", KR(ret), K_(global_merge_info)); } else { if (OB_FAIL(trans.start(proxy_, meta_tenant_id))) { LOG_WARN("fail to start transaction", KR(ret), K_(tenant_id), K(meta_tenant_id)); diff --git a/src/rootserver/freeze/ob_zone_merge_manager.h b/src/rootserver/freeze/ob_zone_merge_manager.h index c64d0db040789e8238bef9fc98e3aad9e0554f72..58c3d8efac9e774b0309e27a4cebc7868f76430c 100644 --- a/src/rootserver/freeze/ob_zone_merge_manager.h +++ b/src/rootserver/freeze/ob_zone_merge_manager.h @@ -88,6 +88,7 @@ private: const common::ObIArray &ori_merge_infos, const common::ObIArray &zone_list, common::ObIArray &to_insert_infos); + protected: common::SpinRWLock lock_; static int copy_infos(ObZoneMergeManagerBase &dest, const ObZoneMergeManagerBase &src); diff --git a/src/share/ob_zone_merge_info.cpp b/src/share/ob_zone_merge_info.cpp index aa4c21b0952d74d284c0cba33223945b0a0369d9..f7778d31e79e912115b8115c018f8842f782df0e 100644 --- a/src/share/ob_zone_merge_info.cpp +++ b/src/share/ob_zone_merge_info.cpp @@ -226,6 +226,11 @@ bool ObGlobalMergeInfo::is_merge_error() const return (is_merge_error_ > 0); } +bool ObGlobalMergeInfo::is_in_verifying_status() const +{ + return (ObZoneMergeInfo::MERGE_STATUS_VERIFYING == merge_status_); +} + bool ObGlobalMergeInfo::is_valid() const { bool is_valid = true; diff --git a/src/share/ob_zone_merge_info.h b/src/share/ob_zone_merge_info.h index 04a6654ceaa5344736e62a5dc9001761730e0a19..87d7df1e438d948244ea70c79c64f73525185748 100644 --- a/src/share/ob_zone_merge_info.h +++ b/src/share/ob_zone_merge_info.h @@ -111,6 +111,7 @@ public: bool is_in_merge() const; bool is_valid() const; bool is_merge_error() const; + bool is_in_verifying_status() const; ObGlobalMergeInfo &operator = (const ObGlobalMergeInfo &other) = delete; int assign(const ObGlobalMergeInfo &other); // differ from assign, only exclude 'need_update_' copy