From b309292859edc1ec9b4df298e6e236067b2b6ed8 Mon Sep 17 00:00:00 2001 From: Daniel Zheng Date: Tue, 12 Sep 2023 13:34:07 -0700 Subject: [PATCH] Adding block sz to compressors Adding block sz to compressor classes to prepare for variable block size compression Test: m libsnapshot Change-Id: I84db20c80c0f95188f79ccc73b5c30678bd75e78 --- .../include/libsnapshot/cow_compress.h | 12 ++--- .../libsnapshot_cow/cow_compress.cpp | 45 +++++++++++-------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h index cf6561559..fd12b84fe 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h @@ -24,24 +24,26 @@ namespace snapshot { class ICompressor { public: - explicit ICompressor(uint32_t compression_level) : compression_level_(compression_level) {} + explicit ICompressor(uint32_t compression_level, uint32_t block_size) + : compression_level_(compression_level), block_size_(block_size) {} virtual ~ICompressor() {} // Factory methods for compression methods. - static std::unique_ptr Gz(uint32_t compression_level); - static std::unique_ptr Brotli(uint32_t compression_level); - static std::unique_ptr Lz4(uint32_t compression_level); + static std::unique_ptr Gz(uint32_t compression_level, const int32_t BLOCK_SZ); + static std::unique_ptr Brotli(uint32_t compression_level, const int32_t BLOCK_SZ); + static std::unique_ptr Lz4(uint32_t compression_level, const int32_t BLOCK_SZ); static std::unique_ptr Zstd(uint32_t compression_level, const int32_t BLOCK_SZ); static std::unique_ptr Create(CowCompression compression, const int32_t BLOCK_SZ); uint32_t GetCompressionLevel() const { return compression_level_; } - + uint32_t GetBlockSize() const { return block_size_; } [[nodiscard]] virtual std::basic_string Compress(const void* data, size_t length) const = 0; private: uint32_t compression_level_; + uint32_t block_size_; }; } // namespace snapshot } // namespace android \ No newline at end of file diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp index 71ac59f20..abc7d336f 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp @@ -56,16 +56,16 @@ std::optional CompressionAlgorithmFromString(std::strin } std::unique_ptr ICompressor::Create(CowCompression compression, - const int32_t BLOCK_SZ) { + const int32_t block_size) { switch (compression.algorithm) { case kCowCompressLz4: - return ICompressor::Lz4(compression.compression_level); + return ICompressor::Lz4(compression.compression_level, block_size); case kCowCompressBrotli: - return ICompressor::Brotli(compression.compression_level); + return ICompressor::Brotli(compression.compression_level, block_size); case kCowCompressGz: - return ICompressor::Gz(compression.compression_level); + return ICompressor::Gz(compression.compression_level, block_size); case kCowCompressZstd: - return ICompressor::Zstd(compression.compression_level, BLOCK_SZ); + return ICompressor::Zstd(compression.compression_level, block_size); case kCowCompressNone: return nullptr; } @@ -100,7 +100,8 @@ uint32_t CompressWorker::GetDefaultCompressionLevel(CowCompressionAlgorithm comp class GzCompressor final : public ICompressor { public: - GzCompressor(uint32_t compression_level) : ICompressor(compression_level){}; + GzCompressor(uint32_t compression_level, const uint32_t block_size) + : ICompressor(compression_level, block_size){}; std::basic_string Compress(const void* data, size_t length) const override { const auto bound = compressBound(length); @@ -120,7 +121,8 @@ class GzCompressor final : public ICompressor { class Lz4Compressor final : public ICompressor { public: - Lz4Compressor(uint32_t compression_level) : ICompressor(compression_level){}; + Lz4Compressor(uint32_t compression_level, const uint32_t block_size) + : ICompressor(compression_level, block_size){}; std::basic_string Compress(const void* data, size_t length) const override { const auto bound = LZ4_compressBound(length); @@ -151,7 +153,8 @@ class Lz4Compressor final : public ICompressor { class BrotliCompressor final : public ICompressor { public: - BrotliCompressor(uint32_t compression_level) : ICompressor(compression_level){}; + BrotliCompressor(uint32_t compression_level, const uint32_t block_size) + : ICompressor(compression_level, block_size){}; std::basic_string Compress(const void* data, size_t length) const override { const auto bound = BrotliEncoderMaxCompressedSize(length); @@ -176,10 +179,11 @@ class BrotliCompressor final : public ICompressor { class ZstdCompressor final : public ICompressor { public: - ZstdCompressor(uint32_t compression_level, const uint32_t MAX_BLOCK_SIZE) - : ICompressor(compression_level), zstd_context_(ZSTD_createCCtx(), ZSTD_freeCCtx) { + ZstdCompressor(uint32_t compression_level, const uint32_t block_size) + : ICompressor(compression_level, block_size), + zstd_context_(ZSTD_createCCtx(), ZSTD_freeCCtx) { ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_compressionLevel, compression_level); - ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_windowLog, log2(MAX_BLOCK_SIZE)); + ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_windowLog, log2(GetBlockSize())); }; std::basic_string Compress(const void* data, size_t length) const override { @@ -313,20 +317,23 @@ bool CompressWorker::GetCompressedBuffers(std::vector return true; } -std::unique_ptr ICompressor::Brotli(uint32_t compression_level) { - return std::make_unique(compression_level); +std::unique_ptr ICompressor::Brotli(uint32_t compression_level, + const int32_t block_size) { + return std::make_unique(compression_level, block_size); } -std::unique_ptr ICompressor::Gz(uint32_t compression_level) { - return std::make_unique(compression_level); +std::unique_ptr ICompressor::Gz(uint32_t compression_level, const int32_t block_size) { + return std::make_unique(compression_level, block_size); } -std::unique_ptr ICompressor::Lz4(uint32_t compression_level) { - return std::make_unique(compression_level); +std::unique_ptr ICompressor::Lz4(uint32_t compression_level, + const int32_t block_size) { + return std::make_unique(compression_level, block_size); } -std::unique_ptr ICompressor::Zstd(uint32_t compression_level, const int32_t BLOCK_SZ) { - return std::make_unique(compression_level, BLOCK_SZ); +std::unique_ptr ICompressor::Zstd(uint32_t compression_level, + const int32_t block_size) { + return std::make_unique(compression_level, block_size); } void CompressWorker::Finalize() {