From c17be9100a6fe51d38f5e23bd5f666be2aa34bfb Mon Sep 17 00:00:00 2001 From: fengdeyiji <546976189@qq.com> Date: Tue, 30 Jul 2024 08:13:03 +0000 Subject: [PATCH] [MDS] skip error when scan ls in tenant in __all_virtual_mds_node_stat --- .../ob_all_virtual_mds_node_stat.cpp | 155 +++++++++++------- .../ob_all_virtual_mds_node_stat.h | 10 ++ 2 files changed, 105 insertions(+), 60 deletions(-) diff --git a/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp b/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp index c3e408601e..604adf41f1 100644 --- a/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp @@ -33,63 +33,104 @@ using namespace omt; namespace observer { +static constexpr int64_t BUFFER_SIZE = 32_MB; + +struct ApplyOnTabletOp { + ApplyOnTabletOp(ObAllVirtualMdsNodeStat *table, char *temp_buffer) : table_(table), temp_buffer_(temp_buffer) {} + int operator()(ObTablet &tablet) { + int ret = OB_SUCCESS; + MdsNodeInfoForVirtualTable mds_info; + mds::MdsTableHandle mds_table_handle; + ObArray row_array; + if (OB_FAIL(table_->get_mds_table_handle_(tablet, mds_table_handle, false))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + MDS_LOG(WARN, "failed to get_mds_table_handle_", K(ret), K(*table_)); + } + } else if (OB_FAIL(mds_table_handle.fill_virtual_info(row_array))) { + MDS_LOG(WARN, "failed to fill_virtual_info from mds_table", K(ret), K(*table_)); + } + if (OB_SUCC(ret)) { + if (OB_FAIL(tablet.fill_virtual_info(row_array))) { + MDS_LOG(WARN, "failed to fill_virtual_info from tablet", K(ret), K(*table_)); + } else { + for (int64_t idx = 0; idx < row_array.count() && OB_SUCC(ret); ++idx) { + if (OB_FAIL(table_->convert_node_info_to_row_(row_array[idx], temp_buffer_, BUFFER_SIZE, table_->cur_row_))) { + MDS_LOG(WARN, "failed to convert_node_info_to_row_", K(ret), K(*table_)); + } else if (OB_FAIL(table_->scanner_.add_row(table_->cur_row_))) { + MDS_LOG(WARN, "fail to add_row to scanner_", K(MTL_ID()), K(*table_)); + } + } + } + } + return ret; + } + ObAllVirtualMdsNodeStat *table_; + char *temp_buffer_; +}; + +struct ApplyOnLSOp { + ApplyOnLSOp(ObAllVirtualMdsNodeStat *table, ApplyOnTabletOp &apply_on_tablet_op) + : table_(table), + apply_on_tablet_op_(apply_on_tablet_op) {} + int operator()(ObLS &ls) { + int ret = OB_SUCCESS; + if (table_->judege_in_ranges(ls.get_ls_id(), table_->ls_ranges_)) { + (void) table_->get_tablet_info_(ls, apply_on_tablet_op_); + } else { + MDS_LOG(TRACE, "not in ranges", K(ret), K(*table_)); + } + return OB_SUCCESS; + } + ObAllVirtualMdsNodeStat *table_; + ApplyOnTabletOp &apply_on_tablet_op_; +}; + +struct ApplyOnTenantOp { + ApplyOnTenantOp(ObAllVirtualMdsNodeStat *table, ApplyOnLSOp &op) : table_(table), op_(op) {} + int operator()() { + int ret = OB_SUCCESS; + if (table_->judege_in_ranges(MTL_ID(), table_->tenant_ranges_)) { + if (OB_FAIL(ObTenantMdsService::for_each_ls_in_tenant(op_))) { + MDS_LOG(WARN, "failed to do for_each_ls_in_tenant", K(ret)); + ret = OB_SUCCESS; + } + } else { + MDS_LOG(TRACE, "not in ranges", K(ret), K(*table_)); + } + return ret; + } + ObAllVirtualMdsNodeStat *table_; + ApplyOnLSOp &op_; +}; + +int ObAllVirtualMdsNodeStat::get_mds_table_handle_(ObTablet &tablet, + mds::MdsTableHandle &handle, + const bool create_if_not_exist) +{ + return tablet.get_mds_table_handle_(handle, create_if_not_exist); +} + int ObAllVirtualMdsNodeStat::inner_get_next_row(common::ObNewRow *&row) { int ret = OB_SUCCESS; if (false == start_to_read_) { if (OB_FAIL(get_primary_key_ranges_())) { MDS_LOG(WARN, "fail to get index scan ranges", KR(ret), K(MTL_ID()), K(*this)); + } else if (tablet_points_.empty()) { + ret = OB_NOT_SUPPORTED; + MDS_LOG(WARN, "tenant_id/ls_id/tablet_id must be specified", KR(ret), K(MTL_ID()), K(*this)); } else { char *temp_buffer = nullptr; - char *to_string_buffer = nullptr; - constexpr int64_t BUFFER_SIZE = 32_MB; if (OB_ISNULL(temp_buffer = (char *)mtl_malloc(BUFFER_SIZE, "VirMdsStat"))) { ret = OB_ALLOCATE_MEMORY_FAILED; MDS_LOG(WARN, "fail to alloc buffer", K(MTL_ID()), K(*this)); } else { - auto apply_on_tablet_op = [this, temp_buffer](ObTablet &tablet) -> int { - int ret = OB_SUCCESS; - MdsNodeInfoForVirtualTable mds_info; - mds::MdsTableHandle mds_table_handle; - ObArray row_array; - if (OB_FAIL(tablet.get_mds_table_handle_(mds_table_handle, false))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; - } else { - MDS_LOG(WARN, "failed to get_mds_table_handle_", K(ret), K(*this)); - } - } else if (OB_FAIL(mds_table_handle.fill_virtual_info(row_array))) { - MDS_LOG(WARN, "failed to fill_virtual_info from mds_table", K(ret), K(*this)); - } - if (OB_SUCC(ret)) { - if (OB_FAIL(tablet.fill_virtual_info(row_array))) { - MDS_LOG(WARN, "failed to fill_virtual_info from tablet", K(ret), K(*this)); - } else { - for (int64_t idx = 0; idx < row_array.count() && OB_SUCC(ret); ++idx) { - if (OB_FAIL(convert_node_info_to_row_(row_array[idx], temp_buffer, BUFFER_SIZE, cur_row_))) { - MDS_LOG(WARN, "failed to convert_node_info_to_row_", K(ret), K(*this)); - } else if (OB_FAIL(scanner_.add_row(cur_row_))) { - MDS_LOG(WARN, "fail to add_row to scanner_", K(MTL_ID()), K(*this)); - } - } - } - } - return ret; - }; - auto func_iterate_tenant = [&apply_on_tablet_op, this]() -> int - { - int ret = OB_SUCCESS; - if (judege_in_ranges(MTL_ID(), tenant_ranges_)) { - if (OB_FAIL(ObTenantMdsService::for_each_ls_in_tenant([&ret, &apply_on_tablet_op, this](ObLS &ls) { - if (judege_in_ranges(ls.get_ls_id(), ls_ranges_)) { - ret = get_tablet_info_(ls, apply_on_tablet_op); - } else { MDS_LOG(TRACE, "not in ranges", K(ret), K(*this)); } - return ret; - }))) {} - } else { MDS_LOG(TRACE, "not in ranges", K(ret), K(*this)); } - return ret; - }; - if (OB_FAIL(omt_->operate_each_tenant_for_sys_or_self(func_iterate_tenant))) { + ApplyOnTabletOp apply_on_table_op(this, temp_buffer); + ApplyOnLSOp apply_on_ls_op(this, apply_on_table_op); + ApplyOnTenantOp apply_on_tenant_op(this, apply_on_ls_op); + if (OB_FAIL(omt_->operate_each_tenant_for_sys_or_self(apply_on_tenant_op))) { MDS_LOG(WARN, "ObMultiTenant operate_each_tenant_for_sys_or_self failed", K(ret), K(*this)); } else { scanner_it_ = scanner_.begin(); @@ -294,22 +335,16 @@ int ObAllVirtualMdsNodeStat::get_tablet_info_(ObLS &ls, const ObFunction