bugfix: when switch context in index_block_row_scanner, update some items

This commit is contained in:
renju96
2024-02-08 05:36:00 +00:00
committed by ob-robot
parent 0d0b11c0cc
commit 44eee17093
5 changed files with 31 additions and 16 deletions

View File

@ -206,7 +206,7 @@ int ObIndexTreePrefetcher::lookup_in_index_tree(ObSSTableReadHandle &read_handle
while (OB_SUCC(ret) && !found && cur_level_ < index_tree_height_) { while (OB_SUCC(ret) && !found && cur_level_ < index_tree_height_) {
if (0 == cur_level_) { if (0 == cur_level_) {
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_)); LOG_WARN("Fail to get index block root", K(ret), KPC(sstable_), KP(sstable_));
} }
} else { } else {
ObMicroBlockDataHandle &curr_handle = get_read_handle(cur_level_); ObMicroBlockDataHandle &curr_handle = get_read_handle(cur_level_);
@ -223,7 +223,7 @@ int ObIndexTreePrefetcher::lookup_in_index_tree(ObSSTableReadHandle &read_handle
*read_handle.rowkey_, *read_handle.rowkey_,
read_handle.range_idx_, read_handle.range_idx_,
&index_block_info))) { &index_block_info))) {
LOG_WARN("Fail to open index block scanner", K(ret), K(cur_level_), K(index_block_), K(index_tree_height_), KPC(sstable_)); LOG_WARN("Fail to open index block scanner", K(ret), K(cur_level_), K(index_block_), K(index_tree_height_), KPC(sstable_), KP(sstable_));
} else if (OB_FAIL(index_scanner_.get_next(index_block_info))) { } else if (OB_FAIL(index_scanner_.get_next(index_block_info))) {
if (OB_UNLIKELY(OB_ITER_END != ret)) { if (OB_UNLIKELY(OB_ITER_END != ret)) {
LOG_WARN("Fail to get index block row", K(ret), K_(index_scanner)); LOG_WARN("Fail to get index block row", K(ret), K_(index_scanner));
@ -266,7 +266,7 @@ int ObIndexTreePrefetcher::init_index_scanner(ObIndexBlockRowScanner &index_scan
access_ctx_->query_flag_, access_ctx_->query_flag_,
sstable_->get_macro_offset(), sstable_->get_macro_offset(),
sstable_->is_normal_cg_sstable()))) { sstable_->is_normal_cg_sstable()))) {
LOG_WARN("init index scanner fail", K(ret), KPC(sstable_)); LOG_WARN("init index scanner fail", K(ret), KPC(sstable_), KP(sstable_));
} else { } else {
index_scanner.set_iter_param(sstable_, access_ctx_->ls_id_, access_ctx_->tablet_id_); index_scanner.set_iter_param(sstable_, access_ctx_->ls_id_, access_ctx_->tablet_id_);
} }
@ -445,7 +445,7 @@ int ObIndexTreeMultiPrefetcher::switch_context(
} }
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
if (index_scanner_.is_valid()) { if (index_scanner_.is_valid()) {
index_scanner_.switch_context(sstable, *datum_utils_); index_scanner_.switch_context(sstable, *datum_utils_, access_ctx_->query_flag_, access_ctx_->ls_id_, access_ctx_->tablet_id_);
} }
} }
} }
@ -483,7 +483,7 @@ int ObIndexTreeMultiPrefetcher::multi_prefetch()
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(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_)); LOG_WARN("Fail to get index block root", K(ret), KPC(sstable_), KP(sstable_));
} }
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
} else if (!index_scanner_.is_valid() && OB_FAIL(init_index_scanner(index_scanner_))) { } else if (!index_scanner_.is_valid() && OB_FAIL(init_index_scanner(index_scanner_))) {
@ -782,7 +782,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_); tree_handles_[level].index_scanner_.switch_context(sstable, *datum_utils_, access_ctx_->query_flag_, access_ctx_->ls_id_, access_ctx_->tablet_id_);
} 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));
} }
@ -907,14 +907,14 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::p
is_prefetch_end_ = true; is_prefetch_end_ = true;
ret = OB_SUCCESS; ret = OB_SUCCESS;
} else { } else {
LOG_WARN("Fail to prefetch index tree", K(ret)); LOG_WARN("Fail to prefetch index tree", K(ret), K(index_tree_height_), K(cur_level_));
} }
} else if (OB_FAIL(prefetch_micro_data())) { } else if (OB_FAIL(prefetch_micro_data())) {
if (OB_LIKELY(OB_ITER_END == ret)) { if (OB_LIKELY(OB_ITER_END == ret)) {
is_prefetch_end_ = true; is_prefetch_end_ = true;
ret = OB_SUCCESS; ret = OB_SUCCESS;
} else { } else {
LOG_WARN("Fail to prefetch", K(ret)); LOG_WARN("Fail to prefetch", K(ret), K(index_tree_height_), K(cur_level_));
} }
} }
return ret; return ret;
@ -967,7 +967,7 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::t
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(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_)); LOG_WARN("Fail to get index block root", K(ret), KPC(sstable_), KP(sstable_));
} }
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
} else if (OB_FAIL(tree_handle.index_scanner_.open( } else if (OB_FAIL(tree_handle.index_scanner_.open(
@ -982,7 +982,7 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::t
// scan // scan
read_handle.row_state_ = ObSSTableRowState::IN_BLOCK; read_handle.row_state_ = ObSSTableRowState::IN_BLOCK;
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 tree root", K(ret), KPC(sstable_)); LOG_WARN("Fail to get index tree root", K(ret), KPC(sstable_), KP(sstable_));
} }
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
} else if (OB_FAIL(tree_handle.index_scanner_.open( } else if (OB_FAIL(tree_handle.index_scanner_.open(
@ -1001,7 +1001,7 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::t
} else { } else {
read_handle.row_state_ = ObSSTableRowState::IN_BLOCK; read_handle.row_state_ = ObSSTableRowState::IN_BLOCK;
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 tree root", K(ret), KPC(sstable_)); LOG_WARN("Fail to get index tree root", K(ret), KPC(sstable_), KP(sstable_));
} }
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
} else if (OB_FAIL(tree_handle.index_scanner_.open(ObIndexBlockRowHeader::DEFAULT_IDX_ROW_MACRO_ID, } else if (OB_FAIL(tree_handle.index_scanner_.open(ObIndexBlockRowHeader::DEFAULT_IDX_ROW_MACRO_ID,
@ -1048,7 +1048,7 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::p
while (OB_SUCC(ret) && prefetched_cnt < prefetch_depth) { while (OB_SUCC(ret) && prefetched_cnt < prefetch_depth) {
if (OB_FAIL(drill_down())) { if (OB_FAIL(drill_down())) {
if (OB_UNLIKELY(OB_ITER_END != ret)) { if (OB_UNLIKELY(OB_ITER_END != ret)) {
LOG_WARN("fail to get index leaf", K(ret), K(cur_level_)); LOG_WARN("fail to get index leaf", K(ret), K(cur_level_), K(prefetch_depth), K(prefetched_cnt));
} // else prefetch_end } // else prefetch_end
} else if (index_tree_height_ - 1 != cur_level_) { } else if (index_tree_height_ - 1 != cur_level_) {
// not leaf level, prefetch index tree // not leaf level, prefetch index tree
@ -1138,7 +1138,7 @@ int ObIndexTreeMultiPassPrefetcher<DATA_PREFETCH_DEPTH, INDEX_PREFETCH_DEPTH>::d
if (index_tree_height_ - 1 == cur_level_) { if (index_tree_height_ - 1 == cur_level_) {
} else if (OB_FAIL(tree_handles_[cur_level_ + 1].forward(*this, iter_param_->has_lob_column_out()))) { } else if (OB_FAIL(tree_handles_[cur_level_ + 1].forward(*this, iter_param_->has_lob_column_out()))) {
if (OB_UNLIKELY(OB_ITER_END != ret)) { if (OB_UNLIKELY(OB_ITER_END != ret)) {
LOG_WARN("fail to consume tree handle", K(ret), K(cur_level_), K(tree_handles_[cur_level_ + 1])); LOG_WARN("fail to consume tree handle", K(ret), K(cur_level_), K(tree_handles_[cur_level_ + 1]), K(tree_handles_[cur_level_]));
} else if (!tree_handles_[cur_level_ + 1].is_prefetch_end()) { } else if (!tree_handles_[cur_level_ + 1].is_prefetch_end()) {
ret = OB_SUCCESS; ret = OB_SUCCESS;
} }

View File

@ -1729,11 +1729,21 @@ const ObDatumRowkey &ObIndexBlockRowScanner::get_end_key() const
return *tmp_key; return *tmp_key;
} }
void ObIndexBlockRowScanner::switch_context(const ObSSTable &sstable, const ObStorageDatumUtils &datum_utils) 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)
{ {
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_normal_query_ = !query_flag.is_daily_merge() && !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_.tablet_ = nullptr;
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (OB_NOT_NULL(iter_)) { if (OB_NOT_NULL(iter_)) {
ObStorageDatumUtils *switch_datum_utils = const_cast<ObStorageDatumUtils *>(datum_utils_); ObStorageDatumUtils *switch_datum_utils = const_cast<ObStorageDatumUtils *>(datum_utils_);

View File

@ -380,7 +380,11 @@ public:
const ObDatumRowkey &get_end_key() const; const ObDatumRowkey &get_end_key() const;
OB_INLINE bool is_valid() const { return is_inited_; } OB_INLINE bool is_valid() const { return is_inited_; }
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, const ObStorageDatumUtils &datum_utils); 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);
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),

View File

@ -1688,6 +1688,7 @@ int ObSSTable::get_index_tree_root(
} }
if (OB_SUCC(ret) && is_ddl_merge_sstable()) { if (OB_SUCC(ret) && is_ddl_merge_sstable()) {
index_data.type_ = ObMicroBlockData::DDL_MERGE_INDEX_BLOCK; index_data.type_ = ObMicroBlockData::DDL_MERGE_INDEX_BLOCK;
LOG_INFO("empty ddl merge sstable", K(index_data));
} }
return ret; return ret;
} }

View File

@ -493,7 +493,7 @@ int ObCOPrefetcher::ObCOIndexTreeLevelHandle::forward(
int8_t fetch_idx = fetch_idx_ % INDEX_TREE_PREFETCH_DEPTH; int8_t fetch_idx = fetch_idx_ % INDEX_TREE_PREFETCH_DEPTH;
ObMicroIndexInfo &index_info = index_block_read_handles_[fetch_idx].index_info_; ObMicroIndexInfo &index_info = index_block_read_handles_[fetch_idx].index_info_;
if (OB_FAIL(index_block_read_handles_[fetch_idx].data_handle_.get_micro_block_data(nullptr, index_block_, false))) { if (OB_FAIL(index_block_read_handles_[fetch_idx].data_handle_.get_micro_block_data(nullptr, index_block_, false))) {
LOG_WARN("Fail to get index block data", K(ret), KPC(this)); LOG_WARN("Fail to get index block data", K(ret), KPC(this), K(index_block_), K(fetch_idx_), K(prefetch_idx_));
} else if (index_info.is_get()) { } else if (index_info.is_get()) {
if (OB_FAIL(index_scanner_.open( if (OB_FAIL(index_scanner_.open(
index_info.get_macro_id(), index_info.get_macro_id(),