From 086a94c07d799b7c98f996d846477c748d869b19 Mon Sep 17 00:00:00 2001 From: simonjoylet Date: Thu, 8 Feb 2024 12:45:44 +0000 Subject: [PATCH] the ddl merge task of data tablet need wait lob tablet to create major sstable first --- src/storage/ddl/ob_ddl_merge_task.cpp | 38 +++++++++++++++++++ .../mysql_test/test_suite/msdt/t/lob.test | 14 +++++++ 2 files changed, 52 insertions(+) diff --git a/src/storage/ddl/ob_ddl_merge_task.cpp b/src/storage/ddl/ob_ddl_merge_task.cpp index 4df596f4f3..9107905936 100644 --- a/src/storage/ddl/ob_ddl_merge_task.cpp +++ b/src/storage/ddl/ob_ddl_merge_task.cpp @@ -36,6 +36,7 @@ #include "storage/column_store/ob_column_oriented_sstable.h" #include "storage/ddl/ob_direct_insert_sstable_ctx_new.h" #include "storage/column_store/ob_column_oriented_sstable.h" +#include "storage/compaction/ob_tenant_tablet_scheduler.h" using namespace oceanbase::observer; using namespace oceanbase::share::schema; @@ -208,6 +209,37 @@ int ObDDLTableMergeTask::init(const ObDDLTableMergeDagParam &ddl_dag_param, cons return ret; } +int wait_lob_tablet_major_exist(ObLSHandle &ls_handle, ObTablet &tablet) +{ + int ret = OB_SUCCESS; + ObTabletBindingMdsUserData ddl_data; + const ObTabletMeta &tablet_meta = tablet.get_tablet_meta(); + ObTenantDirectLoadMgr *tenant_direct_load_mgr = MTL(ObTenantDirectLoadMgr *); + ObTabletDirectLoadMgrHandle direct_load_mgr_handle; + ObDDLTableMergeDagParam param; + bool is_major_sstable_exist = false; + if (OB_FAIL(tablet.ObITabletMdsInterface::get_ddl_data(share::SCN::max_scn(), ddl_data))) { + LOG_WARN("failed to get ddl data from tablet", K(ret), K(tablet_meta)); + } else if (ddl_data.lob_meta_tablet_id_.is_valid()) { + ObTabletHandle lob_tablet_handle; + const ObTabletID lob_tablet_id = ddl_data.lob_meta_tablet_id_; + if (OB_FAIL(ObDDLUtil::ddl_get_tablet(ls_handle, lob_tablet_id, lob_tablet_handle, ObMDSGetTabletMode::READ_ALL_COMMITED))) { + LOG_WARN("get lob tablet handle failed", K(ret), K(lob_tablet_id)); + } else { + bool is_major_sstable_exist = lob_tablet_handle.get_obj()->get_major_table_count() > 0 + || lob_tablet_handle.get_obj()->get_tablet_meta().table_store_flag_.with_major_sstable(); + if (!is_major_sstable_exist) { + ret = OB_EAGAIN; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(compaction::ObTenantTabletScheduler::schedule_tablet_ddl_major_merge(ls_handle.get_ls()->get_ls_id(), lob_tablet_handle))) { + LOG_WARN("schedule ddl major merge for lob tablet failed", K(tmp_ret), K(lob_tablet_id)); + } + } + } + } + return ret; +} + int ObDDLTableMergeTask::process() { int ret = OB_SUCCESS; @@ -286,6 +318,12 @@ int ObDDLTableMergeTask::process() LOG_WARN("get tablet direct load mgr failed", K(ret), K(merge_param_)); } else if (OB_FAIL(tablet_mgr_hdl.get_full_obj()->prepare_major_merge_param(ddl_param))) { LOG_WARN("preare full direct load sstable param failed", K(ret)); + } else if (merge_param_.is_commit_ && OB_FAIL(wait_lob_tablet_major_exist(ls_handle, *tablet_handle.get_obj()))) { + if (OB_EAGAIN != ret) { + LOG_WARN("wait lob tablet major sstable exist faild", K(ret), K(merge_param_)); + } else { + LOG_INFO("need wait lob tablet major sstable exist", K(ret), K(merge_param_)); + } } else if (merge_param_.start_scn_ > SCN::min_scn() && merge_param_.start_scn_ < ddl_param.start_scn_) { ret = OB_TASK_EXPIRED; LOG_INFO("ddl merge task expired, do nothing", K(merge_param_), "new_start_scn", ddl_param.start_scn_); diff --git a/tools/deploy/mysql_test/test_suite/msdt/t/lob.test b/tools/deploy/mysql_test/test_suite/msdt/t/lob.test index f11f073c20..25497e11ef 100644 --- a/tools/deploy/mysql_test/test_suite/msdt/t/lob.test +++ b/tools/deploy/mysql_test/test_suite/msdt/t/lob.test @@ -21,6 +21,20 @@ let $report_cnt1 = query_get_value(select count(*) as cnt from oceanbase.__all_v let $unit_cnt1 = query_get_value(select count(*) as cnt from oceanbase.__all_virtual_unit where tenant_id = $tenant_id1, cnt, 1); --disable_query_log + +let $__i__= 120; +while($__i__ > 0) +{ + sleep 1; + dec $__i__; + let $report_cnt1 = query_get_value(select count(*) as cnt from oceanbase.__all_virtual_tablet_meta_table where tenant_id = $tenant_id1 and ls_id = $ls_id1 and tablet_id = $tablet_id1, cnt, 1); + if($report_cnt1 == $unit_cnt1) + { + let $__i__ = -1; + } +} + + eval select $report_cnt1 = $unit_cnt1 as result; --enable_query_log