diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java hbase-server/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java index eff45cc..d48b77e 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java @@ -83,6 +83,14 @@ public interface BackupRestoreConstants { public final static String BACKUP_SYSTEM_TTL_KEY = "hbase.backup.system.ttl"; public final static int BACKUP_SYSTEM_TTL_DEFAULT = HConstants.FOREVER; + + public static final String SNAPSHOT_BACKUP_MAX_ATTEMPTS_KEY = "hbase.backup.snapshot.attempts.max"; + public static final int DEFAULT_SNAPSHOT_BACKUP_MAX_ATTEMPTS = 10; + + public static final String SNAPSHOT_BACKUP_ATTEMPTS_DELAY_KEY = "hbase.backup.snapshot.attempts.delay"; + public static final int DEFAULT_SNAPSHOT_BACKUP_ATTEMPTS_DELAY = 10000; + + public static enum BackupCommand { CREATE, CANCEL, DELETE, DESCRIBE, HISTORY, STATUS, CONVERT, MERGE, STOP, SHOW, HELP, PROGRESS, SET, SET_ADD, SET_REMOVE, SET_DELETE, SET_DESCRIBE, SET_LIST diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/backup/impl/FullTableBackupClient.java hbase-server/src/main/java/org/apache/hadoop/hbase/backup/impl/FullTableBackupClient.java index f1f09cc..4cc2c68 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/backup/impl/FullTableBackupClient.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/backup/impl/FullTableBackupClient.java @@ -40,8 +40,6 @@ import org.apache.hadoop.hbase.backup.BackupRestoreConstants; import org.apache.hadoop.hbase.backup.BackupRestoreServerFactory; import org.apache.hadoop.hbase.backup.BackupType; import org.apache.hadoop.hbase.backup.HBackupFileSystem; -import org.apache.hadoop.hbase.backup.impl.BackupException; -import org.apache.hadoop.hbase.backup.impl.BackupManifest; import org.apache.hadoop.hbase.backup.impl.BackupManifest.BackupImage; import org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager; import org.apache.hadoop.hbase.backup.util.BackupClientUtil; @@ -55,7 +53,7 @@ import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.FSUtils; @InterfaceAudience.Private -public class FullTableBackupClient { +public class FullTableBackupClient implements BackupRestoreConstants{ private static final Log LOG = LogFactory.getLog(FullTableBackupClient.class); private Configuration conf; @@ -80,7 +78,7 @@ public class FullTableBackupClient { this.conn = conn; this.conf = conn.getConfiguration(); backupContext = - backupManager.createBackupContext(backupId, BackupType.FULL, tableList, + backupManager.createBackupContext(backupId, BackupType.FULL, tableList, request.getTargetRootDir(), request.getWorkers(), request.getBandwidth()); if (tableList == null || tableList.isEmpty()) { @@ -499,8 +497,7 @@ public class FullTableBackupClient { "snapshot_" + Long.toString(EnvironmentEdgeManager.currentTime()) + "_" + tableName.getNamespaceAsString() + "_" + tableName.getQualifierAsString(); - admin.snapshot(snapshotName, tableName); - + snapshotTable(admin, tableName, snapshotName); backupContext.setSnapshotName(tableName, snapshotName); } @@ -537,4 +534,32 @@ public class FullTableBackupClient { } + private void snapshotTable(Admin admin, TableName tableName, String snapshotName) + throws IOException { + + int maxAttempts = + conf.getInt(SNAPSHOT_BACKUP_MAX_ATTEMPTS_KEY, DEFAULT_SNAPSHOT_BACKUP_MAX_ATTEMPTS); + int delay = + conf.getInt(SNAPSHOT_BACKUP_ATTEMPTS_DELAY_KEY, DEFAULT_SNAPSHOT_BACKUP_ATTEMPTS_DELAY); + int attempts = 0; + + while (attempts++ < maxAttempts) { + try { + admin.snapshot(snapshotName, tableName); + break; + } catch (Exception ee) { + LOG.warn("Snapshot attempt " + attempts + " failed for table " + tableName + + ", sleeping for " + delay + "ms", ee); + if (attempts < maxAttempts) { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + } + + } + }