Skip to content

Commit 6006e21

Browse files
obdevwyfanxiaohaitaoy
authored andcommitted
[CP] advance scan bug fix
Co-authored-by: wyfanxiao <wyfanxiao@163.com> Co-authored-by: haitaoy <haitaoy3.14@gmail.com>
1 parent e686da6 commit 6006e21

1 file changed

Lines changed: 22 additions & 15 deletions

File tree

src/storage/access/ob_multiple_scan_merge.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -421,16 +421,7 @@ int ObMultipleScanMerge::advance_scan(const blocksstable::ObDatumRange &range)
421421
int ret = OB_SUCCESS;
422422
is_unprojected_row_valid_ = false;
423423
ObStoreRowIterator *iter = nullptr;
424-
for (int64_t i = 0; OB_SUCC(ret) && i < iters_.count(); ++i) {
425-
if (OB_ISNULL(iter = iters_.at(i))) {
426-
ret = OB_ERR_UNEXPECTED;
427-
STORAGE_LOG(WARN, "unexpected null iter", K(ret), K(i));
428-
} else if (OB_FAIL(iter->advance_scan(range))) {
429-
STORAGE_LOG(WARN, "failed to advance scan", K(ret), K(i), KPC(iter));
430-
}
431-
}
432-
if (OB_FAIL(ret)) {
433-
} else if (OB_LIKELY(rows_merger_ != nullptr && !rows_merger_->empty())) {
424+
if (OB_LIKELY(rows_merger_ != nullptr && !rows_merger_->empty())) {
434425
if (OB_NOT_NULL(block_row_store_)) {
435426
block_row_store_->disable();
436427
}
@@ -440,6 +431,7 @@ int ObMultipleScanMerge::advance_scan(const blocksstable::ObDatumRange &range)
440431
const ObScanMergeLoserTreeItem *top_item = nullptr;
441432
blocksstable::ObDatumRowkey top_key;
442433
ObScanMergeLoserTreeItem item;
434+
int64_t pop_iter_idx = 0;
443435
while (OB_SUCC(ret) && !rows_merger_->empty()) {
444436
if (OB_FAIL(rows_merger_->rebuild())) {
445437
LOG_WARN("failed to rebuild rows merger", K(ret), KPC(rows_merger_));
@@ -454,23 +446,26 @@ int ObMultipleScanMerge::advance_scan(const blocksstable::ObDatumRange &range)
454446
LOG_WARN("failed to compare top key", K(ret), K(top_key), K(range));
455447
} else if (cmp_ret > 0 || (0 == cmp_ret && range.is_left_closed())) {
456448
break;
449+
} else if (FALSE_IT(pop_iter_idx = top_item->iter_idx_)) {
457450
} else if (OB_FAIL(rows_merger_->pop())) {
458451
STORAGE_LOG(WARN, "failed to pop rows merger", K(ret), KPC(rows_merger_));
459-
} else if (FALSE_IT(iter = iters_.at(top_item->iter_idx_))) {
452+
} else if (FALSE_IT(iter = iters_.at(pop_iter_idx))) {
453+
} else if (OB_FAIL(iter->advance_scan(range))) {
454+
STORAGE_LOG(WARN, "failed to advance scan for memtable iter", K(ret), K(pop_iter_idx), KP(iter));
460455
} else if (OB_FAIL(iter->get_next_row(item.row_))) {
461456
if (OB_ITER_END == ret) {
462457
ret = OB_SUCCESS;
463458
} else {
464-
LOG_WARN("failed to get next row from iterator", K(ret), K(top_item), KPC(iter));
459+
LOG_WARN("failed to get next row from iterator", K(ret), K(pop_iter_idx), KP(iter));
465460
}
466461
} else if (OB_ISNULL(item.row_)) {
467462
ret = OB_ERR_UNEXPECTED;
468-
STORAGE_LOG(WARN, "get next row return NULL row", K(ret), "iter_index", top_item->iter_idx_);
469-
} else if (FALSE_IT(item.iter_idx_ = top_item->iter_idx_)) {
463+
STORAGE_LOG(WARN, "get next row return NULL row", K(ret), "iter_index", pop_iter_idx);
464+
} else if (FALSE_IT(item.iter_idx_ = pop_iter_idx)) {
470465
} else if (OB_FAIL(rows_merger_->push(item))) {
471466
STORAGE_LOG(WARN, "loser tree push error", K(ret));
472467
} else {
473-
STORAGE_LOG(DEBUG, "yuanzhe debug", K(consumer_cnt_), K(top_item->iter_idx_));
468+
STORAGE_LOG(DEBUG, "yuanzhe debug", K(consumer_cnt_), K(pop_iter_idx), K(item));
474469
}
475470
}
476471
if (FAILEDx(rows_merger_->rebuild())) {
@@ -479,6 +474,18 @@ int ObMultipleScanMerge::advance_scan(const blocksstable::ObDatumRange &range)
479474
block_row_store_->enable();
480475
}
481476
}
477+
for (int64_t i = 0; OB_SUCC(ret) && i < consumer_cnt_; ++i) {
478+
const int64_t iter_idx = consumers_[i];
479+
if (OB_UNLIKELY(iter_idx < 0 || iter_idx >= iters_.count())) {
480+
ret = OB_ERR_UNEXPECTED;
481+
STORAGE_LOG(WARN, "unexpected consumer iter idx", K(ret), K(iter_idx), K(i), K_(consumer_cnt), K(iters_.count()));
482+
} else if (OB_ISNULL(iter = iters_.at(iter_idx))) {
483+
ret = OB_ERR_UNEXPECTED;
484+
STORAGE_LOG(WARN, "unexpected null iter", K(ret), K(iter_idx), K(i));
485+
} else if (OB_FAIL(iter->advance_scan(range))) {
486+
STORAGE_LOG(WARN, "failed to advance remaining iter", K(ret), K(iter_idx), KP(iter));
487+
}
488+
}
482489
return ret;
483490
}
484491

0 commit comments

Comments
 (0)