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

morningman 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 efb73c3cfca [Fix](multi-catalog) Fix core in orc and parquet reader 
sometimes after low mem exception. (#36574)
efb73c3cfca is described below

commit efb73c3cfcadf477156aae52eb221e719a145411
Author: Qi Chen <kaka11.c...@gmail.com>
AuthorDate: Sat Jul 13 16:41:07 2024 +0800

    [Fix](multi-catalog) Fix core in orc and parquet reader sometimes after low 
mem exception. (#36574)
    
    ## Proposed changes
    
    ### Issue
    
    ```
    SIGSEGV address not mapped to object (@0x8) received by PID 2264997 (TID 
2267559 OR 0x7ff60b2a4640) from PID 8; stack trace: ***
     0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, 
siginfo_t*, void*) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/common/signal_handler.h:421
     1# PosixSignals::chained_handler(int, siginfo*, void*) [clone .part.0] in 
/usr/lib/jvm/java-17-openjdk-amd64/lib/server/libjvm.so
     2# JVM_handle_linux_signal in 
/usr/lib/jvm/java-17-openjdk-amd64/lib/server/libjvm.so
     3# 0x00007FFB96D77520 in /lib/x86_64-linux-gnu/libc.so.6
     4# doris::vectorized::Block::clear_column_data(int) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/core/block.cpp:705
     5# 
doris::vectorized::OrcReader::get_next_block_impl(doris::vectorized::Block*, 
unsigned long*, bool*) in /mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
     6# doris::vectorized::OrcReader::get_next_block(doris::vectorized::Block*, 
unsigned long*, bool*) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/format/orc/vorc_reader.cpp:1533
     7# 
doris::vectorized::VFileScanner::_get_block_wrapped(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/scan/vfile_scanner.cpp:355
     8# doris::vectorized::VFileScanner::_get_block_impl(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/scan/vfile_scanner.cpp:298
     9# doris::vectorized::VScanner::get_block(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) in /mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
    10# 
doris::vectorized::VScanner::get_block_after_projects(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/scan/vscanner.cpp:96
    11# 
doris::vectorized::ScannerScheduler::_scanner_scan(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>) at 
/home/zcp/repo_center/doris_branch-2.1/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:258
    ```
    ### Root cause
    It is found that when executing conjuncts expressions when there is
    insufficient memory, column names and types may be inserted, but the
    columns are not inserted into the block, which eventually leads to a
    crash.
    
    If an exception occurs after `block->insert({nullptr, _data_type,
    _expr_name});`, it will lead to the situation mentioned above
    ```
    Status VectorizedFnCall::_do_execute(doris::vectorized::VExprContext* 
context,
                                         doris::vectorized::Block* block, int* 
result_column_id,
                                         std::vector<size_t>& args) {
       ...
        // prepare a column to save result
        block->insert({nullptr, _data_type, _expr_name});
        if (_can_fast_execute) {
            auto can_fast_execute = fast_execute(*block, args, 
num_columns_without_result,
                                                 block->rows(), 
_function->get_name());
            if (can_fast_execute) {
                *result_column_id = num_columns_without_result;
                return Status::OK();
            }
        }
    ```
    
    ### Solution
    #37086
---
 be/src/vec/core/block.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp
index 22062dc5310..35b8c0eb69a 100644
--- a/be/src/vec/core/block.cpp
+++ b/be/src/vec/core/block.cpp
@@ -730,8 +730,10 @@ void Block::clear_column_data(int column_size) noexcept {
         }
     }
     for (auto& d : data) {
-        DCHECK_EQ(d.column->use_count(), 1) << " " << print_use_count();
-        (*std::move(d.column)).assume_mutable()->clear();
+        if (d.column) {
+            DCHECK_EQ(d.column->use_count(), 1) << " " << print_use_count();
+            (*std::move(d.column)).assume_mutable()->clear();
+        }
     }
     row_same_bit.clear();
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to