diff --git a/src/rootserver/freeze/ob_major_merge_scheduler.cpp b/src/rootserver/freeze/ob_major_merge_scheduler.cpp index 2cefdf80c7..df5bc30725 100644 --- a/src/rootserver/freeze/ob_major_merge_scheduler.cpp +++ b/src/rootserver/freeze/ob_major_merge_scheduler.cpp @@ -578,9 +578,13 @@ int ObMajorMergeScheduler::update_merge_status(const int64_t expected_epoch) cur_all_merged_scn = progress->smallest_snapshot_version_; } - if ((last_merged_scn < cur_all_merged_scn) || (ori_all_merged_scn > cur_all_merged_scn)) { + // cur_all_merged_scn >= last_merged_scn + // 1. Equal: snapshot_version of all tablets change to frozen_scn after major compaction + // 2. Greater: In backup-restore situation, tablets may have higher snapshot_version, which + // is larger than current frozen_scn. https://work.aone.alibaba-inc.com/issue/45933591 + if ((cur_all_merged_scn < last_merged_scn) || (ori_all_merged_scn > cur_all_merged_scn)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect version", KR(ret), K(last_merged_scn), K(cur_all_merged_scn), + LOG_ERROR("unexpect merge scn", KR(ret), K(last_merged_scn), K(cur_all_merged_scn), K(ori_all_merged_scn)); } else { // TODO 'zone merge finish' & 'zone all tablet merge finish' should be handled in same procedure. diff --git a/src/rootserver/freeze/ob_zone_merge_manager.cpp b/src/rootserver/freeze/ob_zone_merge_manager.cpp index 475ddaba51..b8145d8d68 100644 --- a/src/rootserver/freeze/ob_zone_merge_manager.cpp +++ b/src/rootserver/freeze/ob_zone_merge_manager.cpp @@ -372,8 +372,7 @@ int ObZoneMergeManagerBase::finish_zone_merge( if (OB_FAIL(check_valid(zone, idx))) { LOG_WARN("fail to check valid", KR(ret), K(zone), K_(tenant_id)); - } else if ((last_merged_scn <= 0) || (all_merged_scn <= 0) - || (all_merged_scn > last_merged_scn)) { + } else if ((last_merged_scn <= 0) || (all_merged_scn <= 0)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", KR(ret), K(zone), K_(tenant_id), K(last_merged_scn), K(all_merged_scn)); @@ -393,7 +392,7 @@ int ObZoneMergeManagerBase::finish_zone_merge( } else { ObZoneMergeInfo::MergeStatus status = static_cast( zone_merge_infos_[idx].merge_status_.value_); - if (last_merged_scn != zone_merge_infos_[idx].last_merged_scn_) { + if (last_merged_scn > zone_merge_infos_[idx].last_merged_scn_) { const int64_t is_merging = 0; tmp_info.is_merging_.set_val(is_merging, true); tmp_info.last_merged_scn_.set_val(last_merged_scn, true);