diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseBackupAdmin.java hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseBackupAdmin.java index 81413c6..8b4fa54 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseBackupAdmin.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseBackupAdmin.java @@ -37,6 +37,7 @@ import org.apache.hadoop.hbase.backup.util.BackupClientUtil; import org.apache.hadoop.hbase.backup.util.BackupSet; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; +import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; /** * The administrative API implementation for HBase Backup . Obtain an instance from @@ -212,10 +213,32 @@ public class HBaseBackupAdmin implements BackupAdmin { @Override public String backupTables(final BackupRequest userRequest) throws IOException { - return admin.backupTables(userRequest); + String backupId = null; + TableName sysTable = BackupSystemTable.getTableName(); + String snapshot = sysTable.getNamespaceAsString() +"." + sysTable.getQualifierAsString() + + "."+EnvironmentEdgeManager.currentTime(); + + try{ + admin.disableTable(sysTable); + admin.snapshot(snapshot, sysTable); + admin.enableTable(sysTable); + backupId = admin.backupTables(userRequest); + return backupId; + } catch (IOException e){ + admin.disableTable(sysTable); + admin.restoreSnapshot(snapshot); + admin.enableTable(sysTable); + throw e; + } finally { + // Delete system snapshot + admin.deleteSnapshot(snapshot); + } } - + /** + * This call does not provide full fault tolerance, + * if it fails, hbase:backup table will be corrupted + */ @Override public Future backupTablesAsync(final BackupRequest userRequest) throws IOException {