From cba9180f18aad47bce7b055a543f35df2f6c9016 Mon Sep 17 00:00:00 2001 From: renju96 Date: Tue, 2 Jan 2024 09:12:48 +0000 Subject: [PATCH] bugfix: pass tablet from get_table_param to get corresponding version of ddlkv --- .../ob_index_block_data_prepare.h | 4 ++ .../access/ob_index_sstable_estimator.cpp | 2 - .../access/ob_index_tree_prefetcher.cpp | 22 +++++- src/storage/access/ob_multiple_merge.cpp | 2 + src/storage/access/ob_table_access_param.cpp | 2 + src/storage/access/ob_table_access_param.h | 3 + .../ob_ddl_index_block_row_iterator.cpp | 67 ++++--------------- .../ob_index_block_row_scanner.cpp | 21 ++---- .../index_block/ob_index_block_row_scanner.h | 12 ++-- 9 files changed, 51 insertions(+), 84 deletions(-) diff --git a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h index e5debf109..34a57e47b 100644 --- a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h +++ b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h @@ -137,6 +137,8 @@ protected: int64_t mirco_blocks_per_macro_block_; bool is_cg_data_; bool is_ddl_merge_data_; + ObGetTableParam get_table_param_; + }; ObArenaAllocator TestIndexBlockDataPrepare::allocator_; @@ -297,6 +299,8 @@ void TestIndexBlockDataPrepare::SetUp() ASSERT_EQ(OB_SUCCESS, TestTabletHelper::create_tablet(ls_handle, tablet_id, table_schema_, allocator_)); ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle_)); + get_table_param_.tablet_iter_.set_tablet_handle(tablet_handle_); + iter_param_.set_table_param(&get_table_param_); sstable_.key_.table_type_ = ObITable::TableType::COLUMN_ORIENTED_SSTABLE; if (is_cg_data_ && is_ddl_merge_data_) { diff --git a/src/storage/access/ob_index_sstable_estimator.cpp b/src/storage/access/ob_index_sstable_estimator.cpp index 595eeb4f2..5e85bdf9d 100644 --- a/src/storage/access/ob_index_sstable_estimator.cpp +++ b/src/storage/access/ob_index_sstable_estimator.cpp @@ -90,8 +90,6 @@ int ObIndexBlockScanEstimator::estimate_row_count(ObPartitionEst &part_est) STORAGE_LOG(WARN, "Failed to get index tree root", K(ret)); } else if (context_.sstable_.is_ddl_merge_sstable()) { index_block_row_scanner_.set_iter_param(&context_.sstable_, - context_.tablet_handle_.get_obj()->get_ls_id(), - context_.tablet_handle_.get_obj()->get_tablet_id(), context_.tablet_handle_.get_obj()); } if (OB_FAIL(ret)) { diff --git a/src/storage/access/ob_index_tree_prefetcher.cpp b/src/storage/access/ob_index_tree_prefetcher.cpp index 11e3a4ac9..d40b413c5 100644 --- a/src/storage/access/ob_index_tree_prefetcher.cpp +++ b/src/storage/access/ob_index_tree_prefetcher.cpp @@ -119,7 +119,13 @@ int ObIndexTreePrefetcher::init_basic_info( index_tree_height_ = sstable_meta_handle_.get_sstable_meta().get_index_tree_height(sstable.is_ddl_merge_sstable() && is_normal_query); if (index_scanner_.is_valid()) { - index_scanner_.switch_context(sstable, *datum_utils_, *access_ctx_); + if (OB_ISNULL(iter_param_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid iter param", K(ret), KPC(iter_param_), K(lbt())); + } else { + const ObTablet *cur_tablet = OB_ISNULL(iter_param_->get_table_param_) ? nullptr : iter_param_->get_table_param_->tablet_iter_.get_tablet(); + index_scanner_.switch_context(sstable, cur_tablet, *datum_utils_, *access_ctx_); + } } else if (OB_FAIL(init_index_scanner(index_scanner_))) { LOG_WARN("Fail to init index_scanner", K(ret)); } @@ -269,8 +275,12 @@ int ObIndexTreePrefetcher::init_index_scanner(ObIndexBlockRowScanner &index_scan sstable_->get_macro_offset(), sstable_->is_normal_cg_sstable()))) { LOG_WARN("init index scanner fail", K(ret), KPC(sstable_), KP(sstable_)); + } else if (OB_ISNULL(iter_param_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid iter param", K(ret), KPC(iter_param_), K(lbt())); } else { - index_scanner.set_iter_param(sstable_, access_ctx_->ls_id_, access_ctx_->tablet_id_); + const ObTablet *cur_tablet = OB_ISNULL(iter_param_->get_table_param_) ? nullptr : iter_param_->get_table_param_->tablet_iter_.get_tablet(); + index_scanner.set_iter_param(sstable_, cur_tablet); } return ret; } @@ -775,7 +785,13 @@ int ObIndexTreeMultiPassPrefetcher::s if (OB_SUCC(ret)) { for (int64_t level = 0; OB_SUCC(ret) && level < index_tree_height_; level++) { if (tree_handles_[level].index_scanner_.is_valid()) { - tree_handles_[level].index_scanner_.switch_context(sstable, *datum_utils_, *access_ctx_); + if (OB_ISNULL(iter_param_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid iter param", K(ret), KPC(iter_param_), K(lbt())); + } else { + const ObTablet *cur_tablet = OB_ISNULL(iter_param_->get_table_param_) ? nullptr : iter_param_->get_table_param_->tablet_iter_.get_tablet(); + tree_handles_[level].index_scanner_.switch_context(sstable, cur_tablet, *datum_utils_, *access_ctx_); + } } else if (OB_FAIL(init_index_scanner(tree_handles_[level].index_scanner_))) { LOG_WARN("Fail to init index_scanner", K(ret), K(level)); } diff --git a/src/storage/access/ob_multiple_merge.cpp b/src/storage/access/ob_multiple_merge.cpp index 5847977f6..e4dd53742 100644 --- a/src/storage/access/ob_multiple_merge.cpp +++ b/src/storage/access/ob_multiple_merge.cpp @@ -139,6 +139,7 @@ int ObMultipleMerge::init( } unprojected_row_.count_ = 0; get_table_param_ = &get_table_param; + access_param_->iter_param_.set_table_param(get_table_param_); const ObITableReadInfo *read_info = access_param_->iter_param_.get_read_info(); if (OB_SUCC(ret)) { if (OB_ISNULL(read_info)) { @@ -180,6 +181,7 @@ int ObMultipleMerge::switch_param( access_param_ = ¶m; access_ctx_ = &context; get_table_param_ = &get_table_param; + access_param_->iter_param_.set_table_param(get_table_param_); if (OB_FAIL(prepare_read_tables())) { STORAGE_LOG(WARN, "Failed to prepare read tables", K(ret), K(*this)); diff --git a/src/storage/access/ob_table_access_param.cpp b/src/storage/access/ob_table_access_param.cpp index f32266ead..bc127676a 100644 --- a/src/storage/access/ob_table_access_param.cpp +++ b/src/storage/access/ob_table_access_param.cpp @@ -31,6 +31,7 @@ ObTableIterParam::ObTableIterParam() tablet_id_(), read_info_(nullptr), rowkey_read_info_(nullptr), + get_table_param_(nullptr), cg_read_info_handle_(), out_cols_project_(NULL), agg_cols_project_(NULL), @@ -65,6 +66,7 @@ void ObTableIterParam::reset() tablet_id_.reset(); read_info_ = nullptr; rowkey_read_info_ = nullptr; + get_table_param_ = nullptr; cg_read_info_handle_.reset(); out_cols_project_ = NULL; agg_cols_project_ = NULL; diff --git a/src/storage/access/ob_table_access_param.h b/src/storage/access/ob_table_access_param.h index 8bd44d400..f82fcb4cc 100644 --- a/src/storage/access/ob_table_access_param.h +++ b/src/storage/access/ob_table_access_param.h @@ -141,6 +141,8 @@ public: { return pd_storage_flag_.set_use_column_store(true); } OB_INLINE void set_not_use_column_store() { return pd_storage_flag_.set_use_column_store(false); } + OB_INLINE void set_table_param(const ObGetTableParam *get_table_param) + { get_table_param_ = get_table_param; } OB_INLINE bool use_uniform_format() const { return op_->enable_rich_format_ && @@ -159,6 +161,7 @@ public: uint32_t cg_idx_; const ObITableReadInfo *read_info_; const ObITableReadInfo *rowkey_read_info_; + const ObGetTableParam *get_table_param_; ObCGReadInfoHandle cg_read_info_handle_; //TODO(huronghui.hrh):temp solution const ObColumnParam *cg_col_param_; diff --git a/src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.cpp b/src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.cpp index a3f1bd13b..c17357750 100644 --- a/src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.cpp +++ b/src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.cpp @@ -250,7 +250,7 @@ int ObDDLIndexBlockRowIterator::find_rowkeys_belong_to_same_idx_row(ObMicroIndex ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid rows info", K(ret)); } else { - const ObDatumRowkey *cur_rowkey = cur_rowkey = cur_tree_value_->rowkey_;; + const ObDatumRowkey *cur_rowkey = cur_tree_value_->rowkey_; bool is_decided = false; for (; OB_SUCC(ret) && rowkey_begin_idx < rowkey_end_idx; ++rowkey_begin_idx) { if (rows_info->is_row_skipped(rowkey_begin_idx)) { @@ -518,42 +518,21 @@ int ObDDLSStableAllRangeIterator::init(const ObMicroBlockData &idx_block_data, ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguement", K(ret), KPC(datum_utils), K(iter_param)); } else { - ObTablet *cur_tablet = nullptr; - ObTabletHandle tmp_tablet_handle; - if (OB_ISNULL(iter_param.tablet_)) { - //get tablet handle from ls - ObLSService *ls_service = MTL(ObLSService *); - ObLSHandle ls_handle; - if (OB_FAIL(ls_service->get_ls(iter_param.ls_id_, ls_handle, ObLSGetMod::DDL_MOD))) { - LOG_WARN("get ls failed", K(ret), K(iter_param.ls_id_)); - } else if (OB_FAIL(ObDDLUtil::ddl_get_tablet(ls_handle, - iter_param.tablet_id_, - tmp_tablet_handle, - ObMDSGetTabletMode::READ_ALL_COMMITED))) { - LOG_WARN("get tablet failed", K(ret), K(iter_param)); - } else { - cur_tablet = tmp_tablet_handle.get_obj(); + ObTablet *cur_tablet = const_cast(iter_param.tablet_); + if (iter_param.sstable_->is_normal_cg_sstable()) { + if (OB_FAIL(MTL(ObTenantCGReadInfoMgr *)->get_index_read_info(rowkey_read_info_))) { + LOG_WARN("failed to get index read info from ObTenantCGReadInfoMgr", K(ret)); } } else { - cur_tablet = const_cast(iter_param.tablet_); + rowkey_read_info_ = &cur_tablet->get_rowkey_read_info(); } - if (OB_SUCC(ret)) { - if (iter_param.sstable_->is_normal_cg_sstable()) { - if (OB_FAIL(MTL(ObTenantCGReadInfoMgr *)->get_index_read_info(rowkey_read_info_))) { - LOG_WARN("failed to get index read info from ObTenantCGReadInfoMgr", K(ret)); - } - } else { - rowkey_read_info_ = &cur_tablet->get_rowkey_read_info(); - } - if (OB_SUCC(ret)) { - iter_param_ = iter_param; + iter_param_ = iter_param; - is_reverse_scan_ = is_reverse_scan; - iter_step_ = is_reverse_scan_ ? -1 : 1; - datum_utils_ = datum_utils; - is_inited_ = true; - } + is_reverse_scan_ = is_reverse_scan; + iter_step_ = is_reverse_scan_ ? -1 : 1; + datum_utils_ = datum_utils; + is_inited_ = true; } } return ret; @@ -1179,33 +1158,13 @@ int ObDDLMergeBlockRowIterator::get_readable_ddl_kvs(const ObIndexBlockIterParam { int ret = OB_SUCCESS; // todo qilu :get DDLKV from ls or from tablet_handle now, opt this get DDLKV from MTL() after refactor ddl_kv_mgr - ObTablet *cur_tablet = nullptr; ddl_memtables.reset(); ObTabletHandle tmp_tablet_handle; if (OB_UNLIKELY(!iter_param.is_valid())) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("invalid iter param", K(ret), K(iter_param)); + LOG_WARN("invalid iter param", K(ret), K(iter_param), K(lbt())); } else { - if (OB_ISNULL(iter_param.tablet_)) { - //get tablet handle from ls - ObLSService *ls_service = MTL(ObLSService *); - ObLSHandle ls_handle; - if (OB_FAIL(ls_service->get_ls(iter_param.ls_id_, ls_handle, ObLSGetMod::DDL_MOD))) { - LOG_WARN("get ls failed", K(ret), K(iter_param.ls_id_)); - } else if (OB_FAIL(ObDDLUtil::ddl_get_tablet(ls_handle, - iter_param.tablet_id_, - tmp_tablet_handle, - ObMDSGetTabletMode::READ_ALL_COMMITED))) { - LOG_WARN("get tablet failed", K(ret), K(iter_param)); - } else { - cur_tablet = tmp_tablet_handle.get_obj(); - } - } else { - cur_tablet = const_cast(iter_param.tablet_); - } - } - - if (OB_SUCC(ret)) { + ObTablet *cur_tablet = const_cast(iter_param.tablet_); const uint16_t sstable_cg_idx = iter_param.sstable_->get_key().get_column_group_id(); ObDDLKvMgrHandle ddl_kv_mgr_handle; ObArray ddl_kvs_handle; diff --git a/src/storage/blocksstable/index_block/ob_index_block_row_scanner.cpp b/src/storage/blocksstable/index_block/ob_index_block_row_scanner.cpp index c8bca2195..003a33276 100644 --- a/src/storage/blocksstable/index_block/ob_index_block_row_scanner.cpp +++ b/src/storage/blocksstable/index_block/ob_index_block_row_scanner.cpp @@ -294,9 +294,7 @@ int ObIndexBlockDataTransformer::get_reader( /****************** ObIndexBlockIterParam **********************/ ObIndexBlockIterParam::ObIndexBlockIterParam() : sstable_(nullptr), - tablet_(nullptr), - ls_id_(), - tablet_id_() + tablet_(nullptr) { } @@ -309,8 +307,6 @@ ObIndexBlockIterParam &ObIndexBlockIterParam::operator=(const ObIndexBlockIterPa { sstable_ = other.sstable_; tablet_ = other.tablet_; - ls_id_ = other.ls_id_; - tablet_id_ = other.tablet_id_; return *this; } @@ -319,8 +315,6 @@ int ObIndexBlockIterParam::assign(const ObIndexBlockIterParam &other) int ret = OB_SUCCESS; sstable_ = other.sstable_; tablet_ = other.tablet_; - ls_id_ = other.ls_id_; - tablet_id_ = other.tablet_id_; return ret; } @@ -328,13 +322,11 @@ void ObIndexBlockIterParam::reset() { sstable_ = nullptr; tablet_ = nullptr; - ls_id_.reset(); - tablet_id_.reset(); } bool ObIndexBlockIterParam::is_valid() const { - return OB_NOT_NULL(sstable_) && ((ls_id_.is_valid() && tablet_id_.is_valid()) || OB_NOT_NULL(tablet_)); + return OB_NOT_NULL(sstable_) && OB_NOT_NULL(tablet_); } /****************** ObIndexBlockRowIterator **********************/ @@ -1564,13 +1556,9 @@ int ObIndexBlockRowScanner::get_next( } void ObIndexBlockRowScanner::set_iter_param(const blocksstable::ObSSTable *sstable, - const share::ObLSID &ls_id, - const common::ObTabletID &tablet_id, const ObTablet *tablet) { iter_param_.sstable_ = sstable; - iter_param_.ls_id_ = ls_id; - iter_param_.tablet_id_ = tablet_id; iter_param_.tablet_ = tablet; } @@ -1806,6 +1794,7 @@ const ObDatumRowkey &ObIndexBlockRowScanner::get_end_key() const } void ObIndexBlockRowScanner::switch_context(const ObSSTable &sstable, + const ObTablet *tablet, const ObStorageDatumUtils &datum_utils, ObTableAccessContext &access_ctx) { @@ -1815,9 +1804,7 @@ void ObIndexBlockRowScanner::switch_context(const ObSSTable &sstable, is_reverse_scan_ = access_ctx.query_flag_.is_reverse_scan(); is_normal_query_ = !access_ctx.query_flag_.is_daily_merge() && !access_ctx.query_flag_.is_multi_version_minor_merge(); iter_param_.sstable_ = &sstable; - iter_param_.ls_id_ = access_ctx.ls_id_; - iter_param_.tablet_id_ = access_ctx.tablet_id_; - iter_param_.tablet_ = nullptr; + iter_param_.tablet_ = tablet; int ret = OB_SUCCESS; if (OB_NOT_NULL(iter_)) { ObStorageDatumUtils *switch_datum_utils = const_cast(datum_utils_); diff --git a/src/storage/blocksstable/index_block/ob_index_block_row_scanner.h b/src/storage/blocksstable/index_block/ob_index_block_row_scanner.h index 21a8172fe..6246f264b 100644 --- a/src/storage/blocksstable/index_block/ob_index_block_row_scanner.h +++ b/src/storage/blocksstable/index_block/ob_index_block_row_scanner.h @@ -117,14 +117,11 @@ public: int assign(const ObIndexBlockIterParam &other); void reset(); bool is_valid() const; - TO_STRING_KV(KP(sstable_), KP(tablet_), K(ls_id_), K(tablet_id_)); + TO_STRING_KV(KP(sstable_), KP(tablet_)); public: const ObSSTable *sstable_; - // pass ls_id + table_id or directly pass tablet const ObTablet *tablet_; - share::ObLSID ls_id_; - common::ObTabletID tablet_id_; }; class ObIndexBlockRowIterator @@ -189,7 +186,7 @@ public: return OB_SUCCESS; } bool is_inited() { return is_inited_; } - VIRTUAL_TO_STRING_KV(K(is_inited_), K(is_reverse_scan_), K(iter_step_), K(idx_row_parser_), KPC(datum_utils_)); + VIRTUAL_TO_STRING_KV(K(is_inited_), K(is_reverse_scan_), K(iter_step_), KPC(datum_utils_)); protected: bool is_inited_; @@ -351,9 +348,7 @@ public: ObMicroIndexInfo &idx_block_row, const bool is_multi_check = false); void set_iter_param(const ObSSTable *sstable, - const share::ObLSID &ls_id, - const common::ObTabletID &tablet_id, - const ObTablet *tablet = nullptr); + const ObTablet *tablet); bool end_of_block() const; bool is_ddl_merge_type() const; int get_index_row_count(int64_t &index_row_count) const; @@ -376,6 +371,7 @@ public: OB_INLINE bool is_valid() const { return is_inited_; } OB_INLINE bool is_ddl_merge_scan() const { return index_format_ == ObIndexFormat::DDL_MERGE; } void switch_context(const ObSSTable &sstable, + const ObTablet *tablet, const ObStorageDatumUtils &datum_utils, ObTableAccessContext &access_ctx); TO_STRING_KV(K_(index_format), KP_(raw_iter), KP_(transformed_iter), KP_(ddl_iter), KP_(ddl_merge_iter),