diff --git a/dbms/src/IO/Compression/CompressionCodecFactory.cpp b/dbms/src/IO/Compression/CompressionCodecFactory.cpp index 100160d7c6f..eecadac53da 100644 --- a/dbms/src/IO/Compression/CompressionCodecFactory.cpp +++ b/dbms/src/IO/Compression/CompressionCodecFactory.cpp @@ -23,6 +23,7 @@ #include #include +#include #if USE_QPL #include @@ -76,28 +77,40 @@ template CompressionCodecPtr CompressionCodecFactory::getStaticCodec( const CompressionSetting & setting); +std::shared_mutex lz4_mutex; + template <> CompressionCodecPtr CompressionCodecFactory::getStaticCodec(const CompressionSetting & setting) { static constexpr auto MAX_LZ4_MAP_SIZE = 10; static std::unordered_map lz4_map(MAX_LZ4_MAP_SIZE); - auto it = lz4_map.find(setting.level); - if (it != lz4_map.end()) - return it->second; + { + std::shared_lock lock(lz4_mutex); + auto it = lz4_map.find(setting.level); + if (it != lz4_map.end()) + return it->second; + } + std::unique_lock lock(lz4_mutex); if (lz4_map.size() >= MAX_LZ4_MAP_SIZE) lz4_map.clear(); lz4_map.emplace(setting.level, std::make_shared(setting.level)); return lz4_map[setting.level]; } +std::shared_mutex lz4hc_mutex; + template <> CompressionCodecPtr CompressionCodecFactory::getStaticCodec(const CompressionSetting & setting) { static constexpr auto MAX_LZ4HC_MAP_SIZE = 10; static std::unordered_map lz4hc_map; - auto it = lz4hc_map.find(setting.level); - if (it != lz4hc_map.end()) - return it->second; + { + std::shared_lock lock(lz4hc_mutex); + auto it = lz4hc_map.find(setting.level); + if (it != lz4hc_map.end()) + return it->second; + } + std::unique_lock lock(lz4hc_mutex); if (lz4hc_map.size() >= MAX_LZ4HC_MAP_SIZE) lz4hc_map.clear(); lz4hc_map.emplace(setting.level, std::make_shared(setting.level));