diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h index 8191d616e..ac0424567 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include "libsnapshot/cow_format.h" namespace android { @@ -40,8 +41,7 @@ class ICompressor { 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; + [[nodiscard]] virtual std::vector Compress(const void* data, size_t length) const = 0; private: uint32_t compression_level_; diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h index 89699dcee..651083f3e 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h @@ -122,13 +122,13 @@ class CompressWorker { CompressWorker(std::unique_ptr&& compressor); bool RunThread(); void EnqueueCompressBlocks(const void* buffer, size_t block_size, size_t num_blocks); - bool GetCompressedBuffers(std::vector>* compressed_buf); + bool GetCompressedBuffers(std::vector>* compressed_buf); void Finalize(); static uint32_t GetDefaultCompressionLevel(CowCompressionAlgorithm compression); static bool CompressBlocks(ICompressor* compressor, size_t block_size, const void* buffer, size_t num_blocks, - std::vector>* compressed_data); + std::vector>* compressed_data); private: struct CompressWork { @@ -136,7 +136,7 @@ class CompressWorker { size_t num_blocks; size_t block_size; bool compression_status = false; - std::vector> compressed_data; + std::vector> compressed_data; }; std::unique_ptr compressor_; @@ -150,7 +150,7 @@ class CompressWorker { size_t total_processed_ = 0; bool CompressBlocks(const void* buffer, size_t num_blocks, size_t block_size, - std::vector>* compressed_data); + std::vector>* compressed_data); }; // Create an ICowWriter not backed by any file. This is useful for estimating diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp index 577cdbd96..0205f5086 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -103,9 +104,9 @@ class GzCompressor final : public ICompressor { 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 { + std::vector Compress(const void* data, size_t length) const override { const auto bound = compressBound(length); - std::basic_string buffer(bound, '\0'); + std::vector buffer(bound, '\0'); uLongf dest_len = bound; auto rv = compress2(buffer.data(), &dest_len, reinterpret_cast(data), length, @@ -124,13 +125,13 @@ class Lz4Compressor final : public ICompressor { 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 { + std::vector Compress(const void* data, size_t length) const override { const auto bound = LZ4_compressBound(length); if (!bound) { LOG(ERROR) << "LZ4_compressBound returned 0"; return {}; } - std::basic_string buffer(bound, '\0'); + std::vector buffer(bound, '\0'); const auto compressed_size = LZ4_compress_default(static_cast(data), @@ -156,13 +157,13 @@ class BrotliCompressor final : public ICompressor { 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 { + std::vector Compress(const void* data, size_t length) const override { const auto bound = BrotliEncoderMaxCompressedSize(length); if (!bound) { LOG(ERROR) << "BrotliEncoderMaxCompressedSize returned 0"; return {}; } - std::basic_string buffer(bound, '\0'); + std::vector buffer(bound, '\0'); size_t encoded_size = bound; auto rv = BrotliEncoderCompress( @@ -186,8 +187,8 @@ class ZstdCompressor final : public ICompressor { ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_windowLog, log2(GetBlockSize())); }; - std::basic_string Compress(const void* data, size_t length) const override { - std::basic_string buffer(ZSTD_compressBound(length), '\0'); + std::vector Compress(const void* data, size_t length) const override { + std::vector buffer(ZSTD_compressBound(length), '\0'); const auto compressed_size = ZSTD_compress2(zstd_context_.get(), buffer.data(), buffer.size(), data, length); if (compressed_size <= 0) { @@ -209,13 +210,13 @@ class ZstdCompressor final : public ICompressor { }; bool CompressWorker::CompressBlocks(const void* buffer, size_t num_blocks, size_t block_size, - std::vector>* compressed_data) { + std::vector>* compressed_data) { return CompressBlocks(compressor_.get(), block_size, buffer, num_blocks, compressed_data); } bool CompressWorker::CompressBlocks(ICompressor* compressor, size_t block_size, const void* buffer, size_t num_blocks, - std::vector>* compressed_data) { + std::vector>* compressed_data) { const uint8_t* iter = reinterpret_cast(buffer); while (num_blocks) { auto data = compressor->Compress(iter, block_size); @@ -289,7 +290,7 @@ void CompressWorker::EnqueueCompressBlocks(const void* buffer, size_t block_size cv_.notify_all(); } -bool CompressWorker::GetCompressedBuffers(std::vector>* compressed_buf) { +bool CompressWorker::GetCompressedBuffers(std::vector>* compressed_buf) { while (true) { std::unique_lock lock(lock_); while ((total_submitted_ != total_processed_) && compressed_queue_.empty() && !stopped_) { diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp index 1d1d24c99..ce80cd705 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -429,7 +430,7 @@ TEST_P(CompressionTest, NoBatchWrites) { template class HorribleStream : public IByteStream { public: - HorribleStream(const std::basic_string& input) : input_(input) {} + HorribleStream(const std::vector& input) : input_(input) {} ssize_t Read(void* buffer, size_t length) override { if (pos_ >= input_.size()) { @@ -444,16 +445,17 @@ class HorribleStream : public IByteStream { size_t Size() const override { return input_.size(); } private: - std::basic_string input_; + std::vector input_; size_t pos_ = 0; }; TEST(HorribleStream, ReadFully) { - std::string expected = "this is some data"; + std::string expected_str = "this is some data"; + std::vector expected{expected_str.begin(), expected_str.end()}; HorribleStream stream(expected); - std::string buffer(expected.size(), '\0'); + std::vector buffer(expected.size(), '\0'); ASSERT_TRUE(stream.ReadFully(buffer.data(), buffer.size())); ASSERT_EQ(buffer, expected); } diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h index 05de2ade2..6a37aa7fd 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h @@ -81,8 +81,8 @@ class CowWriterV2 : public CowWriterBase { int num_compress_threads_ = 1; std::vector> compress_threads_; std::vector> threads_; - std::vector> compressed_buf_; - std::vector>::iterator buf_iter_; + std::vector> compressed_buf_; + std::vector>::iterator buf_iter_; std::vector> opbuffer_vec_; std::vector> databuffer_vec_; diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp index c92460a7c..22e6f2cbc 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp @@ -512,8 +512,7 @@ bool CowWriterV3::FlushCacheOps() { } bytes_written += op.data_length; } - if (!WriteOperation({cached_ops_.data(), cached_ops_.size()}, - {data_vec_.data(), data_vec_.size()})) { + if (!WriteOperation(cached_ops_, data_vec_)) { LOG(ERROR) << "Failed to flush " << cached_ops_.size() << " ops to disk"; return false; } @@ -632,7 +631,7 @@ std::vector CowWriterV3::ProcessBlocksWithThreade } // Fetch compressed buffers from the threads - std::vector> compressed_buf; + std::vector> compressed_buf; compressed_buf.clear(); for (size_t i = 0; i < num_threads; i++) { CompressWorker* worker = compress_threads_[i].get(); @@ -684,8 +683,8 @@ std::vector CowWriterV3::CompressBlocks(const siz return ProcessBlocksWithThreadedCompression(num_blocks, data, type); } -bool CowWriterV3::WriteOperation(std::basic_string_view ops, - std::basic_string_view data) { +bool CowWriterV3::WriteOperation(std::span ops, + std::span data) { const auto total_data_size = std::transform_reduce(data.begin(), data.end(), 0, std::plus{}, [](const struct iovec& a) { return a.iov_len; }); diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h index 4915e9c08..48eb67bcc 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h @@ -15,6 +15,7 @@ #pragma once #include +#include #include #include #include @@ -49,15 +50,14 @@ class CowWriterV3 : public CowWriterBase { private: struct CompressedBuffer { size_t compression_factor; - std::basic_string compressed_data; + std::vector compressed_data; }; void SetupHeaders(); bool NeedsFlush() const; bool ParseOptions(); bool OpenForWrite(); bool OpenForAppend(uint64_t label); - bool WriteOperation(std::basic_string_view op, - std::basic_string_view data); + bool WriteOperation(std::span op, std::span data); bool EmitBlocks(uint64_t new_block_start, const void* data, size_t size, uint64_t old_block, uint16_t offset, CowOperationType type); bool ConstructCowOpCompressedBuffers(uint64_t new_block_start, const void* data, @@ -111,7 +111,7 @@ class CowWriterV3 : public CowWriterBase { int num_compress_threads_ = 1; size_t batch_size_ = 1; std::vector cached_ops_; - std::vector> cached_data_; + std::vector> cached_data_; std::vector data_vec_; std::vector threads_; diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h index 43e896a9a..04b2736e9 100644 --- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h +++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h @@ -69,7 +69,7 @@ class ReadWorker : public Worker, public IBlockServer::Delegate { std::shared_ptr block_server_opener_; std::unique_ptr block_server_; - std::basic_string xor_buffer_; + std::vector xor_buffer_; std::unique_ptr aligned_buffer_; std::unique_ptr decompressed_buffer_; }; diff --git a/fs_mgr/libsnapshot/tools/cow_benchmark.cpp b/fs_mgr/libsnapshot/tools/cow_benchmark.cpp index 4d5e346c4..fb463c816 100644 --- a/fs_mgr/libsnapshot/tools/cow_benchmark.cpp +++ b/fs_mgr/libsnapshot/tools/cow_benchmark.cpp @@ -78,7 +78,7 @@ void OneShotCompressionTest() { for (size_t i = 0; i < compressors.size(); i++) { const auto start = std::chrono::steady_clock::now(); - std::basic_string compressed_data = + std::vector compressed_data = compressors[i]->Compress(buffer.data(), buffer.size()); const auto end = std::chrono::steady_clock::now(); const auto latency = @@ -141,13 +141,13 @@ void IncrementalCompressionTest() { std::vector> ratios; for (size_t i = 0; i < compressors.size(); i++) { - std::vector> compressed_data_vec; + std::vector> compressed_data_vec; int num_blocks = buffer.size() / BLOCK_SZ; const uint8_t* iter = reinterpret_cast(buffer.data()); const auto start = std::chrono::steady_clock::now(); while (num_blocks > 0) { - std::basic_string compressed_data = compressors[i]->Compress(iter, BLOCK_SZ); + std::vector compressed_data = compressors[i]->Compress(iter, BLOCK_SZ); compressed_data_vec.emplace_back(compressed_data); num_blocks--; iter += BLOCK_SZ;