diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-01-19 18:06:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-19 18:06:57 +0100 |
commit | 6f326f6cc056dc46f5538a8a186c8420b0379edc (patch) | |
tree | 7efbbf5b4f585edca3c135be7b8b8f59fa22f1e7 /vespajlib/src/main/java/com/yahoo/compress/Compressor.java | |
parent | 4e6d9b184867553f740a65124fdb2d9c380caf22 (diff) | |
parent | ecd1ac5e05d4e7b2b059af3ca01084c3a3783148 (diff) |
Merge pull request #16102 from vespa-engine/bjorncs/zstd-java
Bjorncs/zstd java
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/compress/Compressor.java')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/compress/Compressor.java | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java index fb5da192f36..3220b81a3a9 100644 --- a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java +++ b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java @@ -18,6 +18,7 @@ import java.util.Random; */ public class Compressor { + private final ZstdCompressor zstdCompressor = new ZstdCompressor(); private final CompressionType type; private final int level; private final double compressionThresholdFactor; @@ -91,6 +92,11 @@ public class Compressor { if (compressedData.length + 8 >= dataSize * compressionThresholdFactor) return new Compression(CompressionType.INCOMPRESSIBLE, dataSize, data); return new Compression(CompressionType.LZ4, dataSize, 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); default: throw new IllegalArgumentException(requestedCompression + " is not supported"); } @@ -130,6 +136,15 @@ public class Compressor { if (expectedCompressedSize.isPresent() && compressedSize != expectedCompressedSize.get()) throw new IllegalStateException("Compressed size mismatch. Expected " + compressedSize + ". Got " + expectedCompressedSize.get()); return uncompressedLZ4Data; + case ZSTD: + int compressedLength = expectedCompressedSize.orElseThrow(() -> new IllegalArgumentException("Zstd decompressor requires input size")); + byte[] decompressedData = zstdCompressor.decompress(compressedData, compressedDataOffset, compressedLength); + expectedCompressedSize.ifPresent(expectedSize -> { + if (compressedData.length != expectedSize) { + throw new IllegalStateException("Compressed size mismatch. Expected " + expectedSize + ". Got " + decompressedData.length); + } + }); + return decompressedData; default: throw new IllegalArgumentException(compression + " is not supported"); } |