diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/compress/Compression.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/compress/Compression.java index 099b445a084..9697da334a4 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/compress/Compression.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/compress/Compression.java @@ -262,6 +262,33 @@ public final class Compression { throw new RuntimeException(e); } } + }, + ZSTD("zstd") { + // Use base type to avoid compile-time dependencies. + private volatile transient CompressionCodec zStandardCodec; + private transient Object lock = new Object(); + + @Override + CompressionCodec getCodec(Configuration conf) { + if (zStandardCodec == null) { + synchronized (lock) { + if (zStandardCodec == null) { + zStandardCodec = buildCodec(conf); + } + } + } + return zStandardCodec; + } + + private CompressionCodec buildCodec(Configuration conf) { + try { + Class externalCodec = + getClassLoaderForCodec().loadClass("org.apache.hadoop.io.compress.ZStandardCodec"); + return (CompressionCodec) ReflectionUtils.newInstance(externalCodec, conf); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } }; private final transient Configuration conf; // FindBugs: SE_BAD_FIELD so just made it transient diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCompressionTest.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCompressionTest.java index b8e79eda80a..40a6f3fb69d 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCompressionTest.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCompressionTest.java @@ -75,6 +75,7 @@ public class TestCompressionTest { nativeCodecTest("LZ4", null, "org.apache.hadoop.io.compress.Lz4Codec"); nativeCodecTest("SNAPPY", "snappy", "org.apache.hadoop.io.compress.SnappyCodec"); nativeCodecTest("BZIP2", "bzip2", "org.apache.hadoop.io.compress.BZip2Codec"); + nativeCodecTest("ZSTD", "zstd", "org.apache.hadoop.io.compress.ZStandardCodec"); } else { // Hadoop nativelib is not available LOG.debug("Native code not loaded"); @@ -82,6 +83,7 @@ public class TestCompressionTest { assertFalse(CompressionTest.testCompression("LZ4")); assertFalse(CompressionTest.testCompression("SNAPPY")); assertFalse(CompressionTest.testCompression("BZIP2")); + assertFalse(CompressionTest.testCompression("ZSTD")); } }