summaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main/java/com/yahoo/compress/Compressor.java
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-01-19 18:06:57 +0100
committerGitHub <noreply@github.com>2021-01-19 18:06:57 +0100
commit6f326f6cc056dc46f5538a8a186c8420b0379edc (patch)
tree7efbbf5b4f585edca3c135be7b8b8f59fa22f1e7 /vespajlib/src/main/java/com/yahoo/compress/Compressor.java
parent4e6d9b184867553f740a65124fdb2d9c380caf22 (diff)
parentecd1ac5e05d4e7b2b059af3ca01084c3a3783148 (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.java15
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");
}