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/18 03:30:05 UTC
hbase git commit: HBASE-19850 The number of Offline Regions is wrong
after restoring a snapshot
Repository: hbase
Updated Branches:
refs/heads/branch-1 ce4c24339 -> 03eb3d24b
HBASE-19850 The number of Offline Regions is wrong after restoring a snapshot
Signed-off-by: tedyu <yu...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/03eb3d24
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/03eb3d24
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/03eb3d24
Branch: refs/heads/branch-1
Commit: 03eb3d24b6ff9903b328ae8d461de254ee2516b4
Parents: ce4c243
Author: Toshihiro Suzuki <br...@gmail.com>
Authored: Wed Jan 24 03:34:45 2018 +0900
Committer: tedyu <yu...@gmail.com>
Committed: Tue Apr 17 20:29:50 2018 -0700
----------------------------------------------------------------------
.../master/snapshot/RestoreSnapshotHandler.java | 35 +++++++++++++++++++-
.../client/TestRestoreSnapshotFromClient.java | 27 +++++++++++++--
2 files changed, 58 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/03eb3d24/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java
index f9aea13..5f4357f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java
@@ -34,6 +34,7 @@ import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.MetaTableAccessor;
import org.apache.hadoop.hbase.client.Connection;
+import org.apache.hadoop.hbase.client.RegionReplicaUtil;
import org.apache.hadoop.hbase.errorhandling.ForeignException;
import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;
import org.apache.hadoop.hbase.executor.EventType;
@@ -154,6 +155,9 @@ public class RestoreSnapshotHandler extends TableEventHandler implements Snapsho
if (metaChanges.hasRegionsToRemove()) hrisToRemove.addAll(metaChanges.getRegionsToRemove());
MetaTableAccessor.deleteRegions(conn, hrisToRemove);
+ // We also need to remove the current set of regions from in memory states
+ deleteRegionsFromInMemoryStates(hrisToRemove, hTableDescriptor.getRegionReplication());
+
// 4.2 Add the new set of regions to META
//
// At this point the old regions are no longer present in META.
@@ -175,7 +179,6 @@ public class RestoreSnapshotHandler extends TableEventHandler implements Snapsho
RestoreSnapshotHelper.restoreSnapshotACL(snapshot, tableName, server.getConfiguration());
}
-
// At this point the restore is complete. Next step is enabling the table.
LOG.info("Restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot) +
" on table=" + tableName + " completed!");
@@ -205,6 +208,36 @@ public class RestoreSnapshotHandler extends TableEventHandler implements Snapsho
}
}
+ /**
+ * Delete regions from in-memory states
+ * @param regionInfos regions to delete
+ * @param regionReplication the number of region replications
+ */
+ private void deleteRegionsFromInMemoryStates(List<HRegionInfo> regionInfos,
+ int regionReplication) {
+ // Delete the regions from AssignmentManager
+ for (HRegionInfo hri : regionInfos) {
+ masterServices.getAssignmentManager().getRegionStates().deleteRegion(hri);
+ }
+ // Delete the regions from ServerManager
+ masterServices.getServerManager().removeRegions(regionInfos);
+
+ // For region replicas
+ if (regionReplication > 1) {
+ for (HRegionInfo regionInfo : regionInfos) {
+ for (int i = 1; i < regionReplication; i++) {
+ HRegionInfo regionInfoForReplica =
+ RegionReplicaUtil.getRegionInfoForReplica(regionInfo, i);
+ // Delete the regions from AssignmentManager
+ masterServices.getAssignmentManager().getRegionStates()
+ .deleteRegion(regionInfoForReplica);
+ // Delete the regions from ServerManager
+ masterServices.getServerManager().removeRegion(regionInfoForReplica);
+ }
+ }
+ }
+ }
+
@Override
protected void completed(final Throwable exception) {
this.stopped = true;
http://git-wip-us.apache.org/repos/asf/hbase/blob/03eb3d24/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 d5ef6e2..99f257c 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
@@ -39,6 +39,7 @@ 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;
+import org.apache.hadoop.hbase.master.RegionState;
import org.apache.hadoop.hbase.regionserver.InternalScanner;
import org.apache.hadoop.hbase.regionserver.ScanType;
import org.apache.hadoop.hbase.regionserver.Store;
@@ -47,7 +48,6 @@ 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;
@@ -384,8 +384,7 @@ public class TestRestoreSnapshotFromClient {
}
public static class DelayCompactionObserver extends BaseRegionObserver {
- @Override
- public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> e,
+ @Override public InternalScanner preCompact(ObserverContext<RegionCoprocessorEnvironment> e,
final Store store, final InternalScanner scanner, final ScanType scanType)
throws IOException {
@@ -400,6 +399,28 @@ public class TestRestoreSnapshotFromClient {
}
}
+ @Test
+ public void testOfflineRegionsShouldBeZeroAfterRestoreSnapshot() throws IOException,
+ InterruptedException {
+ // Load more data to split regions
+ SnapshotTestingUtils.loadData(TEST_UTIL, tableName, 2000, FAMILY);
+
+ // Split regions
+ List<HRegionInfo> regions = admin.getTableRegions(tableName);
+ RegionReplicaUtil.removeNonDefaultRegions(regions);
+ splitRegion(regions.get(0));
+
+ // Restore the snapshot
+ admin.disableTable(tableName);
+ admin.restoreSnapshot(snapshotName0);
+ admin.enableTable(tableName);
+
+ int offlineRegions = TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager()
+ .getRegionStates().getRegionByStateOfTable(tableName).get(RegionState.State.OFFLINE).size();
+
+ assertEquals(0, offlineRegions);
+ }
+
// ==========================================================================
// Helpers
// ==========================================================================