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 3c594a5970d branch-3.0: [fix](cloud) shorten cache lock held time and add metrics #47472 (#47494) 3c594a5970d is described below commit 3c594a5970da7a71b49f98a6958090e4777bbf8e Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> AuthorDate: Tue Feb 4 22:53:51 2025 +0800 branch-3.0: [fix](cloud) shorten cache lock held time and add metrics #47472 (#47494) Cherry-picked from #47472 Co-authored-by: zhengyu <zhangzhen...@selectdb.com> --- be/src/common/config.cpp | 3 +- be/src/common/config.h | 3 +- be/src/io/cache/block_file_cache.cpp | 133 +++++++++++++++++------------- be/src/io/cache/block_file_cache.h | 59 +++++++------ be/src/io/cache/file_block.cpp | 10 ++- be/src/io/cache/file_block.h | 1 + be/src/io/cache/fs_file_cache_storage.cpp | 2 +- build.sh | 2 +- 8 files changed, 123 insertions(+), 90 deletions(-) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index 1e7f0d12954..14b055f185a 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -1076,7 +1076,8 @@ DEFINE_Bool(enable_ttl_cache_evict_using_lru, "true"); DEFINE_mBool(enbale_dump_error_file, "false"); // limit the max size of error log on disk DEFINE_mInt64(file_cache_error_log_limit_bytes, "209715200"); // 200MB -DEFINE_mInt64(cache_lock_long_tail_threshold, "1000"); +DEFINE_mInt64(cache_lock_wait_long_tail_threshold_us, "30000000"); +DEFINE_mInt64(cache_lock_held_long_tail_threshold_us, "30000000"); DEFINE_mBool(enable_file_cache_keep_base_compaction_output, "false"); DEFINE_mInt64(file_cache_remove_block_qps_limit, "1000"); diff --git a/be/src/common/config.h b/be/src/common/config.h index 852b2bb4aab..0517227f1e5 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -1112,7 +1112,8 @@ DECLARE_Bool(enable_ttl_cache_evict_using_lru); DECLARE_mBool(enbale_dump_error_file); // limit the max size of error log on disk DECLARE_mInt64(file_cache_error_log_limit_bytes); -DECLARE_mInt64(cache_lock_long_tail_threshold); +DECLARE_mInt64(cache_lock_wait_long_tail_threshold_us); +DECLARE_mInt64(cache_lock_held_long_tail_threshold_us); // Base compaction may retrieve and produce some less frequently accessed data, // potentially affecting the file cache hit rate. // This configuration determines whether to retain the output within the file cache. diff --git a/be/src/io/cache/block_file_cache.cpp b/be/src/io/cache/block_file_cache.cpp index 59bb1becb5d..693cd49bb80 100644 --- a/be/src/io/cache/block_file_cache.cpp +++ b/be/src/io/cache/block_file_cache.cpp @@ -202,10 +202,16 @@ BlockFileCache::BlockFileCache(const std::string& cache_base_path, _disk_limit_mode_metrics = std::make_shared<bvar::Status<size_t>>( _cache_base_path.c_str(), "file_cache_disk_limit_mode", 0); - _storage_sync_remove_latency = std::make_shared<bvar::LatencyRecorder>( - _cache_base_path.c_str(), "file_cache_storage_sync_remove_latency_ns"); - _storage_async_remove_latency = std::make_shared<bvar::LatencyRecorder>( - _cache_base_path.c_str(), "file_cache_storage_async_remove_latency_ns"); + _cache_lock_wait_time_us = std::make_shared<bvar::LatencyRecorder>( + _cache_base_path.c_str(), "file_cache_cache_lock_wait_time_us"); + _get_or_set_latency_us = std::make_shared<bvar::LatencyRecorder>( + _cache_base_path.c_str(), "file_cache_get_or_set_latency_us"); + _storage_sync_remove_latency_us = std::make_shared<bvar::LatencyRecorder>( + _cache_base_path.c_str(), "file_cache_storage_sync_remove_latency_us"); + _storage_retry_sync_remove_latency_us = std::make_shared<bvar::LatencyRecorder>( + _cache_base_path.c_str(), "file_cache_storage_retry_sync_remove_latency_us"); + _storage_async_remove_latency_us = std::make_shared<bvar::LatencyRecorder>( + _cache_base_path.c_str(), "file_cache_storage_async_remove_latency_us"); _disposable_queue = LRUQueue(cache_settings.disposable_queue_size, cache_settings.disposable_queue_elements, 60 * 60); @@ -259,7 +265,7 @@ FileCacheType BlockFileCache::string_to_cache_type(const std::string& str) { BlockFileCache::QueryFileCacheContextHolderPtr BlockFileCache::get_query_context_holder( const TUniqueId& query_id) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); if (!config::enable_file_cache_query_limit) { return {}; } @@ -277,7 +283,7 @@ BlockFileCache::QueryFileCacheContextPtr BlockFileCache::get_query_context( } void BlockFileCache::remove_query_context(const TUniqueId& query_id) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); const auto& query_iter = _query_map.find(query_id); if (query_iter != _query_map.end() && query_iter->second.use_count() <= 1) { @@ -322,7 +328,7 @@ void BlockFileCache::QueryFileCacheContext::reserve(const UInt128Wrapper& hash, } Status BlockFileCache::initialize() { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); return initialize_unlocked(cache_lock); } @@ -541,7 +547,7 @@ std::string BlockFileCache::clear_file_cache_async() { int64_t num_files_all = 0; TEST_SYNC_POINT_CALLBACK("BlockFileCache::clear_file_cache_async"); { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); std::vector<FileBlockCell*> deleting_cells; for (auto& [_, offset_to_cell] : _files) { @@ -699,35 +705,39 @@ FileBlocksHolder BlockFileCache::get_or_set(const UInt128Wrapper& hash, size_t o sw.start(); std::lock_guard cache_lock(_mutex); stats->lock_wait_timer += sw.elapsed_time(); - - if (auto iter = _key_to_time.find(hash); - context.cache_type == FileCacheType::INDEX && iter != _key_to_time.end()) { - context.cache_type = FileCacheType::TTL; - context.expiration_time = iter->second; - } - - /// Get all blocks which intersect with the given range. FileBlocks file_blocks; + int64_t duration; { - SCOPED_RAW_TIMER(&stats->get_timer); - file_blocks = get_impl(hash, context, range, cache_lock); - } + SCOPED_RAW_TIMER(&duration); + if (auto iter = _key_to_time.find(hash); + context.cache_type == FileCacheType::INDEX && iter != _key_to_time.end()) { + context.cache_type = FileCacheType::TTL; + context.expiration_time = iter->second; + } - if (file_blocks.empty()) { - SCOPED_RAW_TIMER(&stats->set_timer); - file_blocks = split_range_into_cells(hash, context, offset, size, FileBlock::State::EMPTY, - cache_lock); - } else { - SCOPED_RAW_TIMER(&stats->set_timer); - fill_holes_with_empty_file_blocks(file_blocks, hash, context, range, cache_lock); - } - DCHECK(!file_blocks.empty()); - *_num_read_blocks << file_blocks.size(); - for (auto& block : file_blocks) { - if (block->state() == FileBlock::State::DOWNLOADED) { - *_num_hit_blocks << 1; + /// Get all blocks which intersect with the given range. + { + SCOPED_RAW_TIMER(&stats->get_timer); + file_blocks = get_impl(hash, context, range, cache_lock); + } + + if (file_blocks.empty()) { + SCOPED_RAW_TIMER(&stats->set_timer); + file_blocks = split_range_into_cells(hash, context, offset, size, + FileBlock::State::EMPTY, cache_lock); + } else { + SCOPED_RAW_TIMER(&stats->set_timer); + fill_holes_with_empty_file_blocks(file_blocks, hash, context, range, cache_lock); + } + DCHECK(!file_blocks.empty()); + *_num_read_blocks << file_blocks.size(); + for (auto& block : file_blocks) { + if (block->state_unsafe() == FileBlock::State::DOWNLOADED) { + *_num_hit_blocks << 1; + } } } + *_get_or_set_latency_us << (duration / 1000); return FileBlocksHolder(std::move(file_blocks)); } @@ -781,7 +791,7 @@ BlockFileCache::FileBlockCell* BlockFileCache::add_cell(const UInt128Wrapper& ha } size_t BlockFileCache::try_release() { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); std::vector<FileBlockCell*> trash; for (auto& [hash, blocks] : _files) { for (auto& [offset, cell] : blocks) { @@ -1075,7 +1085,7 @@ bool BlockFileCache::remove_if_ttl_file_blocks(const UInt128Wrapper& file_key, b // remove specific cache synchronously, for critical operations // if in use, cache meta will be deleted after use and the block file is then deleted asynchronously void BlockFileCache::remove_if_cached(const UInt128Wrapper& file_key) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); bool is_ttl_file = remove_if_ttl_file_blocks(file_key, true, cache_lock, true); if (!is_ttl_file) { auto iter = _files.find(file_key); @@ -1097,7 +1107,7 @@ void BlockFileCache::remove_if_cached(const UInt128Wrapper& file_key) { // cache meta is deleted synchronously if not in use, and the block file is deleted asynchronously // if in use, cache meta will be deleted after use and the block file is then deleted asynchronously void BlockFileCache::remove_if_cached_async(const UInt128Wrapper& file_key) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); bool is_ttl_file = remove_if_ttl_file_blocks(file_key, true, cache_lock, /*sync*/ false); if (!is_ttl_file) { auto iter = _files.find(file_key); @@ -1321,9 +1331,12 @@ void BlockFileCache::remove(FileBlockSPtr file_block, T& cache_lock, U& block_lo key.meta.expiration_time = expiration_time; if (sync) { int64_t duration_ns = 0; - SCOPED_RAW_TIMER(&duration_ns); - Status st = _storage->remove(key); - *_storage_sync_remove_latency << duration_ns; + Status st; + { + SCOPED_RAW_TIMER(&duration_ns); + st = _storage->remove(key); + } + *_storage_sync_remove_latency_us << (duration_ns / 1000); if (!st.ok()) { LOG_WARNING("").error(st); } @@ -1335,9 +1348,12 @@ void BlockFileCache::remove(FileBlockSPtr file_block, T& cache_lock, U& block_lo if (!ret) { LOG_WARNING("Failed to push recycle key to queue, do it synchronously"); int64_t duration_ns = 0; - SCOPED_RAW_TIMER(&duration_ns); - Status st = _storage->remove(key); - *_storage_sync_remove_latency << duration_ns; + Status st; + { + SCOPED_RAW_TIMER(&duration_ns); + st = _storage->remove(key); + } + *_storage_retry_sync_remove_latency_us << (duration_ns / 1000); if (!st.ok()) { LOG_WARNING("").error(st); } @@ -1360,7 +1376,7 @@ void BlockFileCache::remove(FileBlockSPtr file_block, T& cache_lock, U& block_lo } size_t BlockFileCache::get_used_cache_size(FileCacheType cache_type) const { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); return get_used_cache_size_unlocked(cache_type, cache_lock); } @@ -1370,7 +1386,7 @@ size_t BlockFileCache::get_used_cache_size_unlocked(FileCacheType cache_type, } size_t BlockFileCache::get_available_cache_size(FileCacheType cache_type) const { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); return get_available_cache_size_unlocked(cache_type, cache_lock); } @@ -1381,7 +1397,7 @@ size_t BlockFileCache::get_available_cache_size_unlocked( } size_t BlockFileCache::get_file_blocks_num(FileCacheType cache_type) const { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); return get_file_blocks_num_unlocked(cache_type, cache_lock); } @@ -1465,7 +1481,7 @@ std::string BlockFileCache::LRUQueue::to_string( } std::string BlockFileCache::dump_structure(const UInt128Wrapper& hash) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); return dump_structure_unlocked(hash, cache_lock); } @@ -1483,7 +1499,7 @@ std::string BlockFileCache::dump_structure_unlocked(const UInt128Wrapper& hash, } std::string BlockFileCache::dump_single_cache_type(const UInt128Wrapper& hash, size_t offset) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); return dump_single_cache_type_unlocked(hash, offset, cache_lock); } @@ -1546,7 +1562,7 @@ std::string BlockFileCache::reset_capacity(size_t new_capacity) { ss << "finish reset_capacity, path=" << _cache_base_path; auto start_time = steady_clock::time_point(); { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); if (new_capacity < _capacity && new_capacity < _cur_cache_size) { int64_t need_remove_size = _cur_cache_size - new_capacity; auto remove_blocks = [&](LRUQueue& queue) -> int64_t { @@ -1662,7 +1678,7 @@ void BlockFileCache::run_background_monitor() { } // report { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); _cur_cache_size_metrics->set_value(_cur_cache_size); _cur_ttl_cache_size_metrics->set_value(_cur_cache_size - _index_queue.get_capacity(cache_lock) - @@ -1712,7 +1728,7 @@ void BlockFileCache::run_background_ttl_gc() { // TODO(zhengyu): fix! } { int64_t cur_time = UnixSeconds(); - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); while (!_time_to_key.empty()) { auto begin = _time_to_key.begin(); if (cur_time < begin->first) { @@ -1743,9 +1759,12 @@ void BlockFileCache::run_background_gc() { } int64_t duration_ns = 0; - SCOPED_RAW_TIMER(&duration_ns); - Status st = _storage->remove(key); - *_storage_async_remove_latency << duration_ns; + Status st; + { + SCOPED_RAW_TIMER(&duration_ns); + st = _storage->remove(key); + } + *_storage_async_remove_latency_us << (duration_ns / 1000); if (!st.ok()) { LOG_WARNING("").error(st); @@ -1758,7 +1777,7 @@ void BlockFileCache::run_background_gc() { void BlockFileCache::modify_expiration_time(const UInt128Wrapper& hash, uint64_t new_expiration_time) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); // 1. If new_expiration_time is equal to zero if (new_expiration_time == 0) { remove_if_ttl_file_blocks(hash, false, cache_lock, false); @@ -1818,7 +1837,7 @@ BlockFileCache::get_hot_blocks_meta(const UInt128Wrapper& hash) const { int64_t cur_time = std::chrono::duration_cast<std::chrono::seconds>( std::chrono::steady_clock::now().time_since_epoch()) .count(); - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); std::vector<std::tuple<size_t, size_t, FileCacheType, uint64_t>> blocks_meta; if (auto iter = _files.find(hash); iter != _files.end()) { for (auto& pair : _files.find(hash)->second) { @@ -1887,7 +1906,7 @@ std::string BlockFileCache::clear_file_cache_directly() { using namespace std::chrono; std::stringstream ss; auto start = steady_clock::now(); - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); LOG_INFO("start clear_file_cache_directly").tag("path", _cache_base_path); std::string clear_msg; @@ -1925,7 +1944,7 @@ std::string BlockFileCache::clear_file_cache_directly() { std::map<size_t, FileBlockSPtr> BlockFileCache::get_blocks_by_key(const UInt128Wrapper& hash) { std::map<size_t, FileBlockSPtr> offset_to_block; - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); if (_files.contains(hash)) { for (auto& [offset, cell] : _files[hash]) { if (cell.file_block->state() == FileBlock::State::DOWNLOADED) { @@ -1940,7 +1959,7 @@ std::map<size_t, FileBlockSPtr> BlockFileCache::get_blocks_by_key(const UInt128W } void BlockFileCache::update_ttl_atime(const UInt128Wrapper& hash) { - SCOPED_CACHE_LOCK(_mutex); + SCOPED_CACHE_LOCK(_mutex, this); if (auto iter = _files.find(hash); iter != _files.end()) { for (auto& [_, cell] : iter->second) { cell.update_atime(); diff --git a/be/src/io/cache/block_file_cache.h b/be/src/io/cache/block_file_cache.h index f93a72cbc62..ce8d13d4a14 100644 --- a/be/src/io/cache/block_file_cache.h +++ b/be/src/io/cache/block_file_cache.h @@ -29,26 +29,47 @@ #include "io/cache/file_block.h" #include "io/cache/file_cache_common.h" #include "io/cache/file_cache_storage.h" +#include "util/runtime_profile.h" #include "util/threadpool.h" namespace doris::io { using RecycleFileCacheKeys = moodycamel::ConcurrentQueue<FileCacheKey>; + +class LockScopedTimer { +public: + LockScopedTimer() : start_(std::chrono::steady_clock::now()) {} + ~LockScopedTimer() { + auto end = std::chrono::steady_clock::now(); + auto duration_us = + std::chrono::duration_cast<std::chrono::microseconds>(end - start_).count(); + if (duration_us > config::cache_lock_held_long_tail_threshold_us) { + LOG(WARNING) << "Lock held time " << std::to_string(duration_us) << "us. " + << get_stack_trace(); + } + } + +private: + std::chrono::time_point<std::chrono::steady_clock> start_; +}; + // Note: the cache_lock is scoped, so do not add do...while(0) here. #ifdef ENABLE_CACHE_LOCK_DEBUG -#define SCOPED_CACHE_LOCK(MUTEX) \ +#define SCOPED_CACHE_LOCK(MUTEX, cache) \ std::chrono::time_point<std::chrono::steady_clock> start_time = \ std::chrono::steady_clock::now(); \ std::lock_guard cache_lock(MUTEX); \ std::chrono::time_point<std::chrono::steady_clock> acq_time = \ std::chrono::steady_clock::now(); \ - auto duration = \ - std::chrono::duration_cast<std::chrono::milliseconds>(acq_time - start_time).count(); \ - if (duration > config::cache_lock_long_tail_threshold) \ - LOG(WARNING) << "Lock wait time " << std::to_string(duration) << "ms. " \ - << get_stack_trace_by_boost() << std::endl; \ + auto duration_us = \ + std::chrono::duration_cast<std::chrono::microseconds>(acq_time - start_time).count(); \ + *(cache->_cache_lock_wait_time_us) << duration_us; \ + if (duration_us > config::cache_lock_wait_long_tail_threshold_us) { \ + LOG(WARNING) << "Lock wait time " << std::to_string(duration_us) << "us. " \ + << get_stack_trace() << std::endl; \ + } \ LockScopedTimer cache_lock_timer; #else -#define SCOPED_CACHE_LOCK(MUTEX) std::lock_guard cache_lock(MUTEX); +#define SCOPED_CACHE_LOCK(MUTEX, cache) std::lock_guard cache_lock(MUTEX); #endif template <class Lock> @@ -57,23 +78,6 @@ concept IsXLock = std::same_as<Lock, std::lock_guard<std::mutex>> || class FSFileCacheStorage; -class LockScopedTimer { -public: - LockScopedTimer() : start_(std::chrono::steady_clock::now()) {} - - ~LockScopedTimer() { - auto end = std::chrono::steady_clock::now(); - auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start_).count(); - if (duration > 500) { - LOG(WARNING) << "Lock held time " << std::to_string(duration) << "ms. " - << get_stack_trace_by_boost(); - } - } - -private: - std::chrono::time_point<std::chrono::steady_clock> start_; -}; - // The BlockFileCache is responsible for the management of the blocks // The current strategies are lru and ttl. class BlockFileCache { @@ -533,8 +537,11 @@ private: std::shared_ptr<bvar::Status<double>> _hit_ratio_1h; std::shared_ptr<bvar::Status<size_t>> _disk_limit_mode_metrics; - std::shared_ptr<bvar::LatencyRecorder> _storage_sync_remove_latency; - std::shared_ptr<bvar::LatencyRecorder> _storage_async_remove_latency; + std::shared_ptr<bvar::LatencyRecorder> _cache_lock_wait_time_us; + std::shared_ptr<bvar::LatencyRecorder> _get_or_set_latency_us; + std::shared_ptr<bvar::LatencyRecorder> _storage_sync_remove_latency_us; + std::shared_ptr<bvar::LatencyRecorder> _storage_retry_sync_remove_latency_us; + std::shared_ptr<bvar::LatencyRecorder> _storage_async_remove_latency_us; }; } // namespace doris::io diff --git a/be/src/io/cache/file_block.cpp b/be/src/io/cache/file_block.cpp index 8c911ab8f24..06f58730296 100644 --- a/be/src/io/cache/file_block.cpp +++ b/be/src/io/cache/file_block.cpp @@ -59,6 +59,10 @@ FileBlock::State FileBlock::state() const { return _download_state; } +FileBlock::State FileBlock::state_unsafe() const { + return _download_state; +} + uint64_t FileBlock::get_caller_id() { uint64_t id; #if defined(__APPLE__) @@ -144,7 +148,7 @@ Status FileBlock::append(Slice data) { Status FileBlock::finalize() { if (_downloaded_size != 0 && _downloaded_size != _block_range.size()) { - SCOPED_CACHE_LOCK(_mgr->_mutex); + SCOPED_CACHE_LOCK(_mgr->_mutex, _mgr); size_t old_size = _block_range.size(); _block_range.right = _block_range.left + _downloaded_size - 1; size_t new_size = _block_range.size(); @@ -179,7 +183,7 @@ Status FileBlock::change_cache_type_between_ttl_and_others(FileCacheType new_typ } Status FileBlock::change_cache_type_between_normal_and_index(FileCacheType new_type) { - SCOPED_CACHE_LOCK(_mgr->_mutex); + SCOPED_CACHE_LOCK(_mgr->_mutex, _mgr); std::lock_guard block_lock(_mutex); bool expr = (new_type != FileCacheType::TTL && _key.meta.type != FileCacheType::TTL); if (!expr) { @@ -293,7 +297,7 @@ FileBlocksHolder::~FileBlocksHolder() { } } if (should_remove) { - SCOPED_CACHE_LOCK(_mgr->_mutex); + SCOPED_CACHE_LOCK(_mgr->_mutex, _mgr); std::lock_guard block_lock(file_block->_mutex); if (file_block.use_count() == 2) { DCHECK(file_block->state_unlock(block_lock) != FileBlock::State::DOWNLOADING); diff --git a/be/src/io/cache/file_block.h b/be/src/io/cache/file_block.h index 93c3841693d..38c57ce9358 100644 --- a/be/src/io/cache/file_block.h +++ b/be/src/io/cache/file_block.h @@ -66,6 +66,7 @@ public: ~FileBlock() = default; State state() const; + State state_unsafe() const; static std::string state_to_string(FileBlock::State state); diff --git a/be/src/io/cache/fs_file_cache_storage.cpp b/be/src/io/cache/fs_file_cache_storage.cpp index cf1cd41a537..ce02c2a101d 100644 --- a/be/src/io/cache/fs_file_cache_storage.cpp +++ b/be/src/io/cache/fs_file_cache_storage.cpp @@ -488,7 +488,7 @@ void FSFileCacheStorage::load_cache_info_into_memory(BlockFileCache* _mgr) const std::vector<BatchLoadArgs> batch_load_buffer; batch_load_buffer.reserve(scan_length); auto add_cell_batch_func = [&]() { - SCOPED_CACHE_LOCK(_mgr->_mutex); + SCOPED_CACHE_LOCK(_mgr->_mutex, _mgr); auto f = [&](const BatchLoadArgs& args) { // in async load mode, a cell may be added twice. diff --git a/build.sh b/build.sh index 514588ff795..24ceed2baea 100755 --- a/build.sh +++ b/build.sh @@ -443,7 +443,7 @@ if [[ -z "${ENABLE_INJECTION_POINT}" ]]; then fi if [[ -z "${ENABLE_CACHE_LOCK_DEBUG}" ]]; then - ENABLE_CACHE_LOCK_DEBUG='OFF' + ENABLE_CACHE_LOCK_DEBUG='ON' fi if [[ -z "${RECORD_COMPILER_SWITCHES}" ]]; then --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org