diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-08-30 12:11:35 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-08-30 12:11:35 +0200 |
commit | 37eaa36494321b3d3c1427fabf34ebe020f4b9ac (patch) | |
tree | 6868462525801a65eab185fa1577d891772e8546 /vespajlib/src/main/java/com/yahoo/compress | |
parent | 11e7a365a7f6e63b109f24f3f81ff4aaee9bad72 (diff) |
lz4 compress blobs.
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/compress')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/compress/Compressor.java | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java index ad51ac1ca38..98228292cc7 100644 --- a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java +++ b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java @@ -82,22 +82,25 @@ public class Compressor { * @throws IllegalArgumentException if the compression type is not supported */ public Compression compress(CompressionType requestedCompression, byte[] data, Optional<Integer> uncompressedSize) { + return compress(requestedCompression, data, 0, uncompressedSize.orElse(data.length)); + } + public Compression compress(CompressionType requestedCompression, byte[] data, int offset, int len) { switch (requestedCompression) { case NONE: - data = uncompressedSize.isPresent() ? Arrays.copyOf(data, uncompressedSize.get()) : data; + if ((offset != 0) || (len != data.length)) { + data = Arrays.copyOfRange(data, offset, offset + len); + } return new Compression(CompressionType.NONE, data.length, data); case LZ4: - int dataSize = uncompressedSize.isPresent() ? uncompressedSize.get() : data.length; - if (dataSize < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, dataSize, data); - byte[] compressedData = getCompressor().compress(data, 0, dataSize); - if (compressedData.length + 8 >= dataSize * compressionThresholdFactor) - return new Compression(CompressionType.INCOMPRESSIBLE, dataSize, data); - return new Compression(CompressionType.LZ4, dataSize, compressedData); + if (len < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, len, data); + byte[] compressedData = getCompressor().compress(data, offset, len); + if (compressedData.length + 8 >= len * compressionThresholdFactor) + return new Compression(CompressionType.INCOMPRESSIBLE, len, data); + return new Compression(CompressionType.LZ4, len, compressedData); case ZSTD: - int dataLength = uncompressedSize.orElse(data.length); - if (dataLength < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, dataLength, data); - byte[] compressed = zstdCompressor.compress(data, 0, dataLength); - return new Compression(CompressionType.ZSTD, dataLength, compressed); + if (len < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, len, data); + byte[] compressed = zstdCompressor.compress(data, offset, len); + return new Compression(CompressionType.ZSTD, len, compressed); default: throw new IllegalArgumentException(requestedCompression + " is not supported"); } |