backup: retry rsync file downloads

fixes #608
This commit is contained in:
Girish Ramakrishnan
2019-01-14 11:48:47 -08:00
parent d0522d7d4f
commit 3236a9a5b7
2 changed files with 15 additions and 9 deletions

View File

@@ -508,18 +508,23 @@ function downloadDir(backupConfig, backupFilePath, destDir, progressCallback, ca
mkdirp(path.dirname(destFilePath), function (error) {
if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message));
api(backupConfig.provider).download(backupConfig, entry.fullPath, function (error, sourceStream) {
if (error) return callback(error);
sourceStream.on('error', callback);
async.retry({ times: 5, interval: 20000 }, function (retryCallback) {
let destStream = createWriteStream(destFilePath, backupConfig.key || null);
destStream.on('error', callback);
progressCallback({ message: `Downloading ${entry.fullPath} to ${destFilePath}` });
// protect against multiple errors. must destroy the write stream so that a previous retry does not write
let closeAndRetry = once((error) => { destStream.destroy(); retryCallback(error); });
sourceStream.pipe(destStream, { end: true }).on('finish', callback);
});
api(backupConfig.provider).download(backupConfig, entry.fullPath, function (error, sourceStream) {
if (error) return closeAndRetry(error);
sourceStream.on('error', closeAndRetry);
destStream.on('error', closeAndRetry);
progressCallback({ message: `Downloading ${entry.fullPath} to ${destFilePath}` });
sourceStream.pipe(destStream, { end: true }).on('finish', closeAndRetry);
});
}, callback);
});
}