gohalo opened a new pull request, #53088:
URL: https://github.com/apache/doris/pull/53088

   ### What problem does this PR solve?
   
   Issue Number: close #52767 
   
   Problem Summary:
   When try to load some invalid bitmap value, the related be nodes will core 
dumped.
   
   ```
   *** Aborted at 1749536908 (unix time) try "date -d @1749536908" if you are 
using GNU date ***
   *** Current BE git commitID: d5a02e095d ***
   *** SIGABRT unknown detail explain (@0x55d8000bf626) received by PID 783910 
(TID 1564162 OR 0x7f2bd4e16700) from PID 783910; stack trace: ***
    0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, 
siginfo_t*, void*) at 
/home/zcp/repo_center/doris_release/doris/be/src/common/signal_handler.h:421
    1# 0x00007F4DB9021400 in /lib64/libc.so.6
    2# gsignal in /lib64/libc.so.6
    3# abort in /lib64/libc.so.6
    4# __gnu_cxx::__verbose_terminate_handler() [clone .cold] at 
../../../../libstdc++-v3/libsupc++/vterminate.cc:75
    5# __cxxabiv1::__terminate(void (*)()) at 
../../../../libstdc++-v3/libsupc++/eh_terminate.cc:48
    6# 0x000055C8818B4A31 in 
/home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
    7# 0x000055C8818B4B84 in 
/home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
    8# roaring::Roaring::read(char const*, bool) in 
/home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
    9# doris::detail::Roaring64Map::read(char const*) in 
/home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
   10# doris::BitmapValue::deserialize(char const*) at 
/home/zcp/repo_center/doris_release/doris/be/src/util/bitmap_value.h:1911
   11# 
doris::vectorized::BitmapFromBase64::vector(doris::vectorized::PODArray<unsigned
 char, 4096ul, Allocator<false, false, false>, 15ul, 16ul> const&, 
doris::vectorized::PODArray<unsigned int, 4096ul, Allocator<false, false, 
false>, 15ul, 16ul> const&, std::vector<doris::BitmapValue, 
std::allocator<doris::BitmapValue> >&, doris::vectorized::PODArray<unsigned 
char, 4096ul, Allocator<false, false, false>, 15ul, 16ul>&, unsigned long) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function_bitmap.cpp:291
   12# 
doris::vectorized::FunctionBitmapAlwaysNull<doris::vectorized::BitmapFromBase64>::execute_impl(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function_bitmap.cpp:366
   13# 
doris::vectorized::DefaultExecutable::execute_impl(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function.h:429
   14# 
doris::vectorized::PreparedFunctionImpl::_execute_skipped_constant_deal(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long, bool) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function.cpp:122
   15# 
doris::vectorized::PreparedFunctionImpl::default_implementation_for_nulls(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long, bool, bool*) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function.cpp:217
   16# 
doris::vectorized::PreparedFunctionImpl::execute_without_low_cardinality_columns(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long, bool) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function.cpp:244
   17# 
doris::vectorized::PreparedFunctionImpl::execute(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long, bool) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function.cpp:250
   18# doris::vectorized::IFunctionBase::execute(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned long, std::allocator<unsigned 
long> > const&, unsigned long, unsigned long, bool) const at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/functions/function.h:179
   19# 
doris::vectorized::VectorizedFnCall::_do_execute(doris::vectorized::VExprContext*,
 doris::vectorized::Block*, int*, std::vector<unsigned long, 
std::allocator<unsigned long> >&) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exprs/vectorized_fn_call.cpp:169
   20# 
doris::vectorized::VectorizedFnCall::execute(doris::vectorized::VExprContext*, 
doris::vectorized::Block*, int*) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exprs/vectorized_fn_call.cpp:185
   21# 
doris::vectorized::VectorizedFnCall::_do_execute(doris::vectorized::VExprContext*,
 doris::vectorized::Block*, int*, std::vector<unsigned long, 
std::allocator<unsigned long> >&) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exprs/vectorized_fn_call.cpp:152
   22# 
doris::vectorized::VectorizedFnCall::execute(doris::vectorized::VExprContext*, 
doris::vectorized::Block*, int*) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exprs/vectorized_fn_call.cpp:185
   23# doris::vectorized::VExprContext::execute(doris::vectorized::Block*, 
int*) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exprs/vexpr_context.cpp:54
   24# 
doris::vectorized::VFileScanner::_convert_to_output_block(doris::vectorized::Block*)
 in /home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
   25# 
doris::vectorized::VFileScanner::_get_block_wrapped(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exec/scan/vfile_scanner.cpp:380
   26# doris::vectorized::VFileScanner::_get_block_impl(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exec/scan/vfile_scanner.cpp:302
   27# doris::vectorized::VScanner::get_block(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) in 
/home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
   28# 
doris::vectorized::VScanner::get_block_after_projects(doris::RuntimeState*, 
doris::vectorized::Block*, bool*) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exec/scan/vscanner.cpp:100
   29# 
doris::vectorized::ScannerScheduler::_scanner_scan(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>) at 
/home/zcp/repo_center/doris_release/doris/be/src/vec/exec/scan/scanner_scheduler.cpp:269
   30# std::_Function_handler<void (), 
doris::vectorized::ScannerScheduler::submit(std::shared_ptr<doris::vectorized::ScannerContext>,
 std::shared_ptr<doris::vectorized::ScanTask>)::$_1::operator()() 
const::{lambda()#1}>::_M_invoke(std::_Any_data const&) at 
/var/local/ldb-toolchain/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291
   31# doris::ThreadPool::dispatch_thread() in 
/home/olap/music-doris-gy/doris-be-log/default-be/approot/be/lib/doris_be
   32# doris::Thread::supervise_thread(void*) at 
/home/zcp/repo_center/doris_release/doris/be/src/util/thread.cpp:499
   33# start_thread in /lib64/libpthread.so.0
   34# clone in /lib64/libc.so.6
   ```
   
   Could reproduce with the following steps, which copied from #52767 
   
   Create a simple table with bitmap value.
   
   ```
   CREATE TABLE test_bitmap(
       id BIGINT NOT NULL,
       arr BITMAP BITMAP_UNION NOT NULL
   )
   AGGREGATE KEY(id)
   DISTRIBUTED BY HASH(id) BUCKETS 1
   properties(
     "replication_num" = "1"
   );
   ```
   and `test.csv` file, only one simple line
   
   ```
   1|Av8DCg==
   ```
   
   then load it, and the be will core dump
   
   ```
   curl --location-trusted -u root: \
       -H "Expect: 100-continue" \
       -H "column_separator:|" \
       -H "columns:id,arr,arr=bitmap_from_base64(arr)" \
       -T test.csv \
       -XPUT http://127.0.0.1:8030/api/test/test_bitmap/_stream_load
   ```
   
   
https://github.com/RoaringBitmap/CRoaring/blob/835884b2939f02337313c2abef2992568d9b2e9d/cpp/roaring.hh#L647-L655
   
   ``` c
       static Roaring read(const char *buf, bool portable = true) {
           roaring_bitmap_t *r =
               portable ? api::roaring_bitmap_portable_deserialize(buf)
                        : api::roaring_bitmap_deserialize(buf);
           if (r == NULL) {
               ROARING_TERMINATE("failed alloc while reading");
           }
           return Roaring(r);
       }
   ```
   
   When the buffer is invalid, in this case, it's has invalid leading bytes and 
which is not equal to `SERIAL_COOKIE`, and then `NULL` returned. And the 
default action of `ROARING_EXCEPTIONS` will be `throw std::runtime_error(_s)`.
   
   ``` c
   #ifndef ROARING_TERMINATE
   #if ROARING_EXCEPTIONS
   #define ROARING_TERMINATE(_s) throw std::runtime_error(_s)
   #else
   #define ROARING_TERMINATE(_s) std::terminate()
   #endif
   #endif
   ```
   
   If this hasn't been caught, then bingo!!! 
   
   ### Release note
   
   None
   
   ### Check List (For Author)
   
   - Test <!-- At least one of them must be included. -->
       - [ ] Regression test
       - [ ] Unit Test
       - [x] Manual test (add detailed scripts or steps below)
       - [ ] No need to test or manual test. Explain why:
           - [ ] This is a refactor/code format and no logic has been changed.
           - [ ] Previous test can cover this change.
           - [ ] No code files have been changed.
           - [ ] Other reason <!-- Add your reason?  -->
   
   - Behavior changed:
       - [x] No.
       - [ ] Yes. <!-- Explain the behavior change -->
   
   - Does this need documentation?
       - [x] No.
       - [ ] Yes. <!-- Add document PR link here. eg: 
https://github.com/apache/doris-website/pull/1214 -->
   
   ### Check List (For Reviewer who merge this PR)
   
   - [ ] Confirm the release note
   - [ ] Confirm test cases
   - [ ] Confirm document
   - [ ] Add branch pick label <!-- Add branch pick label that this PR should 
merge into -->
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to