Remove redundant failure delay handling in sync engine

The API client now automatically retries 5xx errors with a backoff schedule, so
the engine doesn't need to do it.
This commit is contained in:
Dan Stillman 2016-05-06 03:21:39 -04:00
parent a78f923a72
commit 8ba9fe7b80

View File

@ -29,7 +29,6 @@ if (!Zotero.Sync.Data) {
// TODO: move? // TODO: move?
Zotero.Sync.Data.conflictDelayIntervals = [10000, 20000, 40000, 60000, 120000, 240000, 300000]; Zotero.Sync.Data.conflictDelayIntervals = [10000, 20000, 40000, 60000, 120000, 240000, 300000];
Zotero.Sync.Data.failureDelayIntervals = [2500, 5000, 10000, 20000, 40000, 60000, 120000, 240000, 300000];
/** /**
* An Engine manages sync processes for a given library * An Engine manages sync processes for a given library
@ -827,55 +826,24 @@ Zotero.Sync.Data.Engine.prototype._startUpload = Zotero.Promise.coroutine(functi
Zotero.Sync.Data.Engine.prototype._uploadSettings = Zotero.Promise.coroutine(function* (settings, libraryVersion) { Zotero.Sync.Data.Engine.prototype._uploadSettings = Zotero.Promise.coroutine(function* (settings, libraryVersion) {
while (true) { let json = {};
try { for (let key in settings) {
let json = {}; json[key] = {
for (let key in settings) { value: settings[key]
json[key] = { };
value: settings[key]
};
}
libraryVersion = yield this.apiClient.uploadSettings(
this.library.libraryType,
this.libraryTypeID,
libraryVersion,
json
);
yield Zotero.SyncedSettings.markAsSynced(
this.libraryID,
Object.keys(settings),
libraryVersion
);
break;
}
catch (e) {
if (e instanceof Zotero.HTTP.UnexpectedStatusException) {
if (e.status == 412) {
throw e;
}
// On 5xx, delay and retry
if (e.status >= 500 && e.status <= 600) {
if (!failureDelayGenerator) {
// Keep trying for up to an hour
failureDelayGenerator = Zotero.Utilities.Internal.delayGenerator(
Zotero.Sync.Data.failureDelayIntervals, 60 * 60 * 1000
);
}
let keepGoing = yield failureDelayGenerator.next();
if (!keepGoing) {
Zotero.logError("Failed too many times");
throw e;
}
continue;
}
}
throw e;
}
} }
libraryVersion = yield this.apiClient.uploadSettings(
this.library.libraryType,
this.libraryTypeID,
libraryVersion,
json
);
yield Zotero.SyncedSettings.markAsSynced(
this.libraryID,
Object.keys(settings),
libraryVersion
);
Zotero.debug("Done uploading settings in " + this.library.name); Zotero.debug("Done uploading settings in " + this.library.name);
return libraryVersion; return libraryVersion;
}); });
@ -894,8 +862,6 @@ Zotero.Sync.Data.Engine.prototype._uploadObjects = Zotero.Promise.coroutine(func
}); });
} }
let failureDelayGenerator = null;
while (queue.length) { while (queue.length) {
// Get a slice of the queue and generate JSON for objects if necessary // Get a slice of the queue and generate JSON for objects if necessary
let batch = []; let batch = [];
@ -1049,60 +1015,25 @@ Zotero.Sync.Data.Engine.prototype._uploadDeletions = Zotero.Promise.coroutine(fu
let objectTypePlural = Zotero.DataObjectUtilities.getObjectTypePlural(objectType); let objectTypePlural = Zotero.DataObjectUtilities.getObjectTypePlural(objectType);
let objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(objectType); let objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(objectType);
let failureDelayGenerator = null;
while (keys.length) { while (keys.length) {
try { let batch = keys.slice(0, this.uploadDeletionBatchSize);
let batch = keys.slice(0, this.uploadDeletionBatchSize); libraryVersion = yield this.apiClient.uploadDeletions(
libraryVersion = yield this.apiClient.uploadDeletions( this.library.libraryType,
this.library.libraryType, this.libraryTypeID,
this.libraryTypeID, libraryVersion,
libraryVersion, objectType,
objectType, batch
batch );
); keys.splice(0, batch.length);
keys.splice(0, batch.length);
// Update library version // Update library version
this.library.libraryVersion = libraryVersion; this.library.libraryVersion = libraryVersion;
yield this.library.saveTx(); yield this.library.saveTx();
// Remove successful deletions from delete log // Remove successful deletions from delete log
yield Zotero.Sync.Data.Local.removeObjectsFromDeleteLog( yield Zotero.Sync.Data.Local.removeObjectsFromDeleteLog(
objectType, this.libraryID, batch objectType, this.libraryID, batch
); );
}
catch (e) {
if (e instanceof Zotero.HTTP.UnexpectedStatusException) {
if (e.status == 412) {
throw e;
}
// On 5xx, delay and retry
if (e.status >= 500 && e.status <= 600) {
if (this.onError) {
this.onError(e);
}
if (this.stopOnError) {
throw new Error(e);
}
if (!failureDelayGenerator) {
// Keep trying for up to an hour
failureDelayGenerator = Zotero.Utilities.Internal.delayGenerator(
Zotero.Sync.Data.failureDelayIntervals, 60 * 60 * 1000
);
}
let keepGoing = yield failureDelayGenerator.next();
if (!keepGoing) {
Zotero.logError("Failed too many times");
throw e;
}
continue;
}
}
throw e;
}
} }
Zotero.debug(`Done uploading ${objectType} deletions in ${this.library.name}`); Zotero.debug(`Done uploading ${objectType} deletions in ${this.library.name}`);