diff --git src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java index 94ffeb6..0d75532 100644 --- src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java +++ src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.PairOfSameType; +import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hbase.util.Writables; /** @@ -357,6 +358,24 @@ public class MetaEditor { } } + /** + * Overwrites the specified regions from hbase:meta + * @param catalogTracker + * @param regionInfos list of regions to be added to META + * @throws IOException + */ + public static void overwriteRegions(CatalogTracker catalogTracker, + List regionInfos) throws IOException { + deleteRegions(catalogTracker, regionInfos); + // Why sleep? This is the easiest way to ensure that the previous deletes does not + // eclipse the following puts, that might happen in the same ts from the server. + // See HBASE-9906, and HBASE-9879. Once either HBASE-9879, HBASE-8770 is fixed, + // or HBASE-9905 is fixed and meta uses seqIds, we do not need the sleep. + Threads.sleep(20); + addRegionsToMeta(catalogTracker, regionInfos); + LOG.info("Overwritten " + regionInfos); + } + public static HRegionInfo getHRegionInfo( Result data) throws IOException { byte [] bytes = diff --git src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java index fcb7067..837c470 100644 --- src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java +++ src/main/java/org/apache/hadoop/hbase/master/snapshot/RestoreSnapshotHandler.java @@ -141,7 +141,6 @@ public class RestoreSnapshotHandler extends TableEventHandler implements Snapsho // that are not correct after the restore. List hrisToRemove = new LinkedList(); if (metaChanges.hasRegionsToRemove()) hrisToRemove.addAll(metaChanges.getRegionsToRemove()); - if (metaChanges.hasRegionsToRestore()) hrisToRemove.addAll(metaChanges.getRegionsToRestore()); MetaEditor.deleteRegions(catalogTracker, hrisToRemove); // 4.2 Add the new set of regions to META @@ -152,8 +151,8 @@ public class RestoreSnapshotHandler extends TableEventHandler implements Snapsho // in the snapshot folder. hris.clear(); if (metaChanges.hasRegionsToAdd()) hris.addAll(metaChanges.getRegionsToAdd()); - if (metaChanges.hasRegionsToRestore()) hris.addAll(metaChanges.getRegionsToRestore()); MetaEditor.addRegionsToMeta(catalogTracker, hris); + MetaEditor.overwriteRegions(catalogTracker, metaChanges.getRegionsToRestore()); metaChanges.updateMetaParentRegions(catalogTracker, hris); // At this point the restore is complete. Next step is enabling the table.