You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2018/04/09 14:48:39 UTC
hbase git commit: HBASE-19343 Restore snapshot makes split parent
region online
Repository: hbase
Updated Branches:
refs/heads/branch-1 e84f5dff7 -> eacbe002e
HBASE-19343 Restore snapshot makes split parent region online
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/eacbe002
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/eacbe002
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/eacbe002
Branch: refs/heads/branch-1
Commit: eacbe002e51ed9ebac53313a9bdb9392a5b7c4fd
Parents: e84f5df
Author: Pankaj Kumar <pa...@huawei.com>
Authored: Mon Apr 9 07:48:34 2018 -0700
Committer: tedyu <yu...@gmail.com>
Committed: Mon Apr 9 07:48:34 2018 -0700
----------------------------------------------------------------------
.../hbase/snapshot/RestoreSnapshotHelper.java | 4 +-
.../client/TestRestoreSnapshotFromClient.java | 68 +++++++++++++++++++-
2 files changed, 69 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/eacbe002/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
index fb535de..4ff8985 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
@@ -203,7 +203,9 @@ public class RestoreSnapshotHelper {
if (regionNames.contains(regionName)) {
LOG.info("region to restore: " + regionName);
regionNames.remove(regionName);
- metaChanges.addRegionToRestore(regionInfo);
+ // Add the regionInfo from snapshot manifest, so that will not miss parent region details
+ metaChanges.addRegionToRestore(
+ HRegionInfo.convert(regionManifests.get(regionName).getRegionInfo()));
} else {
LOG.info("region to remove: " + regionName);
metaChanges.addRegionToRemove(regionInfo);
http://git-wip-us.apache.org/repos/asf/hbase/blob/eacbe002/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 6f56609..d5ef6e2 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
@@ -35,6 +35,7 @@ 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.MetaTableAccessor;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
@@ -43,10 +44,14 @@ import org.apache.hadoop.hbase.regionserver.ScanType;
import org.apache.hadoop.hbase.regionserver.Store;
import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.Waiter;
+import org.apache.hadoop.hbase.master.AssignmentManager;
import org.apache.hadoop.hbase.master.MasterFileSystem;
+import org.apache.hadoop.hbase.master.RegionState;
import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException;
import org.apache.hadoop.hbase.snapshot.CorruptedSnapshotException;
+import org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException;
import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.FSUtils;
@@ -90,8 +95,9 @@ public class TestRestoreSnapshotFromClient {
TEST_UTIL.getConfiguration().setInt("hbase.regionserver.msginterval", 100);
TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 250);
TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 6);
- TEST_UTIL.getConfiguration().setBoolean(
- "hbase.master.enabletable.roundrobin", true);
+ TEST_UTIL.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", true);
+ // Setting bigger value to avoid catalog janitor execution (parent region cleanup)
+ TEST_UTIL.getConfiguration().setLong("hbase.catalogjanitor.interval", 1800000);
TEST_UTIL.startMiniCluster(3);
}
@@ -182,6 +188,64 @@ public class TestRestoreSnapshotFromClient {
SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());
}
+ @Test(timeout = 300000)
+ public void testRestoreSnapshotAfterSplit() throws Exception {
+ Admin admin = null;
+ try {
+ admin = TEST_UTIL.getHBaseAdmin();
+ final int regionReplication = admin.getTableDescriptor(tableName).getRegionReplication();
+ // Region count before split
+ final int primaryRegionCountBeforeSplit = MetaTableAccessor
+ .getTableRegions(TEST_UTIL.getZooKeeperWatcher(), TEST_UTIL.getConnection(), tableName)
+ .size() / regionReplication;
+
+ admin.split(tableName, "m".getBytes());
+ final AssignmentManager am = TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager();
+ // Wait for replica region to become online
+ TEST_UTIL.waitFor(60000, 500, new Waiter.Predicate<IOException>() {
+ @Override
+ public boolean evaluate() throws IOException {
+ return am.getRegionStates().getRegionByStateOfTable(tableName).get(RegionState.State.OPEN)
+ .size() == ((primaryRegionCountBeforeSplit + 1) * regionReplication);
+ }
+ });
+
+ int regionCountAfterSplit = MetaTableAccessor
+ .getTableRegions(TEST_UTIL.getZooKeeperWatcher(), TEST_UTIL.getConnection(), tableName)
+ .size() / regionReplication;
+ // regionCountAfterSplit will contain parent region, so primaryregionCountBeforeSplit + 2
+ assertEquals(primaryRegionCountBeforeSplit + 2, regionCountAfterSplit);
+
+ String snapshotName = "testRestoreSnapshotAfterSplit-snap";
+ // Create snapshot after table split
+ admin.snapshot(snapshotName, tableName);
+ assertEquals(1,
+ admin.listTableSnapshots("testtb-.*", "testRestoreSnapshotAfterSplit-snap*").size());
+ // Restore snapshot
+ admin.disableTable(tableName);
+ admin.restoreSnapshot(snapshotName);
+
+ int regionCountAfterRestoreSnapshot = MetaTableAccessor
+ .getTableRegions(TEST_UTIL.getZooKeeperWatcher(), TEST_UTIL.getConnection(), tableName)
+ .size();
+ assertEquals(primaryRegionCountBeforeSplit + 2, regionCountAfterRestoreSnapshot);
+
+ // Enable the table
+ admin.enableTable(tableName);
+ assertEquals((primaryRegionCountBeforeSplit + 1) * regionReplication,
+ am.getRegionStates().getRegionByStateOfTable(tableName).get(RegionState.State.OPEN).size());
+
+ } finally {
+ if (admin != null) {
+ try {
+ admin.deleteTableSnapshots("testtb-.*", "testRestoreSnapshotAfterSplit-snap*");
+ } catch (SnapshotDoesNotExistException ignore) {
+ }
+ admin.close();
+ }
+ }
+ }
+
protected int getNumReplicas() {
return 1;
}