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 <[email protected]> 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 <[email protected]> Authored: Wed Jan 24 03:34:45 2018 +0900 Committer: tedyu <[email protected]> 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 // ==========================================================================
