From 9f4b2969c26d4036fc6831ae85afeb50ffe6e453 Mon Sep 17 00:00:00 2001 From: zhengyu Date: Mon, 8 Dec 2025 17:34:26 +0800 Subject: [PATCH] [fix](filecache) using invalid memory crashes clear_need_update_lru_blocks (#58768) *** SIGSEGV unknown detail explain (@0x0) received by PID 2118050 (TID 2119672 OR 0x7f969ebf3640) from PID 0; stack trace: *** 0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*) at /mnt/disk3/pipeline/repo/selectdb-core_branch-selectdb-doris-3.1/selectdb-core/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# 0x00007F9A01EF7520 in /lib/x86_64-linux-gnu/libc.so.6 4# unsigned long moodycamel::ConcurrentQueue, moodycamel::ConcurrentQueueDefaultTraits>::ImplicitProducer::dequeue_bulk*>(std::shared_ptr*&, unsigned long) at /mnt/disk3/pipeline/repo/selectdb-core_branch-selectdb-doris-3.1/selectdb-core/thirdparty/installed/include/concurrentqueue.h:2802 5# doris::io::BlockFileCache::clear_need_update_lru_blocks() at /mnt/disk3/pipeline/repo/selectdb-core_branch-selectdb-doris-3.1/selectdb-core/be/src/io/cache/block_file_cache.cpp:2289 6# doris::io::BlockFileCache::clear_file_cache_directly[abi:cxx11]() at /mnt/disk3/pipeline/repo/selectdb-core_branch-selectdb-doris-3.1/selectdb-core/be/src/io/cache/block_file_cache.cpp:2338 7# doris::io::FileCacheFactory::clear_file_caches[abi:cxx11](bool) at /mnt/disk3/pipeline/repo/selectdb-core_branch-selectdb-doris-3.1/selectdb-core/be/src/io/cache/block_file_cache_factory.cpp:210 --- be/src/io/cache/block_file_cache.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/be/src/io/cache/block_file_cache.cpp b/be/src/io/cache/block_file_cache.cpp index fcfa2bda9e7490..22608c84ba988b 100644 --- a/be/src/io/cache/block_file_cache.cpp +++ b/be/src/io/cache/block_file_cache.cpp @@ -2268,9 +2268,13 @@ bool BlockFileCache::try_reserve_during_async_load(size_t size, } void BlockFileCache::clear_need_update_lru_blocks() { - std::vector buffer; - buffer.reserve(1024); - while (_need_update_lru_blocks.try_dequeue_bulk(buffer.data(), buffer.capacity())) { + constexpr size_t kBatchSize = 1024; + std::vector buffer(kBatchSize); + size_t drained = 0; + while ((drained = _need_update_lru_blocks.try_dequeue_bulk(buffer.data(), buffer.size())) > 0) { + for (size_t i = 0; i < drained; ++i) { + buffer[i].reset(); + } } }