diff --git a/src/storage/compaction/ob_medium_compaction_func.cpp b/src/storage/compaction/ob_medium_compaction_func.cpp index 3638c4be38..51157c65e6 100644 --- a/src/storage/compaction/ob_medium_compaction_func.cpp +++ b/src/storage/compaction/ob_medium_compaction_func.cpp @@ -818,24 +818,26 @@ int ObMediumCompactionScheduleFunc::schedule_tablet_medium_merge( return ret; } #endif - const ObMediumCompactionInfoList &medium_list = tablet.get_medium_compaction_info_list(); - const ObTabletID &tablet_id = tablet.get_tablet_meta().tablet_id_; - const ObLSID &ls_id = ls.get_ls_id(); - int64_t major_frozen_snapshot = 0 == input_major_snapshot ? MTL(ObTenantTabletScheduler *)->get_frozen_version() : input_major_snapshot; - ObMediumCompactionInfo::ObCompactionType compaction_type = ObMediumCompactionInfo::COMPACTION_TYPE_MAX; - int64_t schedule_scn = 0; - bool need_merge = false; + if (MTL(ObTenantTabletScheduler *)->could_major_merge_start()) { + const ObMediumCompactionInfoList &medium_list = tablet.get_medium_compaction_info_list(); + const ObTabletID &tablet_id = tablet.get_tablet_meta().tablet_id_; + const ObLSID &ls_id = ls.get_ls_id(); + int64_t major_frozen_snapshot = 0 == input_major_snapshot ? MTL(ObTenantTabletScheduler *)->get_frozen_version() : input_major_snapshot; + ObMediumCompactionInfo::ObCompactionType compaction_type = ObMediumCompactionInfo::COMPACTION_TYPE_MAX; + int64_t schedule_scn = 0; + bool need_merge = false; - (void)tablet.get_medium_compaction_info_list().get_schedule_scn(major_frozen_snapshot, schedule_scn, compaction_type); + (void)tablet.get_medium_compaction_info_list().get_schedule_scn(major_frozen_snapshot, schedule_scn, compaction_type); - LOG_DEBUG("schedule_tablet_medium_merge", K(schedule_scn), K(major_frozen_snapshot), K(schedule_with_memtable), K(ls_id), K(tablet_id)); - if (0 == schedule_scn - && schedule_with_memtable - && OB_FAIL(get_schedule_medium_from_memtable(tablet, major_frozen_snapshot, schedule_scn, compaction_type))) { - LOG_WARN("failed to get schedule medium scn from memtables", K(ret)); - } else if (schedule_scn > 0) { - if (OB_FAIL(check_need_merge_and_schedule(ls, tablet, schedule_scn, compaction_type))) { - LOG_WARN("failed to check medium merge", K(ret), K(ls_id), K(tablet_id), K(schedule_scn)); + LOG_DEBUG("schedule_tablet_medium_merge", K(schedule_scn), K(major_frozen_snapshot), K(schedule_with_memtable), K(ls_id), K(tablet_id)); + if (0 == schedule_scn + && schedule_with_memtable + && OB_FAIL(get_schedule_medium_from_memtable(tablet, major_frozen_snapshot, schedule_scn, compaction_type))) { + LOG_WARN("failed to get schedule medium scn from memtables", K(ret)); + } else if (schedule_scn > 0) { + if (OB_FAIL(check_need_merge_and_schedule(ls, tablet, schedule_scn, compaction_type))) { + LOG_WARN("failed to check medium merge", K(ret), K(ls_id), K(tablet_id), K(schedule_scn)); + } } } diff --git a/src/storage/compaction/ob_partition_merge_policy.cpp b/src/storage/compaction/ob_partition_merge_policy.cpp index f1dcb1db32..689051feaa 100644 --- a/src/storage/compaction/ob_partition_merge_policy.cpp +++ b/src/storage/compaction/ob_partition_merge_policy.cpp @@ -103,6 +103,12 @@ int ObPartitionMergePolicy::get_medium_merge_tables( } else if (base_table->get_snapshot_version() >= param.merge_version_) { ret = OB_NO_NEED_MERGE; LOG_INFO("medium merge already finished", K(ret), KPC(base_table), K(result)); + } else if (OB_UNLIKELY(tablet.get_snapshot_version() < param.merge_version_)) { + ret = OB_NO_NEED_MERGE; + LOG_INFO("tablet is not ready to schedule medium merge", K(ret), K(tablet), K(param)); + } else if (OB_UNLIKELY(tablet.get_multi_version_start() > param.merge_version_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tablet haven't kept medium snapshot", K(ret), K(tablet), K(param)); } else { const ObSSTableArray &minor_tables = table_store.get_minor_sstables(); bool start_add_table_flag = false; diff --git a/unittest/storage/test_compaction_policy.cpp b/unittest/storage/test_compaction_policy.cpp index cc2541a421..74b211e293 100644 --- a/unittest/storage/test_compaction_policy.cpp +++ b/unittest/storage/test_compaction_policy.cpp @@ -984,7 +984,7 @@ TEST_F(TestCompactionPolicy, check_major_merge_basic) ObGetMergeTablesParam param; param.merge_type_ = ObMergeType::MAJOR_MERGE; - param.merge_version_ = 340; + param.merge_version_ = 350; ObGetMergeTablesResult result; FakeLS ls; ret = ObPartitionMergePolicy::get_medium_merge_tables(param, ls, *tablet_handle_.get_obj(), result);