From 9f343b5871033e1be166e6ab605189c89bbcf7d5 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Thu, 2 Jun 2016 12:19:02 -0700 Subject: [PATCH] HBASE-15881 Allow BZIP2 compression. --- .../hadoop/hbase/io/compress/Compression.java | 31 +++++++++++++++++-- .../hbase/util/TestCompressionTest.java | 2 ++ 2 files changed, 31 insertions(+), 2 deletions(-) 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 c6ebff55f94..099b445a084 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 @@ -235,7 +235,34 @@ public final class Compression { throw new RuntimeException(e); } } - }; + }, + BZIP2("bzip2") { + // Use base type to avoid compile-time dependencies. + private volatile transient CompressionCodec bzipCodec; + private transient Object lock = new Object(); + + @Override + CompressionCodec getCodec(Configuration conf) { + if (bzipCodec == null) { + synchronized (lock) { + if (bzipCodec == null) { + bzipCodec = buildCodec(conf); + } + } + } + return bzipCodec; + } + + private CompressionCodec buildCodec(Configuration conf) { + try { + Class externalCodec = + getClassLoaderForCodec().loadClass("org.apache.hadoop.io.compress.BZip2Codec"); + 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 private final String compressName; @@ -431,4 +458,4 @@ public final class Compression { } } } -} \ No newline at end of file +} 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 682b0664e32..b8e79eda80a 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 @@ -74,12 +74,14 @@ public class TestCompressionTest { nativeCodecTest("LZO", "lzo2", "com.hadoop.compression.lzo.LzoCodec"); 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"); } else { // Hadoop nativelib is not available LOG.debug("Native code not loaded"); assertFalse(CompressionTest.testCompression("LZO")); assertFalse(CompressionTest.testCompression("LZ4")); assertFalse(CompressionTest.testCompression("SNAPPY")); + assertFalse(CompressionTest.testCompression("BZIP2")); } }