diff --git a/src/storage/column_store/ob_co_merge_dag.cpp b/src/storage/column_store/ob_co_merge_dag.cpp index dade6b256..2a88f1a16 100644 --- a/src/storage/column_store/ob_co_merge_dag.cpp +++ b/src/storage/column_store/ob_co_merge_dag.cpp @@ -1293,7 +1293,9 @@ int ObCOMergeDagNet::inner_create_and_schedule_dags(ObIDag *parent_dag) if (EN_COMPACTION_ADD_CO_MREGE_FINISH_DAG_INTO_DAG_NET_FAILED) { ret = EN_COMPACTION_ADD_CO_MREGE_FINISH_DAG_INTO_DAG_NET_FAILED; LOG_INFO("ERRSIM EN_COMPACTION_ADD_CO_MREGE_FINISH_DAG_INTO_DAG_NET_FAILED", K(ret), KPC(parent_dag)); + SERVER_EVENT_SYNC_ADD("merge_errsim", "co_merge_finish_dag_add_failed", "ret_code", ret); } + #endif ObCOMergeFinishDag *tmp_finish_dag = nullptr; // add into dag_scheduler after parent-child relation generated diff --git a/src/storage/compaction/ob_basic_tablet_merge_ctx.h b/src/storage/compaction/ob_basic_tablet_merge_ctx.h index 6edccf3ae..57f944f6b 100644 --- a/src/storage/compaction/ob_basic_tablet_merge_ctx.h +++ b/src/storage/compaction/ob_basic_tablet_merge_ctx.h @@ -162,9 +162,8 @@ public: int64_t get_result_progressive_merge_step(const int64_t column_group_idx) const { return progressive_merge_mgr_.is_inited() - ? progressive_merge_mgr_.get_result_progressive_merge_step( - get_tablet_id(), column_group_idx) - : 0; + ? progressive_merge_mgr_.get_result_progressive_merge_step(get_tablet_id(), column_group_idx) + : 0; } OB_INLINE int filter(const blocksstable::ObDatumRow &row, ObICompactionFilter::ObFilterRet &filter_ret) { diff --git a/src/storage/compaction/ob_partition_merge_policy.cpp b/src/storage/compaction/ob_partition_merge_policy.cpp index 6cd546661..1bc0fa88b 100644 --- a/src/storage/compaction/ob_partition_merge_policy.cpp +++ b/src/storage/compaction/ob_partition_merge_policy.cpp @@ -35,6 +35,7 @@ #include "storage/access/ob_table_estimator.h" #include "storage/access/ob_index_sstable_estimator.h" #include "storage/ddl/ob_tablet_ddl_kv.h" +#include "observer/ob_server_event_history_table_operator.h" namespace oceanbase { @@ -1958,6 +1959,7 @@ int ObCOMajorMergePolicy::decide_co_major_merge_type( } else if (OB_UNLIKELY(EN_COMPACTION_DISABLE_ROW_COL_SWITCH)) { major_merge_type = is_major_sstable_match_schema(major_sstable_status) ? BUILD_COLUMN_STORE_MERGE : USE_RS_BUILD_SCHEMA_MATCH_MERGE; LOG_INFO("[RowColSwitch] disable row col switch, only allow co major merge", K(tablet_id), K(co_sstable), K(tables), K(major_sstable_status), K(major_merge_type)); + SERVER_EVENT_SYNC_ADD("row_col_switch", "disable_row_col_switch", "tablet_id", tablet_id); } else if (OB_FAIL(accumulate_physical_row_cnt(tables, physical_row_cnt))) { // if accumulate row cnt failed, make major sstable match schema major_merge_type = is_major_sstable_match_schema(major_sstable_status) ? BUILD_COLUMN_STORE_MERGE : USE_RS_BUILD_SCHEMA_MATCH_MERGE; diff --git a/src/storage/compaction/ob_progressive_merge_helper.cpp b/src/storage/compaction/ob_progressive_merge_helper.cpp index 15ee080fd..52562f8f6 100644 --- a/src/storage/compaction/ob_progressive_merge_helper.cpp +++ b/src/storage/compaction/ob_progressive_merge_helper.cpp @@ -90,26 +90,24 @@ int ObProgressiveMergeMgr::init( } int64_t ObProgressiveMergeMgr::get_result_progressive_merge_step( - const ObTabletID &tablet_id, - const int64_t column_group_idx) const // parameters are used for print log + const ObTabletID &tablet_id, + const int64_t column_group_idx) const // parameters are used for print log { int64_t result_step = MIN(progressive_merge_num_, progressive_merge_step_ + 1); - if (data_version_ >= DATA_VERSION_4_3_3_0 - && finish_cur_round_ - && result_step < progressive_merge_num_) { + + if (data_version_ >= DATA_VERSION_4_3_3_0 && finish_cur_round_ && result_step < progressive_merge_num_) { if (0 == column_group_idx) { // only print once FLOG_INFO("finish cur progressive_merge_round", K(tablet_id), K(result_step), K_(progressive_merge_round), K_(progressive_merge_step), K_(progressive_merge_num)); - + } + result_step = progressive_merge_num_; // this result will be used to update pregressive merge step on sstable meta #ifdef ERRSIM SERVER_EVENT_SYNC_ADD("merge_errsim", "progressive_merge_finish", "tablet_id", tablet_id.id(), "progressive_merge_round", progressive_merge_round_, - "progressive_merge_step", progressive_merge_step_, + "progressive_merge_step", result_step, "progressive_merge_num", progressive_merge_num_); #endif - } - result_step = progressive_merge_num_; } return result_step; } diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index afc387c83..75b2a4a0b 100644 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -94,6 +94,7 @@ #include "storage/ob_direct_load_table_guard.h" #include "share/ob_tablet_replica_checksum_operator.h" #include "storage/blocksstable/ob_datum_row_utils.h" +#include "storage/compaction/ob_partition_merge_policy.h" namespace oceanbase { @@ -5843,45 +5844,65 @@ int ObTablet::get_kept_snapshot_info( int ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS; snapshot_info.reset(); - int64_t max_merged_snapshot = 0; - int64_t min_medium_snapshot = INT64_MAX; - int64_t old_min_reserved_snapshot = 0; const share::ObLSID &ls_id = tablet_meta_.ls_id_; const common::ObTabletID &tablet_id = tablet_meta_.tablet_id_; - if (0 < get_major_table_count()) { - max_merged_snapshot = get_last_major_snapshot_version(); + const int64_t last_major_snapshot_version = get_last_major_snapshot_version(); + bool need_check_medium_info = false; + int64_t max_merged_snapshot = 0; + if (0 == last_major_snapshot_version) { + // do nothing + } else if (!GCTX.is_shared_storage_mode() || last_major_snapshot_version >= MERGE_SCHEDULER_PTR->get_inner_table_merged_scn()) { + max_merged_snapshot = last_major_snapshot_version; +#ifdef OB_BUILD_SHARED_STORAGE + } else { + max_merged_snapshot = MERGE_SCHEDULER_PTR->get_inner_table_merged_scn(); + need_check_medium_info = true; +#endif } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(MTL(ObTenantFreezeInfoMgr*)->get_min_reserved_snapshot( - tablet_id, max_merged_snapshot, snapshot_info))) { - LOG_WARN("failed to get multi version from freeze info mgr", K(ret), K(tablet_id)); - } else if (!is_ls_inner_tablet()) { + int64_t min_medium_snapshot = INT64_MAX; + if (!is_ls_inner_tablet()) { common::ObArenaAllocator allocator; SMART_VARS_2((ObTableScanParam, scan_param), (ObTabletMediumInfoReader, medium_info_reader)) { - if (OB_FAIL(ObMdsScanParamHelper::build_medium_info_scan_param( - allocator, - ls_id, - tablet_id, - scan_param))) { + if (OB_FAIL(ObMdsScanParamHelper::build_medium_info_scan_param(allocator, ls_id, tablet_id, scan_param))) { LOG_WARN("fail to build scan param", K(ret), K(ls_id), K(tablet_id)); } else if (OB_FAIL(medium_info_reader.init(*this, scan_param))) { LOG_WARN("failed to init medium info reader", K(ret)); - } else if (OB_FAIL(medium_info_reader.get_min_medium_snapshot(max_merged_snapshot, min_medium_snapshot))) { + } else if (need_check_medium_info) { + ObMediumCompactionInfoKey medium_info_key(max_merged_snapshot); + ObMediumCompactionInfo *medium_info = nullptr; + if (OB_FAIL(ObTabletObjLoadHelper::alloc_and_new(allocator, medium_info))) { + LOG_WARN("fail to alloc and new", K(ret)); + } else if (OB_FAIL(medium_info_reader.get_specified_medium_info(allocator, medium_info_key, *medium_info))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + max_merged_snapshot = last_major_snapshot_version; + } else { + LOG_WARN("failed to get specified scn info", K(ret), K(max_merged_snapshot)); + } + } else if (ObAdaptiveMergePolicy::DURING_DDL != medium_info->medium_merge_reason_) { + max_merged_snapshot = last_major_snapshot_version; + } + } + + if (FAILEDx(medium_info_reader.get_min_medium_snapshot(max_merged_snapshot, min_medium_snapshot))) { LOG_WARN("failed to get min medium snapshot", K(ret), K(tablet_id)); } } } - if (OB_SUCC(ret)) { + ObStorageSnapshotInfo old_snapshot_info; + if (FAILEDx(MTL(ObTenantFreezeInfoMgr*)->get_min_reserved_snapshot(tablet_id, max_merged_snapshot, snapshot_info))) { + LOG_WARN("failed to get multi version from freeze info mgr", K(ret), K(tablet_id)); + } else { + old_snapshot_info = snapshot_info; bool use_multi_version_start_on_tablet = false; - old_min_reserved_snapshot = snapshot_info.snapshot_; - const bool is_new_mv_in_restore = ObSnapShotType::SNAPSHOT_FOR_MAJOR_REFRESH_MV == snapshot_info.snapshot_type_ && - 0 == snapshot_info.snapshot_; - // if exist new mv in restore, use special snapshot info + if (!tablet_meta_.ha_status_.is_data_status_complete()) { use_multi_version_start_on_tablet = true; + } else if (ObSnapShotType::SNAPSHOT_FOR_MAJOR_REFRESH_MV == snapshot_info.snapshot_type_ && 0 == snapshot_info.snapshot_) { + use_multi_version_start_on_tablet = true; // if exist new mv in restore, use special snapshot info } else if (min_reserved_snapshot_on_ls > 0) { snapshot_info.update_by_smaller_snapshot(ObStorageSnapshotInfo::SNAPSHOT_FOR_LS_RESERVED, min_reserved_snapshot_on_ls); snapshot_info.update_by_smaller_snapshot(ObStorageSnapshotInfo::SNAPSHOT_FOR_MIN_MEDIUM, min_medium_snapshot); @@ -5892,7 +5913,7 @@ int ObTablet::get_kept_snapshot_info( // if not sync ls_reserved_snapshot yet, should use multi_version_start on tablet use_multi_version_start_on_tablet = true; } - if (use_multi_version_start_on_tablet || is_new_mv_in_restore) { + if (use_multi_version_start_on_tablet) { snapshot_info.snapshot_type_ = ObStorageSnapshotInfo::SNAPSHOT_MULTI_VERSION_START_ON_TABLET; snapshot_info.snapshot_ = get_multi_version_start(); } @@ -5902,9 +5923,9 @@ int ObTablet::get_kept_snapshot_info( if (current_time - (snapshot_info.snapshot_ / 1000 /*use microsecond here*/) > 2_hour) { if (REACH_TENANT_TIME_INTERVAL(10_s)) { LOG_INFO("tablet multi version start not advance for a long time", K(ret), - "ls_id", get_tablet_meta().ls_id_, K(tablet_id), - K(snapshot_info), K(old_min_reserved_snapshot), K(min_medium_snapshot), - K(min_reserved_snapshot_on_ls)); + "ls_id", get_tablet_meta().ls_id_, K(tablet_id), + K(snapshot_info), K(old_snapshot_info), K(min_medium_snapshot), + K(min_reserved_snapshot_on_ls)); } } } @@ -5913,8 +5934,8 @@ int ObTablet::get_kept_snapshot_info( LOG_WARN("snapshot info is invalid", KR(ret), K(snapshot_info)); } LOG_INFO("get multi version start", "ls_id", get_tablet_meta().ls_id_, K(tablet_id), - K(snapshot_info), K(old_min_reserved_snapshot), - K(min_medium_snapshot), K(min_reserved_snapshot_on_ls), K(max_merged_snapshot)); + K(snapshot_info), K(old_snapshot_info), + K(min_medium_snapshot), K(min_reserved_snapshot_on_ls), K(max_merged_snapshot)); return ret; }