From ae6bcc7f94c0469627f9a6c585b5c159c3edb4a9 Mon Sep 17 00:00:00 2001 From: haxiaolin Date: Wed, 14 Jun 2023 15:39:57 +0800 Subject: [PATCH] HBASE-27927 Zero length WALKey and WALEntry cells may cause replication with WAL compression stuck --- .../org/apache/hadoop/hbase/codec/BaseDecoder.java | 10 +++++++++- .../regionserver/wal/ProtobufWALTailingReader.java | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/codec/BaseDecoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/codec/BaseDecoder.java index 9a2a29356b14..93c24781abec 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/codec/BaseDecoder.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/codec/BaseDecoder.java @@ -55,7 +55,7 @@ public BaseDecoder(final InputStream in) { @Override public boolean advance() throws IOException { - int firstByte = in.read(); + int firstByte = skipZeroLength(in); if (firstByte == -1) { return false; } else { @@ -72,6 +72,14 @@ public boolean advance() throws IOException { return true; } + public static int skipZeroLength(InputStream in) throws IOException { + int firstByte; + do { + firstByte = in.read(); + } while (firstByte == 0); + return firstByte; + } + private void rethrowEofException(IOException ioEx) throws IOException { boolean isEof = false; try { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/ProtobufWALTailingReader.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/ProtobufWALTailingReader.java index 62091acdd1db..e655097e3941 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/ProtobufWALTailingReader.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/ProtobufWALTailingReader.java @@ -22,6 +22,7 @@ import java.io.InputStream; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.hbase.codec.BaseDecoder; import org.apache.hadoop.hbase.io.DelegatingInputStream; import org.apache.hadoop.hbase.io.util.StreamUtils; import org.apache.hadoop.hbase.util.Pair; @@ -79,7 +80,7 @@ private IOException unwrapIPBE(IOException e) { private ReadWALKeyResult readWALKey(long originalPosition) { int firstByte; try { - firstByte = delegatingInput.read(); + firstByte = BaseDecoder.skipZeroLength(delegatingInput); } catch (IOException e) { LOG.warn("Failed to read wal key length first byte", e); return KEY_ERROR_AND_RESET;