Bug fix, backup never went to differential mode once it was restorable which caused waitBackup to only return once the backup was discontinued.

This commit is contained in:
Stephen Atherton 2017-12-17 23:22:18 -08:00
parent 2b92815e8c
commit d32a770648
1 changed files with 29 additions and 10 deletions

View File

@ -1295,8 +1295,6 @@ namespace fileBackup {
snapshotBatchSize = newBatchSize; snapshotBatchSize = newBatchSize;
} }
// Count the undispatched ranges while checking the boundaries
int undispatchedRanges = 0;
state std::vector<Future<Void>> addTaskFutures; state std::vector<Future<Void>> addTaskFutures;
for(int i = 0; i < beginReads.size(); ++i) { for(int i = 0; i < beginReads.size(); ++i) {
@ -1314,7 +1312,6 @@ namespace fileBackup {
if( (!beginValue.present() || !beginValue.get()) if( (!beginValue.present() || !beginValue.get())
&& (!endValue.present() || endValue.get()) ) && (!endValue.present() || endValue.get()) )
{ {
++undispatchedRanges;
if(beginValue.present()) { if(beginValue.present()) {
config.snapshotRangeDispatchMap().erase(tr, range.begin); config.snapshotRangeDispatchMap().erase(tr, range.begin);
} }
@ -1332,11 +1329,12 @@ namespace fileBackup {
Version randomVersion = recentReadVersion + g_random->random01() * (nextDispatchVersion - recentReadVersion); Version randomVersion = recentReadVersion + g_random->random01() * (nextDispatchVersion - recentReadVersion);
addTaskFutures.push_back(success(BackupRangeTaskFunc::addTask(tr, taskBucket, task, range.begin, range.end, TaskCompletionKey::joinWith(snapshotBatchFuture), Reference<TaskFuture>(), 0, randomVersion))); addTaskFutures.push_back(success(BackupRangeTaskFunc::addTask(tr, taskBucket, task, range.begin, range.end, TaskCompletionKey::joinWith(snapshotBatchFuture), Reference<TaskFuture>(), 0, randomVersion)));
} }
else {
// This shouldn't happen because if the transaction was already done or if another execution
// of this task is making progress it should have been detected above.
ASSERT(false);
}
} }
if(undispatchedRanges == 0)
break;
ASSERT(undispatchedRanges == rangesToAdd.size());
Void _ = wait(waitForAll(addTaskFutures)); Void _ = wait(waitForAll(addTaskFutures));
Void _ = wait(tr->commit()); Void _ = wait(tr->commit());
@ -1620,7 +1618,15 @@ namespace fileBackup {
state bool stopWhenDone; state bool stopWhenDone;
state Optional<Version> restorableVersion; state Optional<Version> restorableVersion;
Void _ = wait(store(config.stopWhenDone().getOrThrow(tr), stopWhenDone) && store(config.getLatestRestorableVersion(tr), restorableVersion)); state EBackupState backupState;
Void _ = wait(store(config.stopWhenDone().getOrThrow(tr), stopWhenDone)
&& store(config.getLatestRestorableVersion(tr), restorableVersion)
&& store(config.stateEnum().getOrThrow(tr), backupState));
// If the backup is restorable but the state is not differential then set state to differential
if(restorableVersion.present() && backupState != BackupAgentBase::STATE_DIFFERENTIAL)
config.stateEnum().set(tr, BackupAgentBase::STATE_DIFFERENTIAL);
// If stopWhenDone is set and there is a restorable version, set the done future and do not create further tasks. // If stopWhenDone is set and there is a restorable version, set the done future and do not create further tasks.
if(stopWhenDone && restorableVersion.present()) { if(stopWhenDone && restorableVersion.present()) {
@ -1805,10 +1811,23 @@ namespace fileBackup {
Void _ = wait(checkTaskVersion(tr->getDatabase(), task, BackupSnapshotManifest::name, BackupSnapshotManifest::version)); Void _ = wait(checkTaskVersion(tr->getDatabase(), task, BackupSnapshotManifest::name, BackupSnapshotManifest::version));
state BackupConfig config(task); state BackupConfig config(task);
// Set the latest snapshot end version, which was set during the execute phase
config.latestSnapshotEndVersion().set(tr, Params.endVersion().get(task)); config.latestSnapshotEndVersion().set(tr, Params.endVersion().get(task));
// Start the next snapshot unless stopWhenDone is set. state bool stopWhenDone;
bool stopWhenDone = wait(config.stopWhenDone().getOrThrow(tr, false)); state EBackupState backupState;
state Optional<Version> restorableVersion;
Void _ = wait(store(config.stopWhenDone().getOrThrow(tr), stopWhenDone)
&& store(config.stateEnum().getOrThrow(tr), backupState)
&& store(config.getLatestRestorableVersion(tr), restorableVersion));
// If the backup is restorable and the state isn't differential the set state to differential
if(restorableVersion.present() && backupState != BackupAgentBase::STATE_DIFFERENTIAL)
config.stateEnum().set(tr, BackupAgentBase::STATE_DIFFERENTIAL);
// Unless we are to stop, start the next snapshot using the default interval
if(!stopWhenDone) if(!stopWhenDone)
Void _ = wait(config.initNewSnapshot(tr) && success(BackupSnapshotDispatchTask::addTask(tr, taskBucket, task, TaskCompletionKey::noSignal()))); Void _ = wait(config.initNewSnapshot(tr) && success(BackupSnapshotDispatchTask::addTask(tr, taskBucket, task, TaskCompletionKey::noSignal())));