This is an automated email from the ASF dual-hosted git repository.
dataroaring 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 e71e4bfdb45 [Bugfix] Fix nullptr cache object because init file cache
concurrently (#35722)
e71e4bfdb45 is described below
commit e71e4bfdb45c129bfeeba282cf38a0d3dd5eec96
Author: Lightman <[email protected]>
AuthorDate: Tue Jun 4 22:50:32 2024 +0800
[Bugfix] Fix nullptr cache object because init file cache concurrently
(#35722)
The file caches are inited in
be/src/runtime/exec_env_init.cpp:init_file_cache_factory concurrently.
The field `_path_to_cache` and `_caches` is not protected by lock. So BE
may coredump because the cache object is nullptr.
---
be/src/io/cache/block_file_cache_factory.cpp | 10 +++++++---
be/src/io/cache/block_file_cache_factory.h | 1 +
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/be/src/io/cache/block_file_cache_factory.cpp
b/be/src/io/cache/block_file_cache_factory.cpp
index 93029871e61..a6df98c686d 100644
--- a/be/src/io/cache/block_file_cache_factory.cpp
+++ b/be/src/io/cache/block_file_cache_factory.cpp
@@ -92,16 +92,20 @@ Status FileCacheFactory::create_file_cache(const
std::string& cache_base_path,
}
auto cache = std::make_unique<BlockFileCache>(cache_base_path,
file_cache_settings);
RETURN_IF_ERROR(cache->initialize());
- _path_to_cache[cache_base_path] = cache.get();
- _caches.push_back(std::move(cache));
+ {
+ std::lock_guard lock(_mtx);
+ _path_to_cache[cache_base_path] = cache.get();
+ _caches.push_back(std::move(cache));
+ _capacity += file_cache_settings.capacity;
+ }
LOG(INFO) << "[FileCache] path: " << cache_base_path
<< " total_size: " << file_cache_settings.capacity
<< " disk_total_size: " << disk_capacity;
- _capacity += file_cache_settings.capacity;
return Status::OK();
}
BlockFileCache* FileCacheFactory::get_by_path(const UInt128Wrapper& key) {
+ // dont need lock mutex because _caches is immutable after
create_file_cache
return _caches[KeyHash()(key) % _caches.size()].get();
}
diff --git a/be/src/io/cache/block_file_cache_factory.h
b/be/src/io/cache/block_file_cache_factory.h
index 2d0dc27a036..696dae6fdc5 100644
--- a/be/src/io/cache/block_file_cache_factory.h
+++ b/be/src/io/cache/block_file_cache_factory.h
@@ -75,6 +75,7 @@ public:
FileCacheFactory(const FileCacheFactory&) = delete;
private:
+ std::mutex _mtx;
std::vector<std::unique_ptr<BlockFileCache>> _caches;
std::unordered_map<std::string, BlockFileCache*> _path_to_cache;
size_t _capacity = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]