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 81a3bb4..ad5493a 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 @@ -27,6 +27,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.ServerName; +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.procedure.Procedure; @@ -98,7 +99,8 @@ public class EnabledTableSnapshotHandler extends TakeSnapshotHandler { // Take the offline regions as disabled for (Pair region : regions) { HRegionInfo 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 b0f07bb..f81cea9 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 @@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.CategoryBasedTimeout; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.TableName; @@ -59,18 +60,18 @@ public class TestRestoreSnapshotFromClient { .withLookingForStuckThread(true) .build(); - private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); + protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); - private final byte[] FAMILY = Bytes.toBytes("cf"); + protected final byte[] FAMILY = Bytes.toBytes("cf"); - private byte[] emptySnapshot; - private byte[] snapshotName0; - private byte[] snapshotName1; - private byte[] snapshotName2; - private int snapshot0Rows; - private int snapshot1Rows; - private TableName tableName; - private Admin admin; + protected byte[] emptySnapshot; + protected byte[] snapshotName0; + protected byte[] snapshotName1; + protected byte[] snapshotName2; + protected int snapshot0Rows; + protected int snapshot1Rows; + protected TableName tableName; + protected Admin admin; @BeforeClass public static void setUpBeforeClass() throws Exception { @@ -299,4 +300,9 @@ public class TestRestoreSnapshotFromClient { } return families; } + + protected void splitRegion(final HRegionInfo regionInfo) throws IOException { + byte[][] splitPoints = Bytes.split(regionInfo.getStartKey(), regionInfo.getEndKey(), 1); + admin.split(regionInfo.getTable(), splitPoints[1]); + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClientWithRegionReplicas.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClientWithRegionReplicas.java index 27ff447..df07a55 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClientWithRegionReplicas.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClientWithRegionReplicas.java @@ -17,7 +17,14 @@ */ package org.apache.hadoop.hbase.client; +import java.io.IOException; +import java.util.List; + +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils; import org.apache.hadoop.hbase.testclassification.LargeTests; +import org.junit.Test; import org.junit.experimental.categories.Category; @Category(LargeTests.class) @@ -27,4 +34,23 @@ public class TestRestoreSnapshotFromClientWithRegionReplicas extends protected int getNumReplicas() { return 3; } + + @Test + public void testOnlineSnapshotAfterSplittingRegions() throws IOException, InterruptedException { + List regionInfos = admin.getTableRegions(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("testOnlineSnapshotAfterSplittingRegions-" + + System.currentTimeMillis()); + admin.cloneSnapshot(snapshotName1, clonedTableName); + + SnapshotTestingUtils.verifyRowCount(TEST_UTIL, clonedTableName, snapshot1Rows); + } }