From 93a7eb7474e5632d282e914f2350ce5791615184 Mon Sep 17 00:00:00 2001 From: Stephen Atherton Date: Fri, 19 Jan 2018 12:19:32 -0800 Subject: [PATCH] Fdbbackup restore will now default to the latest usable version in a backup if a specific restore version was not given. Expire will make sure a cluster is provided if either of its timestamp options are given. --- fdbbackup/backup.actor.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/fdbbackup/backup.actor.cpp b/fdbbackup/backup.actor.cpp index e8c1549f56..33564831b4 100644 --- a/fdbbackup/backup.actor.cpp +++ b/fdbbackup/backup.actor.cpp @@ -1724,9 +1724,18 @@ ACTOR Future runRestore(Database db, std::string tagName, std::string cont throw restore_error(); } - KeyRange range = (ranges.size() == 0) ? normalKeys : ranges.front(); + state KeyRange range = (ranges.size() == 0) ? normalKeys : ranges.front(); if (performRestore) { + if(dbVersion == invalidVersion) { + BackupDescription desc = wait(IBackupContainer::openContainer(container)->describeBackup()); + if(!desc.maxRestorableVersion.present()) { + fprintf(stderr, "The specified backup is not restorable to any version.\n"); + throw restore_error(); + } + + dbVersion = desc.maxRestorableVersion.get(); + } Version _restoreVersion = wait(backupAgent.restore(db, KeyRef(tagName), KeyRef(container), waitForDone, dbVersion, verbose, range, KeyRef(addPrefix), KeyRef(removePrefix))); restoreVersion = _restoreVersion; } @@ -2279,7 +2288,7 @@ int main(int argc, char* argv[]) { std::string removePrefix; Standalone> backupKeys; int maxErrors = 20; - Version dbVersion = 0; + Version dbVersion = invalidVersion; bool waitForDone = false; bool stopWhenDone = true; bool forceAction = false; @@ -2824,7 +2833,8 @@ int main(int argc, char* argv[]) { break; case BACKUP_EXPIRE: - if(!expireDatetime.empty()) + // Must have a usable cluster if either expire DateTime options were used + if(!expireDatetime.empty() || !expireRestorableAfterDatetime.empty()) if(!initCluster()) return FDB_EXIT_ERROR; f = stopAfter( expireBackupData(argv[0], destinationContainer, expireVersion, expireDatetime, db, forceAction, expireRestorableAfterVersion, expireRestorableAfterDatetime) ); @@ -2835,6 +2845,7 @@ int main(int argc, char* argv[]) { break; case BACKUP_DESCRIBE: + // Describe will lookup version timestamps if a cluster file was given, but quietly skip them if not. f = stopAfter( describeBackup(argv[0], destinationContainer, describeDeep, initCluster(true) ? db : Optional()) ); break;