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

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


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new c3e381b7b3c branch-3.0: [Fix](merge-on-write) Fix 
`MergeIndexDeleteBitmapCalculator::calculate_one()` coredump #44284 (#44328)
c3e381b7b3c is described below

commit c3e381b7b3cc1bc5d3068887ddcc5b46994d4e1e
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Nov 26 19:19:04 2024 +0800

    branch-3.0: [Fix](merge-on-write) Fix 
`MergeIndexDeleteBitmapCalculator::calculate_one()` coredump #44284 (#44328)
    
    Cherry-picked from #44284
    
    Co-authored-by: bobhan1 <[email protected]>
---
 be/src/olap/delete_bitmap_calculator.cpp | 70 +++++++++++++++++---------------
 1 file changed, 38 insertions(+), 32 deletions(-)

diff --git a/be/src/olap/delete_bitmap_calculator.cpp 
b/be/src/olap/delete_bitmap_calculator.cpp
index 6f6e0ec8889..017e3cff3d0 100644
--- a/be/src/olap/delete_bitmap_calculator.cpp
+++ b/be/src/olap/delete_bitmap_calculator.cpp
@@ -90,8 +90,10 @@ bool 
MergeIndexDeleteBitmapCalculatorContext::Comparator::operator()(
     // std::proiroty_queue is a max heap, and function should return the 
result of `lhs < rhs`
     // so if the result of the function is true, rhs will be popped before lhs
     Slice key1, key2;
-    RETURN_IF_ERROR(lhs->get_current_key(key1));
-    RETURN_IF_ERROR(rhs->get_current_key(key2));
+    // MergeIndexDeleteBitmapCalculatorContext::get_current_key may return 
non-OK status if encounter
+    // memory allocation failure, we can only throw exception here to 
propagate error in this situation
+    THROW_IF_ERROR(lhs->get_current_key(key1));
+    THROW_IF_ERROR(rhs->get_current_key(key2));
     if (_sequence_length == 0 && _rowid_length == 0) {
         auto cmp_result = key1.compare(key2);
         // when key1 is the same as key2,
@@ -135,28 +137,30 @@ Status MergeIndexDeleteBitmapCalculator::init(RowsetId 
rowset_id,
                                               std::vector<SegmentSharedPtr> 
const& segments,
                                               size_t seq_col_length, size_t 
rowdid_length,
                                               size_t max_batch_size) {
-    _rowset_id = rowset_id;
-    _seq_col_length = seq_col_length;
-    _rowid_length = rowdid_length;
-    _comparator =
-            
MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length, 
_rowid_length);
-    _contexts.reserve(segments.size());
-    _heap = std::make_unique<Heap>(_comparator);
+    RETURN_IF_CATCH_EXCEPTION({
+        _rowset_id = rowset_id;
+        _seq_col_length = seq_col_length;
+        _rowid_length = rowdid_length;
+        _comparator =
+                
MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length, 
_rowid_length);
+        _contexts.reserve(segments.size());
+        _heap = std::make_unique<Heap>(_comparator);
 
-    for (auto& segment : segments) {
-        RETURN_IF_ERROR(segment->load_index());
-        auto pk_idx = segment->get_primary_key_index();
-        std::unique_ptr<segment_v2::IndexedColumnIterator> index;
-        RETURN_IF_ERROR(pk_idx->new_iterator(&index));
-        auto index_type = 
vectorized::DataTypeFactory::instance().create_data_type(
-                pk_idx->type_info()->type(), 1, 0);
-        _contexts.emplace_back(std::move(index), index_type, segment->id(), 
pk_idx->num_rows());
-        _heap->push(&_contexts.back());
-    }
-    if (_rowid_length > 0) {
-        _rowid_coder = get_key_coder(
-                
get_scalar_type_info<FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT>()->type());
-    }
+        for (auto& segment : segments) {
+            RETURN_IF_ERROR(segment->load_index());
+            auto pk_idx = segment->get_primary_key_index();
+            std::unique_ptr<segment_v2::IndexedColumnIterator> index;
+            RETURN_IF_ERROR(pk_idx->new_iterator(&index));
+            auto index_type = 
vectorized::DataTypeFactory::instance().create_data_type(
+                    pk_idx->type_info()->type(), 1, 0);
+            _contexts.emplace_back(std::move(index), index_type, 
segment->id(), pk_idx->num_rows());
+            _heap->push(&_contexts.back());
+        }
+        if (_rowid_length > 0) {
+            _rowid_coder = get_key_coder(
+                    
get_scalar_type_info<FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT>()->type());
+        }
+    });
     return Status::OK();
 }
 
@@ -209,16 +213,18 @@ Status 
MergeIndexDeleteBitmapCalculator::calculate_one(RowLocation& loc) {
 }
 
 Status MergeIndexDeleteBitmapCalculator::calculate_all(DeleteBitmapPtr 
delete_bitmap) {
-    RowLocation loc;
-    while (true) {
-        auto st = calculate_one(loc);
-        if (st.is<ErrorCode::END_OF_FILE>()) {
-            break;
+    RETURN_IF_CATCH_EXCEPTION({
+        RowLocation loc;
+        while (true) {
+            auto st = calculate_one(loc);
+            if (st.is<ErrorCode::END_OF_FILE>()) {
+                break;
+            }
+            RETURN_IF_ERROR(st);
+            delete_bitmap->add({_rowset_id, loc.segment_id, 
DeleteBitmap::TEMP_VERSION_COMMON},
+                               loc.row_id);
         }
-        RETURN_IF_ERROR(st);
-        delete_bitmap->add({_rowset_id, loc.segment_id, 
DeleteBitmap::TEMP_VERSION_COMMON},
-                           loc.row_id);
-    }
+    });
     return Status::OK();
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to