From 193d0cd14350909e64ef3bb0d420b0c9d758dbca Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 30 Dec 2022 12:08:12 +0000 Subject: [PATCH] add force freeze before medium --- .../compaction/ob_medium_compaction_func.cpp | 15 ++++++--- .../compaction/ob_partition_merge_policy.cpp | 31 ++++++++++++++++--- .../compaction/ob_partition_merge_policy.h | 3 +- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/storage/compaction/ob_medium_compaction_func.cpp b/src/storage/compaction/ob_medium_compaction_func.cpp index 69e2266d34..55d5d8ec02 100644 --- a/src/storage/compaction/ob_medium_compaction_func.cpp +++ b/src/storage/compaction/ob_medium_compaction_func.cpp @@ -803,14 +803,18 @@ int ObMediumCompactionScheduleFunc::check_need_merge_and_schedule( int tmp_ret = OB_SUCCESS; need_merge = false; bool can_merge = false; + bool need_force_freeze = false; + const ObLSID &ls_id = ls.get_ls_id(); + const ObTabletID &tablet_id = tablet.get_tablet_meta().tablet_id_; if (OB_FAIL(ObPartitionMergePolicy::check_need_medium_merge( ls, tablet, schedule_scn, need_merge, - can_merge))) { // check merge finish - LOG_WARN("failed to check medium merge", K(ret), K(ls_id), "tablet_id", tablet.get_tablet_meta().tablet_id_); + can_merge, + need_force_freeze))) { // check merge finish + LOG_WARN("failed to check medium merge", K(ret), K(ls_id), K(tablet_id)); } else if (need_merge && can_merge) { const ObMediumCompactionInfo *medium_info = nullptr; if (OB_FAIL(tablet.get_medium_compaction_info_list().get_specified_scn_info(schedule_scn, medium_info))) { @@ -823,12 +827,15 @@ int ObMediumCompactionScheduleFunc::check_need_merge_and_schedule( medium_info->is_major_compaction()))) { if (OB_SIZE_OVERFLOW != tmp_ret && OB_EAGAIN != tmp_ret) { ret = tmp_ret; - LOG_WARN("failed to schedule medium merge dag", K(ret), K(ls_id), - "tablet_id", tablet.get_tablet_meta().tablet_id_); + LOG_WARN("failed to schedule medium merge dag", K(ret), K(ls_id), K(tablet_id)); } } else { LOG_DEBUG("success to schedule medium merge dag", K(ret), K(schedule_scn)); } + } else if (need_force_freeze) { + if (OB_FAIL(MTL(ObTenantFreezer *)->tablet_freeze(tablet_id, true/*force_freeze*/))) { + LOG_WARN("failed to force freeze tablet", K(ret), K(ls_id), K(tablet_id)); + } } return ret; } diff --git a/src/storage/compaction/ob_partition_merge_policy.cpp b/src/storage/compaction/ob_partition_merge_policy.cpp index 4493433622..2a5307ee57 100644 --- a/src/storage/compaction/ob_partition_merge_policy.cpp +++ b/src/storage/compaction/ob_partition_merge_policy.cpp @@ -868,7 +868,8 @@ int ObPartitionMergePolicy::check_need_medium_merge( storage::ObTablet &tablet, const int64_t medium_snapshot, bool &need_merge, - bool &can_merge) + bool &can_merge, + bool &need_force_freeze) { int ret = OB_SUCCESS; need_merge = false; @@ -883,9 +884,31 @@ int ObPartitionMergePolicy::check_need_medium_merge( need_merge = last_major->get_snapshot_version() < medium_snapshot; if (need_merge && is_tablet_data_status_complete - && tablet.get_tablet_meta().max_serialized_medium_scn_ >= medium_snapshot && ObTenantTabletScheduler::check_weak_read_ts_ready(medium_snapshot, ls)) { - can_merge = true; + can_merge = tablet.get_snapshot_version() >= medium_snapshot; + if (!can_merge) { + ObTabletMemtableMgr *memtable_mgr = nullptr; + ObTableHandleV2 memtable_handle; + memtable::ObMemtable *last_frozen_memtable = nullptr; + if (OB_ISNULL(memtable_mgr = static_cast(tablet.get_memtable_mgr()))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("memtable mgr is unexpected null", K(ret), K(tablet)); + } else if (OB_FAIL(memtable_mgr->get_last_frozen_memtable(memtable_handle))) { + if (OB_ENTRY_NOT_EXIST == ret) { // no frozen memtable, need force freeze + need_force_freeze = true; + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to get last frozen memtable", K(ret)); + } + } else if (OB_FAIL(memtable_handle.get_data_memtable(last_frozen_memtable))) { + LOG_WARN("failed to get last frozen memtable", K(ret)); + } else { + need_force_freeze = last_frozen_memtable->get_snapshot_version() < medium_snapshot; + if (!need_force_freeze) { + LOG_INFO("tablet no need force freeze", K(ret), K(tablet_id), K(medium_snapshot), KPC(last_frozen_memtable)); + } + } + } } } @@ -894,7 +917,7 @@ int ObPartitionMergePolicy::check_need_medium_merge( K(need_merge), K(can_merge), K(medium_snapshot), K(is_tablet_data_status_complete)); ADD_SUSPECT_INFO(MAJOR_MERGE, tablet.get_tablet_meta().ls_id_, tablet_id, "need major merge but can't merge now", - K(medium_snapshot), K(is_tablet_data_status_complete), + K(medium_snapshot), K(is_tablet_data_status_complete), K(need_force_freeze), "max_serialized_medium_scn", tablet.get_tablet_meta().max_serialized_medium_scn_); } return ret; diff --git a/src/storage/compaction/ob_partition_merge_policy.h b/src/storage/compaction/ob_partition_merge_policy.h index 1664b42014..8f6b711981 100644 --- a/src/storage/compaction/ob_partition_merge_policy.h +++ b/src/storage/compaction/ob_partition_merge_policy.h @@ -75,7 +75,8 @@ public: storage::ObTablet &tablet, const int64_t medium_snapshot, bool &need_merge, - bool &can_merge); + bool &can_merge, + bool &need_force_freeze); static int generate_parallel_minor_interval( const ObGetMergeTablesResult &input_result, ObMinorExecuteRangeMgr &minor_range_mgr,