Fix allocator in index scanner
This commit is contained in:
@ -114,13 +114,9 @@ TEST_F(TestObMicroBlockCache, test_block_cache)
|
|||||||
ObIndexBlockRowScanner idx_row_scanner;
|
ObIndexBlockRowScanner idx_row_scanner;
|
||||||
ObMicroBlockData root_block;
|
ObMicroBlockData root_block;
|
||||||
ObMicroIndexInfo micro_idx_info;
|
ObMicroIndexInfo micro_idx_info;
|
||||||
ObArray<int32_t> agg_projector;
|
|
||||||
ObArray<ObColumnSchemaV2> agg_column_schema;
|
|
||||||
ObArray<ObMicroIndexInfo> micro_idx_infos;
|
ObArray<ObMicroIndexInfo> micro_idx_infos;
|
||||||
sstable_.get_index_tree_root(root_block);
|
sstable_.get_index_tree_root(root_block);
|
||||||
ASSERT_EQ(OB_SUCCESS, idx_row_scanner.init(
|
ASSERT_EQ(OB_SUCCESS, idx_row_scanner.init(
|
||||||
agg_projector,
|
|
||||||
agg_column_schema,
|
|
||||||
tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(),
|
tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(),
|
||||||
allocator_,
|
allocator_,
|
||||||
context_.query_flag_,
|
context_.query_flag_,
|
||||||
|
|||||||
@ -139,8 +139,6 @@ TEST_F(TestIndexBlockRowScanner, prefetch_and_scan)
|
|||||||
ObIndexBlockRowParser idx_row_parser;
|
ObIndexBlockRowParser idx_row_parser;
|
||||||
ObIndexBlockRowScanner idx_scanner;
|
ObIndexBlockRowScanner idx_scanner;
|
||||||
ObIndexBlockRowScanner raw_idx_scanner;
|
ObIndexBlockRowScanner raw_idx_scanner;
|
||||||
ObArray<int32_t> agg_projector;
|
|
||||||
ObArray<ObColumnSchemaV2> agg_column_schema;
|
|
||||||
ObQueryFlag query_flag;
|
ObQueryFlag query_flag;
|
||||||
query_flag.set_use_block_cache();
|
query_flag.set_use_block_cache();
|
||||||
ObIndexBlockDataTransformer transformer;
|
ObIndexBlockDataTransformer transformer;
|
||||||
@ -154,9 +152,9 @@ TEST_F(TestIndexBlockRowScanner, prefetch_and_scan)
|
|||||||
ASSERT_TRUE(root_blk_header->is_valid());
|
ASSERT_TRUE(root_blk_header->is_valid());
|
||||||
|
|
||||||
ASSERT_EQ(OB_SUCCESS, idx_scanner.init(
|
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(
|
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;
|
ObMacroBlockHandle macro_handle;
|
||||||
const ObIndexBlockRowHeader *idx_row_header = nullptr;
|
const ObIndexBlockRowHeader *idx_row_header = nullptr;
|
||||||
|
|||||||
@ -75,21 +75,17 @@ int ObIndexBlockScanEstimator::estimate_row_count(ObPartitionEst &part_est)
|
|||||||
ObEstimatedResult result;
|
ObEstimatedResult result;
|
||||||
|
|
||||||
lib::ObMemAttr mem_attr(MTL_ID(), "OB_STORAGE_EST");
|
lib::ObMemAttr mem_attr(MTL_ID(), "OB_STORAGE_EST");
|
||||||
common::ObSEArray<int32_t, 1> agg_projector;
|
|
||||||
common::ObSEArray<share::schema::ObColumnSchemaV2, 1> agg_column_schema;
|
|
||||||
if (OB_UNLIKELY(!context_.is_valid())) {
|
if (OB_UNLIKELY(!context_.is_valid())) {
|
||||||
ret = common::OB_INVALID_ARGUMENT;
|
ret = common::OB_INVALID_ARGUMENT;
|
||||||
STORAGE_LOG(WARN, "estimate context is not valid", K(ret), K(context_));
|
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))) {
|
} else if (OB_FAIL(allocator_.init(nullptr, OB_MALLOC_MIDDLE_BLOCK_SIZE, mem_attr))) {
|
||||||
STORAGE_LOG(WARN, "Fail to init allocator", K(ret));
|
STORAGE_LOG(WARN, "Fail to init allocator", K(ret));
|
||||||
} else if (OB_FAIL(index_block_row_scanner_.init(
|
} 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(),
|
context_.tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils(),
|
||||||
allocator_,
|
allocator_,
|
||||||
context_.query_flag_,
|
context_.query_flag_,
|
||||||
context_.sstable_.get_macro_offset()))) {
|
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_))) {
|
} else if (OB_FAIL(context_.sstable_.get_index_tree_root(root_index_block_))) {
|
||||||
STORAGE_LOG(WARN, "Failed to get index tree root", K(ret));
|
STORAGE_LOG(WARN, "Failed to get index tree root", K(ret));
|
||||||
} else if (context_.sstable_.is_ddl_merge_sstable()) {
|
} else if (context_.sstable_.is_ddl_merge_sstable()) {
|
||||||
|
|||||||
@ -49,7 +49,7 @@ void ObIndexTreePrefetcher::reset()
|
|||||||
|
|
||||||
void ObIndexTreePrefetcher::reuse()
|
void ObIndexTreePrefetcher::reuse()
|
||||||
{
|
{
|
||||||
index_scanner_.reset();
|
index_scanner_.reuse();
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObIndexTreePrefetcher::init(
|
int ObIndexTreePrefetcher::init(
|
||||||
@ -117,6 +117,12 @@ int ObIndexTreePrefetcher::init_basic_info(
|
|||||||
data_version_ = sstable_->get_data_version();
|
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();
|
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);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -142,9 +148,7 @@ int ObIndexTreePrefetcher::single_prefetch(ObSSTableReadHandle &read_handle)
|
|||||||
OB_FAIL(lookup_in_cache(read_handle))) {
|
OB_FAIL(lookup_in_cache(read_handle))) {
|
||||||
LOG_WARN("Failed to lookup_in_cache", K(ret));
|
LOG_WARN("Failed to lookup_in_cache", K(ret));
|
||||||
} else if (ObSSTableRowState::IN_BLOCK == read_handle.row_state_) {
|
} else if (ObSSTableRowState::IN_BLOCK == read_handle.row_state_) {
|
||||||
if (OB_FAIL(init_index_scanner(index_scanner_))) {
|
if (OB_FAIL(lookup_in_index_tree(read_handle, false))) {
|
||||||
LOG_WARN("Fail to init index scanner", K(ret));
|
|
||||||
} else if (OB_FAIL(lookup_in_index_tree(read_handle, false))) {
|
|
||||||
LOG_WARN("Failed to lookup_in_block", K(ret));
|
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;
|
int ret = OB_SUCCESS;
|
||||||
if (OB_FAIL(index_scanner.init(
|
if (OB_FAIL(index_scanner.init(
|
||||||
agg_projector_,
|
|
||||||
agg_column_schema_,
|
|
||||||
*datum_utils_,
|
*datum_utils_,
|
||||||
*access_ctx_->stmt_allocator_,
|
*access_ctx_->stmt_allocator_,
|
||||||
access_ctx_->query_flag_,
|
access_ctx_->query_flag_,
|
||||||
@ -443,11 +445,6 @@ int ObIndexTreeMultiPrefetcher::switch_context(
|
|||||||
ext_read_handles_.at(i).reset();
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -484,10 +481,6 @@ int ObIndexTreeMultiPrefetcher::multi_prefetch()
|
|||||||
} else if (ObSSTableRowState::IN_BLOCK == read_handle.row_state_) {
|
} else if (ObSSTableRowState::IN_BLOCK == read_handle.row_state_) {
|
||||||
if (OB_FAIL(sstable_->get_index_tree_root(index_block_))) {
|
if (OB_FAIL(sstable_->get_index_tree_root(index_block_))) {
|
||||||
LOG_WARN("Fail to get index block root", K(ret), KPC(sstable_), KP(sstable_));
|
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))) {
|
} 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));
|
LOG_WARN("Fail to prefetch next level", K(ret), K(index_block_), K(read_handle), KPC(this));
|
||||||
}
|
}
|
||||||
@ -782,7 +775,7 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::s
|
|||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
for (int64_t level = 0; OB_SUCC(ret) && level < index_tree_height_; level++) {
|
for (int64_t level = 0; OB_SUCC(ret) && level < index_tree_height_; level++) {
|
||||||
if (tree_handles_[level].index_scanner_.is_valid()) {
|
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_))) {
|
} else if (OB_FAIL(init_index_scanner(tree_handles_[level].index_scanner_))) {
|
||||||
LOG_WARN("Fail to init index_scanner", K(ret), K(level));
|
LOG_WARN("Fail to init index_scanner", K(ret), K(level));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -194,8 +194,6 @@ protected:
|
|||||||
const ObTableIterParam *iter_param_;
|
const ObTableIterParam *iter_param_;
|
||||||
ObTableAccessContext *access_ctx_;
|
ObTableAccessContext *access_ctx_;
|
||||||
const ObStorageDatumUtils *datum_utils_;
|
const ObStorageDatumUtils *datum_utils_;
|
||||||
common::ObFixedArray<int32_t, common::ObIAllocator> agg_projector_;
|
|
||||||
common::ObFixedArray<share::schema::ObColumnSchemaV2, common::ObIAllocator> agg_column_schema_;
|
|
||||||
static const int64_t DEFAULT_GET_MICRO_DATA_HANDLE_CNT = 2;
|
static const int64_t DEFAULT_GET_MICRO_DATA_HANDLE_CNT = 2;
|
||||||
ObIndexBlockRowScanner index_scanner_;
|
ObIndexBlockRowScanner index_scanner_;
|
||||||
ObMicroBlockDataHandle last_micro_block_handle_;
|
ObMicroBlockDataHandle last_micro_block_handle_;
|
||||||
|
|||||||
@ -1295,8 +1295,7 @@ int ObTFMIndexBlockRowIterator::find_rowkeys_belong_to_same_idx_row(ObMicroIndex
|
|||||||
|
|
||||||
/****************** ObIndexBlockRowScanner **********************/
|
/****************** ObIndexBlockRowScanner **********************/
|
||||||
ObIndexBlockRowScanner::ObIndexBlockRowScanner()
|
ObIndexBlockRowScanner::ObIndexBlockRowScanner()
|
||||||
: query_range_(nullptr), agg_projector_(nullptr), agg_column_schema_(nullptr),
|
: query_range_(nullptr), macro_id_(), allocator_(nullptr), raw_iter_(nullptr), transformed_iter_(nullptr),
|
||||||
macro_id_(), allocator_(nullptr), raw_iter_(nullptr), transformed_iter_(nullptr),
|
|
||||||
ddl_iter_(nullptr), ddl_merge_iter_(nullptr), iter_(nullptr), datum_utils_(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),
|
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),
|
index_format_(ObIndexFormat::INVALID), parent_row_range_(), is_get_(false), is_reverse_scan_(false),
|
||||||
@ -1383,8 +1382,6 @@ void ObIndexBlockRowScanner::reset()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ObIndexBlockRowScanner::init(
|
int ObIndexBlockRowScanner::init(
|
||||||
const ObIArray<int32_t> &agg_projector,
|
|
||||||
const ObIArray<share::schema::ObColumnSchemaV2> &agg_column_schema,
|
|
||||||
const ObStorageDatumUtils &datum_utils,
|
const ObStorageDatumUtils &datum_utils,
|
||||||
ObIAllocator &allocator,
|
ObIAllocator &allocator,
|
||||||
const common::ObQueryFlag &query_flag,
|
const common::ObQueryFlag &query_flag,
|
||||||
@ -1398,12 +1395,7 @@ int ObIndexBlockRowScanner::init(
|
|||||||
} else if (OB_UNLIKELY(!datum_utils.is_valid())) {
|
} else if (OB_UNLIKELY(!datum_utils.is_valid())) {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_WARN("invalid datum utils", K(ret), K(datum_utils));
|
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 {
|
} else {
|
||||||
agg_projector_ = &agg_projector;
|
|
||||||
agg_column_schema_ = &agg_column_schema;
|
|
||||||
allocator_ = &allocator;
|
allocator_ = &allocator;
|
||||||
is_reverse_scan_ = query_flag.is_reverse_scan();
|
is_reverse_scan_ = query_flag.is_reverse_scan();
|
||||||
datum_utils_ = &datum_utils;
|
datum_utils_ = &datum_utils;
|
||||||
@ -1814,18 +1806,16 @@ const ObDatumRowkey &ObIndexBlockRowScanner::get_end_key() const
|
|||||||
|
|
||||||
void ObIndexBlockRowScanner::switch_context(const ObSSTable &sstable,
|
void ObIndexBlockRowScanner::switch_context(const ObSSTable &sstable,
|
||||||
const ObStorageDatumUtils &datum_utils,
|
const ObStorageDatumUtils &datum_utils,
|
||||||
const common::ObQueryFlag &query_flag,
|
ObTableAccessContext &access_ctx)
|
||||||
const share::ObLSID &ls_id,
|
|
||||||
const common::ObTabletID &tablet_id)
|
|
||||||
{
|
{
|
||||||
nested_offset_ = sstable.get_macro_offset();
|
nested_offset_ = sstable.get_macro_offset();
|
||||||
datum_utils_ = &datum_utils;
|
datum_utils_ = &datum_utils;
|
||||||
is_normal_cg_ = sstable.is_normal_cg_sstable();
|
is_normal_cg_ = sstable.is_normal_cg_sstable();
|
||||||
is_reverse_scan_ = query_flag.is_reverse_scan();
|
is_reverse_scan_ = access_ctx.query_flag_.is_reverse_scan();
|
||||||
is_normal_query_ = !query_flag.is_daily_merge() && !query_flag.is_multi_version_minor_merge();
|
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_.sstable_ = &sstable;
|
||||||
iter_param_.ls_id_ = ls_id;
|
iter_param_.ls_id_ = access_ctx.ls_id_;
|
||||||
iter_param_.tablet_id_ = tablet_id;
|
iter_param_.tablet_id_ = access_ctx.tablet_id_;
|
||||||
iter_param_.tablet_ = nullptr;
|
iter_param_.tablet_ = nullptr;
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
if (OB_NOT_NULL(iter_)) {
|
if (OB_NOT_NULL(iter_)) {
|
||||||
|
|||||||
@ -321,8 +321,6 @@ public:
|
|||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
int init(
|
int init(
|
||||||
const ObIArray<int32_t> &agg_projector,
|
|
||||||
const ObIArray<share::schema::ObColumnSchemaV2> &agg_column_schema,
|
|
||||||
const ObStorageDatumUtils &datum_utils,
|
const ObStorageDatumUtils &datum_utils,
|
||||||
ObIAllocator &allocator,
|
ObIAllocator &allocator,
|
||||||
const common::ObQueryFlag &query_flag,
|
const common::ObQueryFlag &query_flag,
|
||||||
@ -379,9 +377,7 @@ public:
|
|||||||
OB_INLINE bool is_ddl_merge_scan() const { return index_format_ == ObIndexFormat::DDL_MERGE; }
|
OB_INLINE bool is_ddl_merge_scan() const { return index_format_ == ObIndexFormat::DDL_MERGE; }
|
||||||
void switch_context(const ObSSTable &sstable,
|
void switch_context(const ObSSTable &sstable,
|
||||||
const ObStorageDatumUtils &datum_utils,
|
const ObStorageDatumUtils &datum_utils,
|
||||||
const common::ObQueryFlag &query_flag,
|
ObTableAccessContext &access_ctx);
|
||||||
const share::ObLSID &ls_id,
|
|
||||||
const common::ObTabletID &tablet_id);
|
|
||||||
TO_STRING_KV(K_(index_format), KP_(raw_iter), KP_(transformed_iter), KP_(ddl_iter), KP_(ddl_merge_iter),
|
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),
|
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),
|
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 ObRowsInfo *rows_info_;
|
||||||
const void *query_range_;
|
const void *query_range_;
|
||||||
};
|
};
|
||||||
const ObIArray<int32_t> *agg_projector_;
|
|
||||||
const ObIArray<share::schema::ObColumnSchemaV2> *agg_column_schema_;
|
|
||||||
MacroBlockId macro_id_;
|
MacroBlockId macro_id_;
|
||||||
ObIAllocator *allocator_;
|
ObIAllocator *allocator_;
|
||||||
ObRAWIndexBlockRowIterator *raw_iter_;
|
ObRAWIndexBlockRowIterator *raw_iter_;
|
||||||
|
|||||||
Reference in New Issue
Block a user