Merge "libsnapshot: replace non-character basic_string[_view]<T>" into main am: 18744c17c1
Original change: https://android-review.googlesource.com/c/platform/system/core/+/2956695 Change-Id: I2f5f9e60cc8f0421e25764d7652be05e54dc2f49 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
commit
2499c6d958
9 changed files with 38 additions and 36 deletions
|
@ -17,6 +17,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#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<uint8_t> Compress(const void* data,
|
||||
size_t length) const = 0;
|
||||
[[nodiscard]] virtual std::vector<uint8_t> Compress(const void* data, size_t length) const = 0;
|
||||
|
||||
private:
|
||||
uint32_t compression_level_;
|
||||
|
|
|
@ -122,13 +122,13 @@ class CompressWorker {
|
|||
CompressWorker(std::unique_ptr<ICompressor>&& compressor);
|
||||
bool RunThread();
|
||||
void EnqueueCompressBlocks(const void* buffer, size_t block_size, size_t num_blocks);
|
||||
bool GetCompressedBuffers(std::vector<std::basic_string<uint8_t>>* compressed_buf);
|
||||
bool GetCompressedBuffers(std::vector<std::vector<uint8_t>>* 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<std::basic_string<uint8_t>>* compressed_data);
|
||||
std::vector<std::vector<uint8_t>>* 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<std::basic_string<uint8_t>> compressed_data;
|
||||
std::vector<std::vector<uint8_t>> compressed_data;
|
||||
};
|
||||
|
||||
std::unique_ptr<ICompressor> 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<std::basic_string<uint8_t>>* compressed_data);
|
||||
std::vector<std::vector<uint8_t>>* compressed_data);
|
||||
};
|
||||
|
||||
// Create an ICowWriter not backed by any file. This is useful for estimating
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <limits>
|
||||
#include <memory>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
|
@ -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<uint8_t> Compress(const void* data, size_t length) const override {
|
||||
std::vector<uint8_t> Compress(const void* data, size_t length) const override {
|
||||
const auto bound = compressBound(length);
|
||||
std::basic_string<uint8_t> buffer(bound, '\0');
|
||||
std::vector<uint8_t> buffer(bound, '\0');
|
||||
|
||||
uLongf dest_len = bound;
|
||||
auto rv = compress2(buffer.data(), &dest_len, reinterpret_cast<const Bytef*>(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<uint8_t> Compress(const void* data, size_t length) const override {
|
||||
std::vector<uint8_t> 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<uint8_t> buffer(bound, '\0');
|
||||
std::vector<uint8_t> buffer(bound, '\0');
|
||||
|
||||
const auto compressed_size =
|
||||
LZ4_compress_default(static_cast<const char*>(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<uint8_t> Compress(const void* data, size_t length) const override {
|
||||
std::vector<uint8_t> 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<uint8_t> buffer(bound, '\0');
|
||||
std::vector<uint8_t> 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<uint8_t> Compress(const void* data, size_t length) const override {
|
||||
std::basic_string<uint8_t> buffer(ZSTD_compressBound(length), '\0');
|
||||
std::vector<uint8_t> Compress(const void* data, size_t length) const override {
|
||||
std::vector<uint8_t> 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<std::basic_string<uint8_t>>* compressed_data) {
|
||||
std::vector<std::vector<uint8_t>>* 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<std::basic_string<uint8_t>>* compressed_data) {
|
||||
std::vector<std::vector<uint8_t>>* compressed_data) {
|
||||
const uint8_t* iter = reinterpret_cast<const uint8_t*>(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<std::basic_string<uint8_t>>* compressed_buf) {
|
||||
bool CompressWorker::GetCompressedBuffers(std::vector<std::vector<uint8_t>>* compressed_buf) {
|
||||
while (true) {
|
||||
std::unique_lock<std::mutex> lock(lock_);
|
||||
while ((total_submitted_ != total_processed_) && compressed_queue_.empty() && !stopped_) {
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
|
@ -429,7 +430,7 @@ TEST_P(CompressionTest, NoBatchWrites) {
|
|||
template <typename T>
|
||||
class HorribleStream : public IByteStream {
|
||||
public:
|
||||
HorribleStream(const std::basic_string<T>& input) : input_(input) {}
|
||||
HorribleStream(const std::vector<T>& 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<T> input_;
|
||||
std::vector<T> 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<char> expected{expected_str.begin(), expected_str.end()};
|
||||
|
||||
HorribleStream<char> stream(expected);
|
||||
|
||||
std::string buffer(expected.size(), '\0');
|
||||
std::vector<char> buffer(expected.size(), '\0');
|
||||
ASSERT_TRUE(stream.ReadFully(buffer.data(), buffer.size()));
|
||||
ASSERT_EQ(buffer, expected);
|
||||
}
|
||||
|
|
|
@ -81,8 +81,8 @@ class CowWriterV2 : public CowWriterBase {
|
|||
int num_compress_threads_ = 1;
|
||||
std::vector<std::unique_ptr<CompressWorker>> compress_threads_;
|
||||
std::vector<std::future<bool>> threads_;
|
||||
std::vector<std::basic_string<uint8_t>> compressed_buf_;
|
||||
std::vector<std::basic_string<uint8_t>>::iterator buf_iter_;
|
||||
std::vector<std::vector<uint8_t>> compressed_buf_;
|
||||
std::vector<std::vector<uint8_t>>::iterator buf_iter_;
|
||||
|
||||
std::vector<std::unique_ptr<CowOperationV2>> opbuffer_vec_;
|
||||
std::vector<std::unique_ptr<uint8_t[]>> databuffer_vec_;
|
||||
|
|
|
@ -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::CompressedBuffer> CowWriterV3::ProcessBlocksWithThreade
|
|||
}
|
||||
|
||||
// Fetch compressed buffers from the threads
|
||||
std::vector<std::basic_string<uint8_t>> compressed_buf;
|
||||
std::vector<std::vector<uint8_t>> 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::CompressedBuffer> CowWriterV3::CompressBlocks(const siz
|
|||
return ProcessBlocksWithThreadedCompression(num_blocks, data, type);
|
||||
}
|
||||
|
||||
bool CowWriterV3::WriteOperation(std::basic_string_view<CowOperationV3> ops,
|
||||
std::basic_string_view<struct iovec> data) {
|
||||
bool CowWriterV3::WriteOperation(std::span<const CowOperationV3> ops,
|
||||
std::span<const struct iovec> data) {
|
||||
const auto total_data_size =
|
||||
std::transform_reduce(data.begin(), data.end(), 0, std::plus<size_t>{},
|
||||
[](const struct iovec& a) { return a.iov_len; });
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <span>
|
||||
#include <string_view>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
@ -49,15 +50,14 @@ class CowWriterV3 : public CowWriterBase {
|
|||
private:
|
||||
struct CompressedBuffer {
|
||||
size_t compression_factor;
|
||||
std::basic_string<uint8_t> compressed_data;
|
||||
std::vector<uint8_t> compressed_data;
|
||||
};
|
||||
void SetupHeaders();
|
||||
bool NeedsFlush() const;
|
||||
bool ParseOptions();
|
||||
bool OpenForWrite();
|
||||
bool OpenForAppend(uint64_t label);
|
||||
bool WriteOperation(std::basic_string_view<CowOperationV3> op,
|
||||
std::basic_string_view<struct iovec> data);
|
||||
bool WriteOperation(std::span<const CowOperationV3> op, std::span<const struct iovec> 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<CowOperationV3> cached_ops_;
|
||||
std::vector<std::basic_string<uint8_t>> cached_data_;
|
||||
std::vector<std::vector<uint8_t>> cached_data_;
|
||||
std::vector<struct iovec> data_vec_;
|
||||
|
||||
std::vector<std::thread> threads_;
|
||||
|
|
|
@ -69,7 +69,7 @@ class ReadWorker : public Worker, public IBlockServer::Delegate {
|
|||
std::shared_ptr<IBlockServerOpener> block_server_opener_;
|
||||
std::unique_ptr<IBlockServer> block_server_;
|
||||
|
||||
std::basic_string<uint8_t> xor_buffer_;
|
||||
std::vector<uint8_t> xor_buffer_;
|
||||
std::unique_ptr<void, decltype(&::free)> aligned_buffer_;
|
||||
std::unique_ptr<uint8_t[]> decompressed_buffer_;
|
||||
};
|
||||
|
|
|
@ -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<uint8_t> compressed_data =
|
||||
std::vector<uint8_t> 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<std::pair<double, std::string>> ratios;
|
||||
|
||||
for (size_t i = 0; i < compressors.size(); i++) {
|
||||
std::vector<std::basic_string<uint8_t>> compressed_data_vec;
|
||||
std::vector<std::vector<uint8_t>> compressed_data_vec;
|
||||
int num_blocks = buffer.size() / BLOCK_SZ;
|
||||
const uint8_t* iter = reinterpret_cast<const uint8_t*>(buffer.data());
|
||||
|
||||
const auto start = std::chrono::steady_clock::now();
|
||||
while (num_blocks > 0) {
|
||||
std::basic_string<uint8_t> compressed_data = compressors[i]->Compress(iter, BLOCK_SZ);
|
||||
std::vector<uint8_t> compressed_data = compressors[i]->Compress(iter, BLOCK_SZ);
|
||||
compressed_data_vec.emplace_back(compressed_data);
|
||||
num_blocks--;
|
||||
iter += BLOCK_SZ;
|
||||
|
|
Loading…
Reference in a new issue