You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2023/05/26 00:16:57 UTC

[hbase] branch branch-2.5 updated: HBASE-27872 xerial's snappy-java requires GLIBC >= 2.32 (#5245)

This is an automated email from the ASF dual-hosted git repository.

apurtell pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2.5 by this push:
     new be0ae6282ef HBASE-27872 xerial's snappy-java requires GLIBC >= 2.32 (#5245)
be0ae6282ef is described below

commit be0ae6282ef65cf25c1c4730b0df8ee74a430c5b
Author: Andrew Purtell <ap...@apache.org>
AuthorDate: Thu May 25 17:05:57 2023 -0700

    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 <zh...@apache.org>
    Signed-off-by: Viraj Jasani <vj...@apache.org>
---
 .../hbase/io/compress/xerial/SnappyCodec.java      | 23 ++++++++++++++++++++++
 .../xerial/TestHFileCompressionSnappy.java         |  3 +++
 .../hbase/io/compress/xerial/TestSnappyCodec.java  |  8 ++++++++
 .../compress/xerial/TestWALCompressionSnappy.java  |  3 +++
 4 files changed, 37 insertions(+)

diff --git a/hbase-compression/hbase-compression-snappy/src/main/java/org/apache/hadoop/hbase/io/compress/xerial/SnappyCodec.java b/hbase-compression/hbase-compression-snappy/src/main/java/org/apache/hadoop/hbase/io/compress/xerial/SnappyCodec.java
index b6806dcbeef..917676be2fe 100644
--- a/hbase-compression/hbase-compression-snappy/src/main/java/org/apache/hadoop/hbase/io/compress/xerial/SnappyCodec.java
+++ b/hbase-compression/hbase-compression-snappy/src/main/java/org/apache/hadoop/hbase/io/compress/xerial/SnappyCodec.java
@@ -31,6 +31,8 @@ import org.apache.hadoop.io.compress.CompressionOutputStream;
 import org.apache.hadoop.io.compress.Compressor;
 import org.apache.hadoop.io.compress.Decompressor;
 import org.apache.yetus.audience.InterfaceAudience;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xerial.snappy.Snappy;
 
 /**
@@ -43,10 +45,31 @@ public class SnappyCodec implements Configurable, CompressionCodec {
 
   public static final String SNAPPY_BUFFER_SIZE_KEY = "hbase.io.compress.snappy.buffersize";
 
+  private static final Logger LOG = LoggerFactory.getLogger(SnappyCodec.class);
   private Configuration conf;
   private int bufferSize;
+  private static boolean loaded = false;
+  private static Throwable loadError;
+
+  static {
+    try {
+      Snappy.getNativeLibraryVersion();
+      loaded = true;
+    } catch (Throwable t) {
+      loadError = t;
+      LOG.error("The Snappy native libraries could not be loaded", t);
+    }
+  }
+
+  /** Return true if the native shared libraries were loaded; false otherwise. */
+  public static boolean isLoaded() {
+    return loaded;
+  }
 
   public SnappyCodec() {
+    if (!isLoaded()) {
+      throw new RuntimeException("Snappy codec could not be loaded", loadError);
+    }
     conf = new Configuration();
     bufferSize = getBufferSize(conf);
   }
diff --git a/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestHFileCompressionSnappy.java b/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestHFileCompressionSnappy.java
index 638713ed740..bbb7df87fb5 100644
--- a/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestHFileCompressionSnappy.java
+++ b/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestHFileCompressionSnappy.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.hbase.io.compress.xerial;
 
+import static org.junit.Assume.assumeTrue;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
@@ -41,6 +43,7 @@ public class TestHFileCompressionSnappy extends HFileTestBase {
 
   @BeforeClass
   public static void setUpBeforeClass() throws Exception {
+    assumeTrue(SnappyCodec.isLoaded());
     conf = TEST_UTIL.getConfiguration();
     conf.set(Compression.SNAPPY_CODEC_CLASS_KEY, SnappyCodec.class.getCanonicalName());
     Compression.Algorithm.SNAPPY.reload(conf);
diff --git a/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestSnappyCodec.java b/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestSnappyCodec.java
index 1c879db8925..db5faaf8f69 100644
--- a/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestSnappyCodec.java
+++ b/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestSnappyCodec.java
@@ -17,9 +17,12 @@
  */
 package org.apache.hadoop.hbase.io.compress.xerial;
 
+import static org.junit.Assume.assumeTrue;
+
 import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.io.compress.CompressionTestBase;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -31,6 +34,11 @@ public class TestSnappyCodec extends CompressionTestBase {
   public static final HBaseClassTestRule CLASS_RULE =
     HBaseClassTestRule.forClass(TestSnappyCodec.class);
 
+  @BeforeClass
+  public static void setupClass() throws Exception {
+    assumeTrue(SnappyCodec.isLoaded());
+  }
+
   @Test
   public void testSnappyCodecSmall() throws Exception {
     codecSmallTest(new SnappyCodec());
diff --git a/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestWALCompressionSnappy.java b/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestWALCompressionSnappy.java
index dfbb63d0f6c..7a2bbfe7b87 100644
--- a/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestWALCompressionSnappy.java
+++ b/hbase-compression/hbase-compression-snappy/src/test/java/org/apache/hadoop/hbase/io/compress/xerial/TestWALCompressionSnappy.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.hbase.io.compress.xerial;
 
+import static org.junit.Assume.assumeTrue;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
@@ -46,6 +48,7 @@ public class TestWALCompressionSnappy extends CompressedWALTestBase {
 
   @BeforeClass
   public static void setUpBeforeClass() throws Exception {
+    assumeTrue(SnappyCodec.isLoaded());
     Configuration conf = TEST_UTIL.getConfiguration();
     conf.set(Compression.SNAPPY_CODEC_CLASS_KEY, SnappyCodec.class.getCanonicalName());
     Compression.Algorithm.SNAPPY.reload(conf);