This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 43358a8d043 [enhancement](merge-iterator) catch exception to avoid 
coredump when copy_rows (#33567) (#33604)
43358a8d043 is described below

commit 43358a8d0434d10c78587ec471b6c121d85aa115
Author: Xin Liao <[email protected]>
AuthorDate: Sat Apr 13 10:15:43 2024 +0800

    [enhancement](merge-iterator) catch exception to avoid coredump when 
copy_rows (#33567) (#33604)
---
 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 b90ddf8ffb9..8fe3c78b485 100644
--- a/be/src/vec/olap/vgeneric_iterators.cpp
+++ b/be/src/vec/olap/vgeneric_iterators.cpp
@@ -134,42 +134,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 49f96b16347..15caa1732e5 100644
--- a/be/src/vec/olap/vgeneric_iterators.h
+++ b/be/src/vec/olap/vgeneric_iterators.h
@@ -109,9 +109,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);
@@ -246,7 +246,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;
                 }
@@ -258,14 +258,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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to