diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-03 10:46:23 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-03 10:46:23 +0000 |
commit | 6f85020f1b6896e9d79ae59f934be0dc4e7aa09a (patch) | |
tree | 7b0b1af322fc72ddceda02c508457ae97ad266de /vespalib | |
parent | 464a9a1be8f4c722ef878ccf9fec04a65735dd4f (diff) |
Enable having lock free atomic<CompresssionConfig> and make its use in documentstore thread safe.
Diffstat (limited to 'vespalib')
8 files changed, 37 insertions, 32 deletions
diff --git a/vespalib/src/tests/compression/compression_test.cpp b/vespalib/src/tests/compression/compression_test.cpp index eb1fce0a683..27326243b60 100644 --- a/vespalib/src/tests/compression/compression_test.cpp +++ b/vespalib/src/tests/compression/compression_test.cpp @@ -67,6 +67,11 @@ TEST("requiret that zstd compression/decompression works") { EXPECT_EQUAL(_G_compressableText, vespalib::string(decompress.data(), decompress.size())); } +TEST("require that CompressionConfig is Atomic") { + EXPECT_EQUAL(8u, sizeof(CompressionConfig)); + EXPECT_TRUE(std::atomic<CompressionConfig>::is_always_lock_free); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/vespalib/src/vespa/vespalib/util/compressionconfig.h b/vespalib/src/vespa/vespalib/util/compressionconfig.h index 58ea101db13..2a09fa7e086 100644 --- a/vespalib/src/vespa/vespalib/util/compressionconfig.h +++ b/vespalib/src/vespa/vespalib/util/compressionconfig.h @@ -9,7 +9,7 @@ namespace vespalib::compression { struct CompressionConfig { - enum Type { + enum Type : uint8_t { NONE = 0, NONE_MULTI = 1, HISTORIC_2 = 2, @@ -21,15 +21,15 @@ struct CompressionConfig { }; CompressionConfig() noexcept - : type(NONE), compressionLevel(0), threshold(90), minSize(0) {} + : CompressionConfig(NONE, 0, 90) {} CompressionConfig(Type t) noexcept - : type(t), compressionLevel(9), threshold(90), minSize(0) {} + : CompressionConfig(t, 9, 90) {} CompressionConfig(Type t, uint8_t level, uint8_t minRes) noexcept - : type(t), compressionLevel(level), threshold(minRes), minSize(0) {} + : CompressionConfig(t, level, minRes, 0) {} CompressionConfig(Type t, uint8_t lvl, uint8_t minRes, size_t minSz) noexcept - : type(t), compressionLevel(lvl), threshold(minRes), minSize(minSz) {} + : minSize(minSz), type(t), compressionLevel(lvl), threshold(minRes) {} bool operator==(const CompressionConfig& o) const { return (type == o.type @@ -66,10 +66,10 @@ struct CompressionConfig { } bool useCompression() const { return isCompressed(type); } - Type type; - uint8_t compressionLevel; - uint8_t threshold; - size_t minSize; + uint32_t minSize; + Type type; + uint8_t compressionLevel; + uint8_t threshold; }; } diff --git a/vespalib/src/vespa/vespalib/util/compressor.cpp b/vespalib/src/vespa/vespalib/util/compressor.cpp index c477b021956..4d708473423 100644 --- a/vespalib/src/vespa/vespalib/util/compressor.cpp +++ b/vespalib/src/vespa/vespalib/util/compressor.cpp @@ -15,7 +15,7 @@ namespace vespalib::compression { namespace { template <typename F> -void with_compressor(const CompressionConfig::Type &type, F &&f) { +void with_compressor(CompressionConfig::Type type, F &&f) { switch (type) { case CompressionConfig::LZ4: { @@ -40,7 +40,7 @@ void with_compressor(const CompressionConfig::Type &type, F &&f) { //----------------------------------------------------------------------------- CompressionConfig::Type -compress(ICompressor & compressor, const CompressionConfig & compression, const ConstBufferRef & org, DataBuffer & dest) +compress(ICompressor & compressor, CompressionConfig compression, const ConstBufferRef & org, DataBuffer & dest) { CompressionConfig::Type type(CompressionConfig::NONE); dest.ensureFree(compressor.adjustProcessLen(0, org.size())); @@ -55,7 +55,7 @@ compress(ICompressor & compressor, const CompressionConfig & compression, const } CompressionConfig::Type -docompress(const CompressionConfig & compression, const ConstBufferRef & org, DataBuffer & dest) +docompress(CompressionConfig compression, const ConstBufferRef & org, DataBuffer & dest) { switch (compression.type) { case CompressionConfig::LZ4: @@ -80,8 +80,9 @@ CompressionConfig::Type compress(CompressionConfig::Type compression, const ConstBufferRef & org, DataBuffer & dest, bool allowSwap) { return compress(CompressionConfig(compression), org, dest, allowSwap); } + CompressionConfig::Type -compress(const CompressionConfig & compression, const ConstBufferRef & org, DataBuffer & dest, bool allowSwap) +compress(CompressionConfig compression, const ConstBufferRef & org, DataBuffer & dest, bool allowSwap) { CompressionConfig::Type type(CompressionConfig::NONE); if (org.size() >= compression.minSize) { @@ -124,7 +125,7 @@ decompress(ICompressor & decompressor, size_t uncompressedLen, const ConstBuffer } void -decompress(const CompressionConfig::Type & type, size_t uncompressedLen, const ConstBufferRef & org, DataBuffer & dest, bool allowSwap) +decompress(CompressionConfig::Type type, size_t uncompressedLen, const ConstBufferRef & org, DataBuffer & dest, bool allowSwap) { switch (type) { case CompressionConfig::LZ4: @@ -169,7 +170,7 @@ size_t computeMaxCompressedsize(CompressionConfig::Type type, size_t payloadSize //----------------------------------------------------------------------------- -Compress::Compress(const CompressionConfig &config, +Compress::Compress(CompressionConfig config, const char *uncompressed_data, size_t uncompressed_size) : _space(), _type(CompressionConfig::NONE), @@ -194,7 +195,7 @@ Compress::Compress(const CompressionConfig &config, } } -Decompress::Decompress(const CompressionConfig::Type &type, size_t uncompressed_size, +Decompress::Decompress(CompressionConfig::Type type, size_t uncompressed_size, const char *compressed_data, size_t compressed_size) : _space(), _data(compressed_data), diff --git a/vespalib/src/vespa/vespalib/util/compressor.h b/vespalib/src/vespa/vespalib/util/compressor.h index fd29c028af2..2a02d684719 100644 --- a/vespalib/src/vespa/vespalib/util/compressor.h +++ b/vespalib/src/vespa/vespalib/util/compressor.h @@ -13,7 +13,7 @@ class ICompressor { public: virtual ~ICompressor() { } - virtual bool process(const CompressionConfig& config, const void * input, size_t inputLen, void * output, size_t & outputLen) = 0; + virtual bool process(CompressionConfig config, const void * input, size_t inputLen, void * output, size_t & outputLen) = 0; virtual bool unprocess(const void * input, size_t inputLen, void * output, size_t & outputLen) = 0; virtual size_t adjustProcessLen(uint16_t options, size_t len) const = 0; }; @@ -28,7 +28,7 @@ public: * @param allowSwap will tell it the data must be appended or if it can be swapped in if it is uncompressable or config is NONE. */ CompressionConfig::Type compress(CompressionConfig::Type compression, const ConstBufferRef & org, DataBuffer & dest, bool allowSwap); -CompressionConfig::Type compress(const CompressionConfig & compression, const vespalib::ConstBufferRef & org, vespalib::DataBuffer & dest, bool allowSwap); +CompressionConfig::Type compress(CompressionConfig compression, const vespalib::ConstBufferRef & org, vespalib::DataBuffer & dest, bool allowSwap); /** * Will try to decompress a buffer according to the config. @@ -41,7 +41,7 @@ CompressionConfig::Type compress(const CompressionConfig & compression, const ve * Then it will be swapped in. * @param allowSwap will tell it the data must be appended or if it can be swapped in if compression type is NONE. */ -void decompress(const CompressionConfig::Type & compression, size_t uncompressedLen, const vespalib::ConstBufferRef & org, vespalib::DataBuffer & dest, bool allowSwap); +void decompress(CompressionConfig::Type compression, size_t uncompressedLen, const vespalib::ConstBufferRef & org, vespalib::DataBuffer & dest, bool allowSwap); size_t computeMaxCompressedsize(CompressionConfig::Type type, size_t uncompressedSize); @@ -53,14 +53,13 @@ size_t computeMaxCompressedsize(CompressionConfig::Type type, size_t uncompresse **/ class Compress { private: - alloc::Alloc _space; + alloc::Alloc _space; CompressionConfig::Type _type; - const char *_data; - size_t _size; + const char *_data; + size_t _size; public: - Compress(const CompressionConfig &config, - const char *uncompressed_data, size_t uncompressed_size); - const CompressionConfig::Type &type() const { return _type; } + Compress(CompressionConfig config, const char *uncompressed_data, size_t uncompressed_size); + CompressionConfig::Type type() const { return _type; } const char *data() const { return _data; } size_t size() const { return _size; } }; @@ -72,10 +71,10 @@ public: class Decompress { private: alloc::Alloc _space; - const char *_data; - size_t _size; + const char *_data; + size_t _size; public: - Decompress(const CompressionConfig::Type &type, size_t uncompressed_size, + Decompress(CompressionConfig::Type type, size_t uncompressed_size, const char *compressed_data, size_t compressed_size); const char *data() const { return _data; } size_t size() const { return _size; } diff --git a/vespalib/src/vespa/vespalib/util/lz4compressor.cpp b/vespalib/src/vespa/vespalib/util/lz4compressor.cpp index d33b7339c4b..4176dd5d2c6 100644 --- a/vespalib/src/vespa/vespalib/util/lz4compressor.cpp +++ b/vespalib/src/vespa/vespalib/util/lz4compressor.cpp @@ -13,7 +13,7 @@ namespace vespalib::compression { size_t LZ4Compressor::adjustProcessLen(uint16_t, size_t len) const { return LZ4_compressBound(len); } bool -LZ4Compressor::process(const CompressionConfig& config, const void * inputV, size_t inputLen, void * outputV, size_t & outputLenV) +LZ4Compressor::process(CompressionConfig config, const void * inputV, size_t inputLen, void * outputV, size_t & outputLenV) { const char * input(static_cast<const char *>(inputV)); char * output(static_cast<char *>(outputV)); diff --git a/vespalib/src/vespa/vespalib/util/lz4compressor.h b/vespalib/src/vespa/vespalib/util/lz4compressor.h index e723fce80cf..947888e625f 100644 --- a/vespalib/src/vespa/vespalib/util/lz4compressor.h +++ b/vespalib/src/vespa/vespalib/util/lz4compressor.h @@ -8,7 +8,7 @@ namespace vespalib::compression { class LZ4Compressor : public ICompressor { public: - bool process(const CompressionConfig& config, const void * input, size_t inputLen, void * output, size_t & outputLen) override; + bool process(CompressionConfig config, const void * input, size_t inputLen, void * output, size_t & outputLen) override; bool unprocess(const void * input, size_t inputLen, void * output, size_t & outputLen) override; size_t adjustProcessLen(uint16_t options, size_t len) const override; }; diff --git a/vespalib/src/vespa/vespalib/util/zstdcompressor.cpp b/vespalib/src/vespa/vespalib/util/zstdcompressor.cpp index 1b0562985d8..51adc68c848 100644 --- a/vespalib/src/vespa/vespalib/util/zstdcompressor.cpp +++ b/vespalib/src/vespa/vespalib/util/zstdcompressor.cpp @@ -36,7 +36,7 @@ thread_local std::unique_ptr<DecompressContext> _tlDecompressState; size_t ZStdCompressor::adjustProcessLen(uint16_t, size_t len) const { return ZSTD_compressBound(len); } bool -ZStdCompressor::process(const CompressionConfig& config, const void * inputV, size_t inputLen, void * outputV, size_t & outputLenV) +ZStdCompressor::process(CompressionConfig config, const void * inputV, size_t inputLen, void * outputV, size_t & outputLenV) { size_t maxOutputLen = ZSTD_compressBound(inputLen); if ( ! _tlCompressState) { diff --git a/vespalib/src/vespa/vespalib/util/zstdcompressor.h b/vespalib/src/vespa/vespalib/util/zstdcompressor.h index 1a141ab2b0f..483f2521475 100644 --- a/vespalib/src/vespa/vespalib/util/zstdcompressor.h +++ b/vespalib/src/vespa/vespalib/util/zstdcompressor.h @@ -8,7 +8,7 @@ namespace vespalib::compression { class ZStdCompressor : public ICompressor { public: - bool process(const CompressionConfig& config, const void * input, size_t inputLen, void * output, size_t & outputLen) override; + bool process(CompressionConfig config, const void * input, size_t inputLen, void * output, size_t & outputLen) override; bool unprocess(const void * input, size_t inputLen, void * output, size_t & outputLen) override; size_t adjustProcessLen(uint16_t options, size_t len) const override; }; |