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

Reply via email to