From ab322ddbd0a7dce7c274d9ce5616ed0f007194f1 Mon Sep 17 00:00:00 2001 From: Tomas Baltrunas Date: Fri, 1 Aug 2025 20:42:04 +0100 Subject: [PATCH 1/2] HBASE-29501 IOException in SerialReplicationChecker.canPush causes entries to be pushed out of order --- .../regionserver/SerialReplicationSourceWALReader.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java index 41d95df28219..112fab134732 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java @@ -96,6 +96,11 @@ protected void readWALEntries(WALEntryStream entryStream, WALEntryBatch batch) break; } sleepMultiplier = sleep(sleepMultiplier); + // Always make sure to break after handling the exception. + // Otherwise we will drop down below into logic to push the entry, + // but since we don't know if the entry can be pushed we may push + // the entry out of order, breaking serial replication guarantees. + break; } // arrive here means we can push the entry, record the last sequence id batch.setLastSeqId(Bytes.toString(entry.getKey().getEncodedRegionName()), From e81eeac708579837c8600e62d3e35c1865fac93c Mon Sep 17 00:00:00 2001 From: Tomas Baltrunas Date: Wed, 27 Aug 2025 15:20:42 +0100 Subject: [PATCH 2/2] Change break to continue --- .../regionserver/SerialReplicationSourceWALReader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java index 112fab134732..2c9e4d37bb0b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/SerialReplicationSourceWALReader.java @@ -96,11 +96,11 @@ protected void readWALEntries(WALEntryStream entryStream, WALEntryBatch batch) break; } sleepMultiplier = sleep(sleepMultiplier); - // Always make sure to break after handling the exception. + // Always make sure to continue/break from the loop after handling the exception. // Otherwise we will drop down below into logic to push the entry, // but since we don't know if the entry can be pushed we may push // the entry out of order, breaking serial replication guarantees. - break; + continue; } // arrive here means we can push the entry, record the last sequence id batch.setLastSeqId(Bytes.toString(entry.getKey().getEncodedRegionName()),