@@ -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