diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java index 6cf1200..0872443 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.client.RegionReplicaUtil; import org.apache.hadoop.hbase.errorhandling.ForeignException; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.mob.MobUtils; @@ -98,7 +99,8 @@ public class EnabledTableSnapshotHandler extends TakeSnapshotHandler { // Take the offline regions as disabled for (Pair region : regions) { RegionInfo regionInfo = region.getFirst(); - if (regionInfo.isOffline() && (regionInfo.isSplit() || regionInfo.isSplitParent())) { + if (regionInfo.isOffline() && (regionInfo.isSplit() || regionInfo.isSplitParent()) && + RegionReplicaUtil.isDefaultReplica(regionInfo)) { LOG.info("Take disabled snapshot of offline region=" + regionInfo); snapshotDisabledRegion(regionInfo); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.java index 3eb304d..4b300b3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.java @@ -23,7 +23,9 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.util.HashSet; +import java.util.List; import java.util.Set; + import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseClassTestRule; @@ -294,6 +296,29 @@ public class TestRestoreSnapshotFromClient { } } + @Test + public void testOnlineSnapshotAfterSplittingRegions() throws IOException, InterruptedException { + try (Table table = TEST_UTIL.getConnection().getTable(tableName)) { + snapshot1Rows = countRows(table); + } + + List regionInfos = admin.getRegions(tableName); + RegionReplicaUtil.removeNonDefaultRegions(regionInfos); + + // Split a region + splitRegion(regionInfos.get(0)); + + // Take a online snapshot + admin.snapshot(snapshotName1, tableName); + + // Clone the snapshot to another table + TableName clonedTableName = TableName.valueOf(name.getMethodName() + "-" + + System.currentTimeMillis()); + admin.cloneSnapshot(snapshotName1, clonedTableName); + + verifyRowCount(TEST_UTIL, clonedTableName, snapshot1Rows); + } + // ========================================================================== // Helpers // ========================================================================== @@ -321,4 +346,9 @@ public class TestRestoreSnapshotFromClient { protected int countRows(final Table table, final byte[]... families) throws IOException { return TEST_UTIL.countRows(table, families); } + + protected void splitRegion(final RegionInfo regionInfo) throws IOException { + byte[][] splitPoints = Bytes.split(regionInfo.getStartKey(), regionInfo.getEndKey(), 1); + admin.split(regionInfo.getTable(), splitPoints[1]); + } }