Repository: hbase
Updated Branches:
  refs/heads/master 3bb8daa60 -> 11e3a8387


HBASE-19934 HBaseSnapshotException when read replicas is enabled and online 
snapshot is taken after region splitting (Toshihiro Suzuki)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/11e3a838
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/11e3a838
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/11e3a838

Branch: refs/heads/master
Commit: 11e3a8387006a5dd348fa91a336bce8d25455f4d
Parents: 3bb8daa
Author: tedyu <yuzhih...@gmail.com>
Authored: Mon Feb 5 21:03:56 2018 -0800
Committer: tedyu <yuzhih...@gmail.com>
Committed: Mon Feb 5 21:03:56 2018 -0800

----------------------------------------------------------------------
 .../snapshot/EnabledTableSnapshotHandler.java   |  4 +++-
 .../client/TestRestoreSnapshotFromClient.java   | 20 ++++++++++------
 ...oreSnapshotFromClientWithRegionReplicas.java | 25 ++++++++++++++++++++
 3 files changed, 41 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/11e3a838/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java
----------------------------------------------------------------------
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<RegionInfo, ServerName> 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);
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/11e3a838/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.java
----------------------------------------------------------------------
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..2556bec 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
@@ -24,6 +24,7 @@ import static org.junit.Assert.fail;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
@@ -67,13 +68,13 @@ public class TestRestoreSnapshotFromClient {
   protected final byte[] TEST_FAMILY2 = Bytes.toBytes("cf2");
 
   protected TableName tableName;
-  private byte[] emptySnapshot;
-  private byte[] snapshotName0;
-  private byte[] snapshotName1;
-  private byte[] snapshotName2;
-  private int snapshot0Rows;
-  private int snapshot1Rows;
-  private Admin admin;
+  protected byte[] emptySnapshot;
+  protected byte[] snapshotName0;
+  protected byte[] snapshotName1;
+  protected byte[] snapshotName2;
+  protected int snapshot0Rows;
+  protected int snapshot1Rows;
+  protected Admin admin;
 
   @Rule
   public TestName name = new TestName();
@@ -321,4 +322,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]);
+  }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/11e3a838/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClientWithRegionReplicas.java
----------------------------------------------------------------------
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 7f5dfa2..d301098 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,12 +17,18 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import java.io.IOException;
+import java.util.List;
+
 import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.junit.ClassRule;
+import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+
 @Category({LargeTests.class, ClientTests.class})
 public class TestRestoreSnapshotFromClientWithRegionReplicas extends
     TestRestoreSnapshotFromClient {
@@ -35,4 +41,23 @@ public class TestRestoreSnapshotFromClientWithRegionReplicas 
extends
   protected int getNumReplicas() {
     return 3;
   }
+
+  @Test
+  public void testOnlineSnapshotAfterSplittingRegions() throws IOException, 
InterruptedException {
+    List<RegionInfo> 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);
+  }
 }

Reply via email to