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

zouxinyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 4bb46a8d580 [fix](memory safe) Fix block-reader memory alloc failed 
make be core dump. (#36299)
4bb46a8d580 is described below

commit 4bb46a8d580cbcd35200af5e4f23830ceb9c3ef2
Author: zhiqiang <[email protected]>
AuthorDate: Fri Jun 14 20:29:18 2024 +0800

    [fix](memory safe) Fix block-reader memory alloc failed make be core dump. 
(#36299)
    
    We should leave the construction of Arena of BlockReader to its init
    function to avoid problem like below:
    
    ```text
    *** Query id: 221bb894cfc945fb-ba8f584e7668a36c ***
    *** is nereids: 1 ***
    *** tablet id: 0 ***
    *** Aborted at 1718335148 (unix time) try "date -d @1718335148" if you are 
using GNU date ***
    *** Current BE git commitID: ac0568acff ***
    *** SIGSEGV address not mapped to object (@0x0) received by PID 1330723 
(TID 1332580 OR 0x7fc6c7af5700) from PID 0; stack trace: ***
     0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, 
siginfo_t*, void*) at 
/mnt/disk1/hezhiqiang/doris/be/src/common/signal_handler.h:421
     1# 0x00007FCF485C3B50 in /lib64/libc.so.6
     2# doris::vectorized::NewOlapScanner::open(doris::RuntimeState*) at 
/mnt/disk1/hezhiqiang/doris/be/src/vec/exec/scan/new_olap_scanner.cpp:218
     3# 
doris::vectorized::ScannerScheduler::_scanner_scan(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>) at 
/mnt/disk1/hezhiqiang/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:249
     4# 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() 
const::{lambda()#1}::operator()() const at 
/mnt/disk1/hezhiqiang/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:141
     5# 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_0::operator()() const at 
/mnt/disk1/hezhiqiang/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:140
     6# void std::__invoke_impl<void, 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_0&>(std::__invoke_other, 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_0&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:61
     7# std::enable_if<is_invocable_r_v<void, 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_0&>, void>::type 
std::__invoke_r<void, 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 
std::shared_ptr<doris::vectorized::ScanTask>)::$_0&>(doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<do [...]
     8# std::_Function_handler<void (), 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_0>::_M_invoke(std::_Any_data 
const&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291
     9# std::function<void ()>::operator()() const at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:560
    10# doris::FunctionRunnable::run() at 
/mnt/disk1/hezhiqiang/doris/be/src/util/threadpool.cpp:48
    11# doris::ThreadPool::dispatch_thread() at 
/mnt/disk1/hezhiqiang/doris/be/src/util/threadpool.cpp:543
    12# void std::__invoke_impl<void, void (doris::ThreadPool::*&)(), 
doris::ThreadPool*&>(std::__invoke_memfun_deref, void 
(doris::ThreadPool::*&)(), doris::ThreadPool*&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:74
    13# std::__invoke_result<void (doris::ThreadPool::*&)(), 
doris::ThreadPool*&>::type std::__invoke<void (doris::ThreadPool::*&)(), 
doris::ThreadPool*&>(void (doris::ThreadPool::*&)(), doris::ThreadPool*&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:96
    14# void std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()>::__call<void, , 
0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/functional:420
    15# void std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()>::operator()<, void>() at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/functional:503
    16# void std::__invoke_impl<void, std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()>&>(std::__invoke_other, 
std::_Bind<void (doris::ThreadPool::*(doris::ThreadPool*))()>&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:61
    17# std::enable_if<is_invocable_r_v<void, std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()>&>, void>::type 
std::__invoke_r<void, std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()>&>(std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()>&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:117
    18# std::_Function_handler<void (), std::_Bind<void 
(doris::ThreadPool::*(doris::ThreadPool*))()> >::_M_invoke(std::_Any_data 
const&) at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291
    19# std::function<void ()>::operator()() const at 
/mnt/disk1/hezhiqiang/toolchains/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:560
    20# doris::Thread::supervise_thread(void*) at 
/mnt/disk1/hezhiqiang/doris/be/src/util/thread.cpp:498
    21# start_thread in /lib64/libpthread.so.0
    22# __clone in /lib64/libc.so.6
    ```
---
 be/src/vec/olap/block_reader.cpp          | 11 +++++++++--
 be/src/vec/olap/block_reader.h            |  3 ++-
 be/src/vec/olap/vertical_block_reader.cpp |  9 +++++++--
 be/src/vec/olap/vertical_block_reader.h   |  4 +++-
 4 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/be/src/vec/olap/block_reader.cpp b/be/src/vec/olap/block_reader.cpp
index ec6bb5cc92b..fef95303a3e 100644
--- a/be/src/vec/olap/block_reader.cpp
+++ b/be/src/vec/olap/block_reader.cpp
@@ -209,6 +209,8 @@ Status BlockReader::_init_agg_state(const ReaderParams& 
read_params) {
 Status BlockReader::init(const ReaderParams& read_params) {
     RETURN_IF_ERROR(TabletReader::init(read_params));
 
+    _arena = std::make_unique<Arena>();
+
     int32_t return_column_size = read_params.origin_return_columns->size();
     _return_columns_loc.resize(read_params.return_columns.size());
     for (int i = 0; i < return_column_size; ++i) {
@@ -511,6 +513,10 @@ size_t BlockReader::_copy_agg_data() {
 }
 
 void BlockReader::_update_agg_value(MutableColumns& columns, int begin, int 
end, bool is_close) {
+    if (!_arena) [[unlikely]] {
+        return;
+    }
+
     for (int i = 0; i < _agg_columns_idx.size(); i++) {
         auto idx = _agg_columns_idx[i];
 
@@ -520,7 +526,7 @@ void BlockReader::_update_agg_value(MutableColumns& 
columns, int begin, int end,
 
         if (begin <= end) {
             function->add_batch_range(begin, end, place, const_cast<const 
IColumn**>(&column_ptr),
-                                      &_arena, _stored_has_null_tag[idx]);
+                                      _arena.get(), _stored_has_null_tag[idx]);
         }
 
         if (is_close) {
@@ -529,8 +535,9 @@ void BlockReader::_update_agg_value(MutableColumns& 
columns, int begin, int end,
             function->reset(place);
         }
     }
+
     if (is_close) {
-        _arena.clear();
+        _arena->clear();
     }
 }
 
diff --git a/be/src/vec/olap/block_reader.h b/be/src/vec/olap/block_reader.h
index 6f9792929db..b60a5bc2373 100644
--- a/be/src/vec/olap/block_reader.h
+++ b/be/src/vec/olap/block_reader.h
@@ -119,7 +119,8 @@ private:
 
     bool _is_rowsets_overlapping = true;
 
-    Arena _arena;
+    // Use pointer to avoid allocing memory during construction
+    std::unique_ptr<Arena> _arena;
 };
 
 } // namespace vectorized
diff --git a/be/src/vec/olap/vertical_block_reader.cpp 
b/be/src/vec/olap/vertical_block_reader.cpp
index 0092a020a2e..c4dda20f40f 100644
--- a/be/src/vec/olap/vertical_block_reader.cpp
+++ b/be/src/vec/olap/vertical_block_reader.cpp
@@ -208,6 +208,8 @@ Status VerticalBlockReader::init(const ReaderParams& 
read_params) {
     _reader_context.batch_size = opts.block_row_max;
     RETURN_IF_ERROR(TabletReader::init(read_params));
 
+    _arena = std::make_unique<Arena>();
+
     auto status = _init_collect_iter(read_params);
     if (!status.ok()) [[unlikely]] {
         if (!config::is_cloud_mode()) {
@@ -298,6 +300,9 @@ void VerticalBlockReader::_update_agg_data(MutableColumns& 
columns) {
 
 void VerticalBlockReader::_update_agg_value(MutableColumns& columns, int 
begin, int end,
                                             bool is_close) {
+    if (!_arena) [[unlikely]] {
+        return;
+    }
     for (size_t idx = 0; idx < _return_columns.size(); ++idx) {
         AggregateFunctionPtr function = _agg_functions[idx];
         AggregateDataPtr place = _agg_places[idx];
@@ -305,7 +310,7 @@ void VerticalBlockReader::_update_agg_value(MutableColumns& 
columns, int begin,
 
         if (begin <= end) {
             function->add_batch_range(begin, end, place, const_cast<const 
IColumn**>(&column_ptr),
-                                      &_arena, _stored_has_null_tag[idx]);
+                                      _arena.get(), _stored_has_null_tag[idx]);
         }
 
         if (is_close) {
@@ -315,7 +320,7 @@ void VerticalBlockReader::_update_agg_value(MutableColumns& 
columns, int begin,
         }
     }
     if (is_close) {
-        _arena.clear();
+        _arena->clear();
     }
 }
 
diff --git a/be/src/vec/olap/vertical_block_reader.h 
b/be/src/vec/olap/vertical_block_reader.h
index 77a01587b58..81ef8d79100 100644
--- a/be/src/vec/olap/vertical_block_reader.h
+++ b/be/src/vec/olap/vertical_block_reader.h
@@ -107,7 +107,9 @@ private:
     // for agg mode
     std::vector<AggregateFunctionPtr> _agg_functions;
     std::vector<AggregateDataPtr> _agg_places;
-    Arena _arena;
+
+    // Use pointer to avoid memory allocation during construction
+    std::unique_ptr<Arena> _arena;
 
     std::vector<int> _normal_columns_idx;
     std::vector<int> _agg_columns_idx;


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

Reply via email to