From 3bfb86f5418dff5e037cdc374eaa322851131f33 Mon Sep 17 00:00:00 2001 From: "Raphael S. Carvalho" Date: Mon, 15 Jun 2015 10:19:21 -0300 Subject: [PATCH] sstables: add compress_max_size to compression used to return maximum size which compressor may output. Signed-off-by: Raphael S. Carvalho Reviewed-by: Nadav Har'El --- sstables/compress.cc | 17 +++++++++++++++++ sstables/compress.hh | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/sstables/compress.cc b/sstables/compress.cc index 9df3d077c0..8fbcb2ee9a 100644 --- a/sstables/compress.cc +++ b/sstables/compress.cc @@ -36,12 +36,15 @@ void compression::update(uint64_t compressed_file_length) { void compression::set_compressor(compressor c) { if (c == compressor::lz4) { _compress = compress_lz4; + _compress_max_size = compress_max_size_lz4; name.value = "LZ4Compressor"; } else if (c == compressor::snappy) { _compress = compress_snappy; + _compress_max_size = compress_max_size_snappy; name.value = "SnappyCompressor"; } else if (c == compressor::deflate) { _compress = compress_deflate; + _compress_max_size = compress_max_size_deflate; name.value = "DeflateCompressor"; } else { throw std::runtime_error("unsupported compressor type"); @@ -152,6 +155,20 @@ size_t compress_snappy(const char* input, size_t input_len, fail(unimplemented::cause::COMPRESSION); } +size_t compress_max_size_lz4(size_t input_len) { + return LZ4_COMPRESSBOUND(input_len) + 4; +} + +size_t compress_max_size_deflate(size_t input_len) { + // FIXME: implement. + fail(unimplemented::cause::COMPRESSION); +} + +size_t compress_max_size_snappy(size_t input_len) { + // FIXME: implement. + fail(unimplemented::cause::COMPRESSION); +} + class compressed_file_data_source_impl : public data_source_impl { lw_shared_ptr _file; sstables::compression* _compression_metadata; diff --git a/sstables/compress.hh b/sstables/compress.hh index bc7598ed7e..bcdfed9ccc 100644 --- a/sstables/compress.hh +++ b/sstables/compress.hh @@ -59,6 +59,12 @@ compress_func compress_lz4; compress_func compress_snappy; compress_func compress_deflate; +typedef size_t compress_max_size_func(size_t input_len); + +compress_max_size_func compress_max_size_lz4; +compress_max_size_func compress_max_size_snappy; +compress_max_size_func compress_max_size_deflate; + inline uint32_t init_checksum_adler32() { return adler32(0, Z_NULL, 0); } @@ -95,6 +101,8 @@ private: // Variables determined from the above deserialized values, held for convenience: uncompress_func *_uncompress = nullptr; compress_func *_compress = nullptr; + // Return maximum length of data that compressor may output. + compress_max_size_func *_compress_max_size = nullptr; // Variables *not* found in the "Compression Info" file (added by update()): uint64_t _compressed_file_length; public: @@ -140,7 +148,9 @@ public: } return _compress(input, input_len, output, output_len); } - + size_t compress_max_size(size_t input_len) const { + return _compress_max_size(input_len); + } friend class sstable; };