Merge "Store lz4 blocks as uncompressed if compression makes data larger"

This commit is contained in:
Kelvin Zhang 2022-11-08 20:54:33 +00:00 committed by Gerrit Code Review
commit 3c163eca84
2 changed files with 19 additions and 1 deletions

View File

@ -84,7 +84,13 @@ std::basic_string<uint8_t> CowWriter::Compress(const void* data, size_t length)
<< ", compression bound: " << bound << ", ret: " << compressed_size;
return {};
}
buffer.resize(compressed_size);
// Don't run compression if the compressed output is larger
if (compressed_size >= length) {
buffer.resize(length);
memcpy(buffer.data(), data, length);
} else {
buffer.resize(compressed_size);
}
return buffer;
}
default:

View File

@ -273,6 +273,18 @@ class Lz4Decompressor final : public IDecompressor {
<< actual_buffer_size << " bytes";
return false;
}
// If input size is same as output size, then input is uncompressed.
if (stream_->Size() == output_size) {
size_t bytes_read = 0;
stream_->Read(output_buffer, output_size, &bytes_read);
if (bytes_read != output_size) {
LOG(ERROR) << "Failed to read all input at once. Expected: " << output_size
<< " actual: " << bytes_read;
return false;
}
sink_->ReturnData(output_buffer, output_size);
return true;
}
std::string input_buffer;
input_buffer.resize(stream_->Size());
size_t bytes_read = 0;