summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-01-03 10:46:23 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-01-03 10:46:23 +0000
commit6f85020f1b6896e9d79ae59f934be0dc4e7aa09a (patch)
tree7b0b1af322fc72ddceda02c508457ae97ad266de /vespalib
parent464a9a1be8f4c722ef878ccf9fec04a65735dd4f (diff)
Enable having lock free atomic<CompresssionConfig> and make its use in documentstore thread safe.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/compression/compression_test.cpp5
-rw-r--r--vespalib/src/vespa/vespalib/util/compressionconfig.h18
-rw-r--r--vespalib/src/vespa/vespalib/util/compressor.cpp15
-rw-r--r--vespalib/src/vespa/vespalib/util/compressor.h23
-rw-r--r--vespalib/src/vespa/vespalib/util/lz4compressor.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/util/lz4compressor.h2
-rw-r--r--vespalib/src/vespa/vespalib/util/zstdcompressor.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/util/zstdcompressor.h2
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;
};