Skip to content

Commit f347867

Browse files
authored
HBASE-27872 xerial's snappy-java requires GLIBC >= 2.32 (#5245)
We need to add a native library load check with a helpful error message if xerial snappy fails to initialize due to a too old glibc or similar reason, and disable the unit test if the native library fails to load. Signed-off-by: Duo Zhang <[email protected]> Signed-off-by: Viraj Jasani <[email protected]>
1 parent 6a5a710 commit f347867

File tree

4 files changed

+37
-0
lines changed

4 files changed

+37
-0
lines changed

hbase-compression/hbase-compression-snappy/src/main/java/org/apache/hadoop/hbase/io/compress/xerial/SnappyCodec.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.apache.hadoop.io.compress.Compressor;
3232
import org.apache.hadoop.io.compress.Decompressor;
3333
import org.apache.yetus.audience.InterfaceAudience;
34+
import org.slf4j.Logger;
35+
import org.slf4j.LoggerFactory;
3436
import org.xerial.snappy.Snappy;
3537

3638
/**
@@ -43,10 +45,31 @@ public class SnappyCodec implements Configurable, CompressionCodec {
4345

4446
public static final String SNAPPY_BUFFER_SIZE_KEY = "hbase.io.compress.snappy.buffersize";
4547

48+
private static final Logger LOG = LoggerFactory.getLogger(SnappyCodec.class);
4649
private Configuration conf;
4750
private int bufferSize;
51+
private static boolean loaded = false;
52+
private static Throwable loadError;
53+
54+
static {
55+
try {
56+
Snappy.getNativeLibraryVersion();
57+
loaded = true;
58+
} catch (Throwable t) {
59+
loadError = t;
60+
LOG.error("The Snappy native libraries could not be loaded", t);
61+
}
62+
}
63+
64+
/** Return true if the native shared libraries were loaded; false otherwise. */
65+
public static boolean isLoaded() {
66+
return loaded;
67+
}
4868

4969
public SnappyCodec() {
70+
if (!isLoaded()) {
71+
throw new RuntimeException("Snappy codec could not be loaded", loadError);
72+
}
5073
conf = new Configuration();
5174
bufferSize = getBufferSize(conf);
5275
}

hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestHFileCompressionSnappy.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
*/
1818
package org.apache.hadoop.hbase.io.compress.xerial;
1919

20+
import static org.junit.Assume.assumeTrue;
21+
2022
import org.apache.hadoop.conf.Configuration;
2123
import org.apache.hadoop.fs.Path;
2224
import org.apache.hadoop.hbase.HBaseClassTestRule;
@@ -41,6 +43,7 @@ public class TestHFileCompressionSnappy extends HFileTestBase {
4143

4244
@BeforeClass
4345
public static void setUpBeforeClass() throws Exception {
46+
assumeTrue(SnappyCodec.isLoaded());
4447
conf = TEST_UTIL.getConfiguration();
4548
conf.set(Compression.SNAPPY_CODEC_CLASS_KEY, SnappyCodec.class.getCanonicalName());
4649
Compression.Algorithm.SNAPPY.reload(conf);

hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestSnappyCodec.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
*/
1818
package org.apache.hadoop.hbase.io.compress.xerial;
1919

20+
import static org.junit.Assume.assumeTrue;
21+
2022
import org.apache.hadoop.hbase.HBaseClassTestRule;
2123
import org.apache.hadoop.hbase.io.compress.CompressionTestBase;
2224
import org.apache.hadoop.hbase.testclassification.SmallTests;
25+
import org.junit.BeforeClass;
2326
import org.junit.ClassRule;
2427
import org.junit.Test;
2528
import org.junit.experimental.categories.Category;
@@ -31,6 +34,11 @@ public class TestSnappyCodec extends CompressionTestBase {
3134
public static final HBaseClassTestRule CLASS_RULE =
3235
HBaseClassTestRule.forClass(TestSnappyCodec.class);
3336

37+
@BeforeClass
38+
public static void setupClass() throws Exception {
39+
assumeTrue(SnappyCodec.isLoaded());
40+
}
41+
3442
@Test
3543
public void testSnappyCodecSmall() throws Exception {
3644
codecSmallTest(new SnappyCodec());

hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestWALCompressionSnappy.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
*/
1818
package org.apache.hadoop.hbase.io.compress.xerial;
1919

20+
import static org.junit.Assume.assumeTrue;
21+
2022
import org.apache.hadoop.conf.Configuration;
2123
import org.apache.hadoop.hbase.HBaseClassTestRule;
2224
import org.apache.hadoop.hbase.HConstants;
@@ -46,6 +48,7 @@ public class TestWALCompressionSnappy extends CompressedWALTestBase {
4648

4749
@BeforeClass
4850
public static void setUpBeforeClass() throws Exception {
51+
assumeTrue(SnappyCodec.isLoaded());
4952
Configuration conf = TEST_UTIL.getConfiguration();
5053
conf.set(Compression.SNAPPY_CODEC_CLASS_KEY, SnappyCodec.class.getCanonicalName());
5154
Compression.Algorithm.SNAPPY.reload(conf);

0 commit comments

Comments
 (0)