This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 77b1cfee646d8af27a97c5a5bdcd89aac022408e Author: Xin Liao <liaoxin...@126.com> AuthorDate: Fri Apr 12 20:03:18 2024 +0800 [enhancement](merge-iterator) catch exception to avoid coredump when copy_rows (#33567) --- be/src/vec/olap/vgeneric_iterators.cpp | 34 ++++++++++++++++++++-------------- be/src/vec/olap/vgeneric_iterators.h | 10 +++++----- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/be/src/vec/olap/vgeneric_iterators.cpp b/be/src/vec/olap/vgeneric_iterators.cpp index c973a7131f9..26fe590dd60 100644 --- a/be/src/vec/olap/vgeneric_iterators.cpp +++ b/be/src/vec/olap/vgeneric_iterators.cpp @@ -136,42 +136,48 @@ bool VMergeIteratorContext::compare(const VMergeIteratorContext& rhs) const { } // `advanced = false` when current block finished -void VMergeIteratorContext::copy_rows(Block* block, bool advanced) { +Status VMergeIteratorContext::copy_rows(Block* block, bool advanced) { Block& src = *_block; Block& dst = *block; if (_cur_batch_num == 0) { - return; + return Status::OK(); } // copy a row to dst block column by column size_t start = _index_in_block - _cur_batch_num + 1 - advanced; - for (size_t i = 0; i < _num_columns; ++i) { - auto& s_col = src.get_by_position(i); - auto& d_col = dst.get_by_position(i); + RETURN_IF_CATCH_EXCEPTION({ + for (size_t i = 0; i < _num_columns; ++i) { + auto& s_col = src.get_by_position(i); + auto& d_col = dst.get_by_position(i); - ColumnPtr& s_cp = s_col.column; - ColumnPtr& d_cp = d_col.column; + ColumnPtr& s_cp = s_col.column; + ColumnPtr& d_cp = d_col.column; - d_cp->assume_mutable()->insert_range_from(*s_cp, start, _cur_batch_num); - } + d_cp->assume_mutable()->insert_range_from(*s_cp, start, _cur_batch_num); + } + }); const auto& tmp_pre_ctx_same_bit = get_pre_ctx_same(); dst.set_same_bit(tmp_pre_ctx_same_bit.begin(), tmp_pre_ctx_same_bit.begin() + _cur_batch_num); _cur_batch_num = 0; + return Status::OK(); } -void VMergeIteratorContext::copy_rows(BlockView* view, bool advanced) { +Status VMergeIteratorContext::copy_rows(BlockView* view, bool advanced) { if (_cur_batch_num == 0) { - return; + return Status::OK(); } size_t start = _index_in_block - _cur_batch_num + 1 - advanced; const auto& tmp_pre_ctx_same_bit = get_pre_ctx_same(); - for (size_t i = 0; i < _cur_batch_num; ++i) { - view->push_back({_block, static_cast<int>(start + i), tmp_pre_ctx_same_bit[i]}); - } + RETURN_IF_CATCH_EXCEPTION({ + for (size_t i = 0; i < _cur_batch_num; ++i) { + view->push_back({_block, static_cast<int>(start + i), tmp_pre_ctx_same_bit[i]}); + } + }); _cur_batch_num = 0; + return Status::OK(); } // This iterator will generate ordered data. For example for schema diff --git a/be/src/vec/olap/vgeneric_iterators.h b/be/src/vec/olap/vgeneric_iterators.h index f2e5e04bcc5..d67bb68fefa 100644 --- a/be/src/vec/olap/vgeneric_iterators.h +++ b/be/src/vec/olap/vgeneric_iterators.h @@ -108,9 +108,9 @@ public: bool compare(const VMergeIteratorContext& rhs) const; // `advanced = false` when current block finished - void copy_rows(Block* block, bool advanced = true); + Status copy_rows(Block* block, bool advanced = true); - void copy_rows(BlockView* view, bool advanced = true); + Status copy_rows(BlockView* view, bool advanced = true); RowLocation current_row_location() { DCHECK(_record_rowids); @@ -245,7 +245,7 @@ private: ctx->add_cur_batch(); if (pre_ctx != ctx) { if (pre_ctx) { - pre_ctx->copy_rows(block); + RETURN_IF_ERROR(pre_ctx->copy_rows(block)); } pre_ctx = ctx; } @@ -257,14 +257,14 @@ private: if (ctx->is_cur_block_finished() || row_idx >= _block_row_max) { // current block finished, ctx not advance // so copy start_idx = (_index_in_block - _cur_batch_num + 1) - ctx->copy_rows(block, false); + RETURN_IF_ERROR(ctx->copy_rows(block, false)); pre_ctx = nullptr; } } else if (_merged_rows != nullptr) { (*_merged_rows)++; // need skip cur row, so flush rows in pre_ctx if (pre_ctx) { - pre_ctx->copy_rows(block); + RETURN_IF_ERROR(pre_ctx->copy_rows(block)); pre_ctx = nullptr; } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org