From 74ab463ae4f62ac82da8ade83c9aa8675eaff766 Mon Sep 17 00:00:00 2001 From: DengzhiLiu Date: Thu, 8 Feb 2024 16:17:22 +0000 Subject: [PATCH] Fix allocator in index scanner --- .../storage/blocksstable/test_block_cache.cpp | 4 --- .../test_index_block_row_scanner.cpp | 6 ++--- .../access/ob_index_sstable_estimator.cpp | 6 +---- .../access/ob_index_tree_prefetcher.cpp | 25 +++++++------------ src/storage/access/ob_index_tree_prefetcher.h | 2 -- .../ob_index_block_row_scanner.cpp | 22 +++++----------- .../index_block/ob_index_block_row_scanner.h | 8 +----- 7 files changed, 19 insertions(+), 54 deletions(-) diff --git a/mittest/mtlenv/storage/blocksstable/test_block_cache.cpp b/mittest/mtlenv/storage/blocksstable/test_block_cache.cpp index 43cffe7f45..075314816a 100644 --- a/mittest/mtlenv/storage/blocksstable/test_block_cache.cpp +++ b/mittest/mtlenv/storage/blocksstable/test_block_cache.cpp @@ -114,13 +114,9 @@ TEST_F(TestObMicroBlockCache, test_block_cache) ObIndexBlockRowScanner idx_row_scanner; ObMicroBlockData root_block; ObMicroIndexInfo micro_idx_info; - ObArray agg_projector; - ObArray agg_column_schema; ObArray micro_idx_infos; sstable_.get_index_tree_root(root_block); ASSERT_EQ(OB_SUCCESS, idx_row_scanner.init( - agg_projector, - agg_column_schema, tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(), allocator_, context_.query_flag_, diff --git a/mittest/mtlenv/storage/blocksstable/test_index_block_row_scanner.cpp b/mittest/mtlenv/storage/blocksstable/test_index_block_row_scanner.cpp index cb85c4953d..2cdde1b671 100755 --- a/mittest/mtlenv/storage/blocksstable/test_index_block_row_scanner.cpp +++ b/mittest/mtlenv/storage/blocksstable/test_index_block_row_scanner.cpp @@ -139,8 +139,6 @@ TEST_F(TestIndexBlockRowScanner, prefetch_and_scan) ObIndexBlockRowParser idx_row_parser; ObIndexBlockRowScanner idx_scanner; ObIndexBlockRowScanner raw_idx_scanner; - ObArray agg_projector; - ObArray agg_column_schema; ObQueryFlag query_flag; query_flag.set_use_block_cache(); ObIndexBlockDataTransformer transformer; @@ -154,9 +152,9 @@ TEST_F(TestIndexBlockRowScanner, prefetch_and_scan) ASSERT_TRUE(root_blk_header->is_valid()); ASSERT_EQ(OB_SUCCESS, idx_scanner.init( - agg_projector, agg_column_schema, tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(), allocator_, query_flag, 0)); + tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(), allocator_, query_flag, 0)); ASSERT_EQ(OB_SUCCESS, raw_idx_scanner.init( - agg_projector, agg_column_schema, tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(), allocator_, query_flag, 0)); + tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(), allocator_, query_flag, 0)); ObMacroBlockHandle macro_handle; const ObIndexBlockRowHeader *idx_row_header = nullptr; diff --git a/src/storage/access/ob_index_sstable_estimator.cpp b/src/storage/access/ob_index_sstable_estimator.cpp index 8ee102aa90..595eeb4f27 100644 --- a/src/storage/access/ob_index_sstable_estimator.cpp +++ b/src/storage/access/ob_index_sstable_estimator.cpp @@ -75,21 +75,17 @@ int ObIndexBlockScanEstimator::estimate_row_count(ObPartitionEst &part_est) ObEstimatedResult result; lib::ObMemAttr mem_attr(MTL_ID(), "OB_STORAGE_EST"); - common::ObSEArray agg_projector; - common::ObSEArray agg_column_schema; if (OB_UNLIKELY(!context_.is_valid())) { ret = common::OB_INVALID_ARGUMENT; STORAGE_LOG(WARN, "estimate context is not valid", K(ret), K(context_)); } else if (OB_FAIL(allocator_.init(nullptr, OB_MALLOC_MIDDLE_BLOCK_SIZE, mem_attr))) { STORAGE_LOG(WARN, "Fail to init allocator", K(ret)); } else if (OB_FAIL(index_block_row_scanner_.init( - agg_projector, - agg_column_schema, context_.tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(), allocator_, context_.query_flag_, context_.sstable_.get_macro_offset()))) { - STORAGE_LOG(WARN, "Failed to init index block row scanner", K(ret), K(agg_projector), K(agg_column_schema)); + STORAGE_LOG(WARN, "Failed to init index block row scanner", K(ret)); } else if (OB_FAIL(context_.sstable_.get_index_tree_root(root_index_block_))) { STORAGE_LOG(WARN, "Failed to get index tree root", K(ret)); } else if (context_.sstable_.is_ddl_merge_sstable()) { diff --git a/src/storage/access/ob_index_tree_prefetcher.cpp b/src/storage/access/ob_index_tree_prefetcher.cpp index 365e5ffd88..11e3a4ac90 100644 --- a/src/storage/access/ob_index_tree_prefetcher.cpp +++ b/src/storage/access/ob_index_tree_prefetcher.cpp @@ -49,7 +49,7 @@ void ObIndexTreePrefetcher::reset() void ObIndexTreePrefetcher::reuse() { - index_scanner_.reset(); + index_scanner_.reuse(); } int ObIndexTreePrefetcher::init( @@ -117,6 +117,12 @@ int ObIndexTreePrefetcher::init_basic_info( data_version_ = sstable_->get_data_version(); bool is_normal_query = !access_ctx_->query_flag_.is_daily_merge() && !access_ctx_->query_flag_.is_multi_version_minor_merge(); 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_); + } else if (OB_FAIL(init_index_scanner(index_scanner_))) { + LOG_WARN("Fail to init index_scanner", K(ret)); + } } return ret; } @@ -142,9 +148,7 @@ int ObIndexTreePrefetcher::single_prefetch(ObSSTableReadHandle &read_handle) OB_FAIL(lookup_in_cache(read_handle))) { LOG_WARN("Failed to lookup_in_cache", K(ret)); } else if (ObSSTableRowState::IN_BLOCK == read_handle.row_state_) { - if (OB_FAIL(init_index_scanner(index_scanner_))) { - LOG_WARN("Fail to init index scanner", K(ret)); - } else if (OB_FAIL(lookup_in_index_tree(read_handle, false))) { + if (OB_FAIL(lookup_in_index_tree(read_handle, false))) { LOG_WARN("Failed to lookup_in_block", K(ret)); } } @@ -259,8 +263,6 @@ int ObIndexTreePrefetcher::init_index_scanner(ObIndexBlockRowScanner &index_scan { int ret = OB_SUCCESS; if (OB_FAIL(index_scanner.init( - agg_projector_, - agg_column_schema_, *datum_utils_, *access_ctx_->stmt_allocator_, access_ctx_->query_flag_, @@ -443,11 +445,6 @@ int ObIndexTreeMultiPrefetcher::switch_context( ext_read_handles_.at(i).reset(); } } - if (OB_SUCC(ret)) { - if (index_scanner_.is_valid()) { - index_scanner_.switch_context(sstable, *datum_utils_, access_ctx_->query_flag_, access_ctx_->ls_id_, access_ctx_->tablet_id_); - } - } } return ret; } @@ -484,10 +481,6 @@ int ObIndexTreeMultiPrefetcher::multi_prefetch() } else if (ObSSTableRowState::IN_BLOCK == read_handle.row_state_) { if (OB_FAIL(sstable_->get_index_tree_root(index_block_))) { LOG_WARN("Fail to get index block root", K(ret), KPC(sstable_), KP(sstable_)); - } - if (OB_FAIL(ret)) { - } else if (!index_scanner_.is_valid() && OB_FAIL(init_index_scanner(index_scanner_))) { - LOG_WARN("Fail to init index scanner", K(ret)); } else if (OB_FAIL(drill_down(ObIndexBlockRowHeader::DEFAULT_IDX_ROW_MACRO_ID, read_handle, false, is_rowkey_to_fetched))) { LOG_WARN("Fail to prefetch next level", K(ret), K(index_block_), K(read_handle), KPC(this)); } @@ -782,7 +775,7 @@ 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_->query_flag_, access_ctx_->ls_id_, access_ctx_->tablet_id_); + tree_handles_[level].index_scanner_.switch_context(sstable, *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_index_tree_prefetcher.h b/src/storage/access/ob_index_tree_prefetcher.h index 2d47924b33..f11ec7dd77 100644 --- a/src/storage/access/ob_index_tree_prefetcher.h +++ b/src/storage/access/ob_index_tree_prefetcher.h @@ -194,8 +194,6 @@ protected: const ObTableIterParam *iter_param_; ObTableAccessContext *access_ctx_; const ObStorageDatumUtils *datum_utils_; - common::ObFixedArray agg_projector_; - common::ObFixedArray agg_column_schema_; static const int64_t DEFAULT_GET_MICRO_DATA_HANDLE_CNT = 2; ObIndexBlockRowScanner index_scanner_; ObMicroBlockDataHandle last_micro_block_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 8ea5d01780..31be5726b2 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 @@ -1295,8 +1295,7 @@ int ObTFMIndexBlockRowIterator::find_rowkeys_belong_to_same_idx_row(ObMicroIndex /****************** ObIndexBlockRowScanner **********************/ ObIndexBlockRowScanner::ObIndexBlockRowScanner() - : query_range_(nullptr), agg_projector_(nullptr), agg_column_schema_(nullptr), - macro_id_(), allocator_(nullptr), raw_iter_(nullptr), transformed_iter_(nullptr), + : query_range_(nullptr), macro_id_(), allocator_(nullptr), raw_iter_(nullptr), transformed_iter_(nullptr), ddl_iter_(nullptr), ddl_merge_iter_(nullptr), iter_(nullptr), datum_utils_(nullptr), range_idx_(0), nested_offset_(0), rowkey_begin_idx_(0), rowkey_end_idx_(0), index_format_(ObIndexFormat::INVALID), parent_row_range_(), is_get_(false), is_reverse_scan_(false), @@ -1383,8 +1382,6 @@ void ObIndexBlockRowScanner::reset() } int ObIndexBlockRowScanner::init( - const ObIArray &agg_projector, - const ObIArray &agg_column_schema, const ObStorageDatumUtils &datum_utils, ObIAllocator &allocator, const common::ObQueryFlag &query_flag, @@ -1398,12 +1395,7 @@ int ObIndexBlockRowScanner::init( } else if (OB_UNLIKELY(!datum_utils.is_valid())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid datum utils", K(ret), K(datum_utils)); - } else if (OB_UNLIKELY(agg_projector.count() != agg_column_schema.count())) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("Agg meta count not same", K(ret), K(agg_projector), K(agg_column_schema)); } else { - agg_projector_ = &agg_projector; - agg_column_schema_ = &agg_column_schema; allocator_ = &allocator; is_reverse_scan_ = query_flag.is_reverse_scan(); datum_utils_ = &datum_utils; @@ -1814,18 +1806,16 @@ const ObDatumRowkey &ObIndexBlockRowScanner::get_end_key() const void ObIndexBlockRowScanner::switch_context(const ObSSTable &sstable, const ObStorageDatumUtils &datum_utils, - const common::ObQueryFlag &query_flag, - const share::ObLSID &ls_id, - const common::ObTabletID &tablet_id) + ObTableAccessContext &access_ctx) { nested_offset_ = sstable.get_macro_offset(); datum_utils_ = &datum_utils; is_normal_cg_ = sstable.is_normal_cg_sstable(); - is_reverse_scan_ = query_flag.is_reverse_scan(); - is_normal_query_ = !query_flag.is_daily_merge() && !query_flag.is_multi_version_minor_merge(); + 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_ = ls_id; - iter_param_.tablet_id_ = tablet_id; + iter_param_.ls_id_ = access_ctx.ls_id_; + iter_param_.tablet_id_ = access_ctx.tablet_id_; iter_param_.tablet_ = nullptr; int ret = OB_SUCCESS; if (OB_NOT_NULL(iter_)) { 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 5de1b3b406..21a8172fe1 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 @@ -321,8 +321,6 @@ public: void reset(); int init( - const ObIArray &agg_projector, - const ObIArray &agg_column_schema, const ObStorageDatumUtils &datum_utils, ObIAllocator &allocator, const common::ObQueryFlag &query_flag, @@ -379,9 +377,7 @@ public: OB_INLINE bool is_ddl_merge_scan() const { return index_format_ == ObIndexFormat::DDL_MERGE; } void switch_context(const ObSSTable &sstable, const ObStorageDatumUtils &datum_utils, - const common::ObQueryFlag &query_flag, - const share::ObLSID &ls_id, - const common::ObTabletID &tablet_id); + ObTableAccessContext &access_ctx); TO_STRING_KV(K_(index_format), KP_(raw_iter), KP_(transformed_iter), KP_(ddl_iter), KP_(ddl_merge_iter), KPC_(iter), K_(range_idx), K_(is_get), K_(is_reverse_scan), K_(is_left_border), K_(is_right_border), K_(rowkey_begin_idx), K_(rowkey_end_idx), K_(is_inited), K_(macro_id), KPC_(datum_utils), @@ -410,8 +406,6 @@ private: const ObRowsInfo *rows_info_; const void *query_range_; }; - const ObIArray *agg_projector_; - const ObIArray *agg_column_schema_; MacroBlockId macro_id_; ObIAllocator *allocator_; ObRAWIndexBlockRowIterator *raw_iter_;