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

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


The following commit(s) were added to refs/heads/branch-3 by this push:
     new 96e8e0d3ea3 HBASE-30368 TableSnapshotScanner fails on an already 
restored MOB table snapshot (#8628)
96e8e0d3ea3 is described below

commit 96e8e0d3ea3354ebae5650633fe42b51e4de5a94
Author: Xiao Liu <[email protected]>
AuthorDate: Wed Sep 9 10:58:41 2026 +0800

    HBASE-30368 TableSnapshotScanner fails on an already restored MOB table 
snapshot (#8628)
    
    Signed-off-by: Junegunn Choi <[email protected]>
---
 .../mapreduce/TableSnapshotInputFormatImpl.java    |  2 +-
 .../hadoop/hbase/client/TableSnapshotScanner.java  |  6 +++++
 .../hbase/client/TestTableSnapshotScanner.java     | 26 ++++++++++++++++++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git 
a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
 
b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
index e44d003cf5b..405dd4d9425 100644
--- 
a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
+++ 
b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
@@ -363,7 +363,7 @@ public class TableSnapshotInputFormatImpl {
         continue;
       }
       // The mob region is a dummy region used only to organise mob files 
under mobdir. It has no
-      // region directory under the table dir to open, and holds no rows. See 
HBASE-30365.
+      // region directory under the table dir to open. See HBASE-30365.
       if (MobUtils.isMobRegionInfo(hri)) {
         continue;
       }
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java
index 41bd0bd988b..7e17d6303fd 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.PrivateCellUtil;
 import org.apache.hadoop.hbase.client.metrics.ScanMetrics;
+import org.apache.hadoop.hbase.mob.MobUtils;
 import org.apache.hadoop.hbase.regionserver.MemStoreLAB;
 import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper;
 import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;
@@ -160,6 +161,11 @@ public class TableSnapshotScanner extends 
AbstractClientScanner {
     if (hri.isOffline() && (hri.isSplit() || hri.isSplitParent())) {
       return false;
     }
+    // The mob region is a dummy region used only to organise mob files under 
mobdir. It has no
+    // region directory under the table dir to open. See HBASE-30365 and 
HBASE-30368.
+    if (MobUtils.isMobRegionInfo(hri)) {
+      return false;
+    }
     return PrivateCellUtil.overlappingKeys(scan.getStartRow(), 
scan.getStopRow(), hri.getStartKey(),
       hri.getEndKey());
   }
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
index 4b835719ece..09663c91037 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java
@@ -49,6 +49,7 @@ import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.regionserver.StoreContext;
 import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTracker;
 import 
org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
+import org.apache.hadoop.hbase.snapshot.MobSnapshotTestingUtils;
 import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper;
 import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
@@ -370,6 +371,31 @@ public class TestTableSnapshotScanner {
     }
   }
 
+  @Test
+  public void testScannerWithRestoredMobSnapshot() throws Exception {
+    TableName tableName = TableName.valueOf(methodName);
+    String snapshotName = methodName + "Snapshot";
+    Path restoreDir = UTIL.getDataTestDirOnTestFS(snapshotName);
+    try {
+      MobSnapshotTestingUtils.createMobTable(UTIL, tableName, new byte[0][], 
1, FAMILIES);
+      try (Table table = UTIL.getConnection().getTable(tableName)) {
+        UTIL.loadTable(table, FAMILIES);
+      }
+      UTIL.getAdmin().snapshot(snapshotName, tableName);
+
+      Configuration conf = UTIL.getConfiguration();
+      RestoreSnapshotHelper.copySnapshotForScanner(conf, fs, rootDir, 
restoreDir, snapshotName);
+      try (TableSnapshotScanner scanner = new TableSnapshotScanner(conf, 
rootDir, restoreDir,
+        snapshotName, new Scan().withStartRow(Bytes.toBytes("zzzz")), true)) {
+        assertNull(scanner.next());
+      }
+    } finally {
+      fs.delete(restoreDir, true);
+      UTIL.getAdmin().deleteSnapshot(snapshotName);
+      UTIL.deleteTable(tableName);
+    }
+  }
+
   private void testScanner(HBaseTestingUtil util, String snapshotName, int 
numRegions,
     boolean shutdownCluster) throws Exception {
     TableName tableName = TableName.valueOf("testScanner");

Reply via email to