Upload settings in batches of 250

Closes #2000
This commit is contained in:
Dan Stillman 2021-11-06 03:38:25 -04:00
parent cd3304e16c
commit f5eb99ad4c
2 changed files with 93 additions and 25 deletions

View file

@ -1102,35 +1102,42 @@ Zotero.Sync.Data.Engine.prototype._startUpload = Zotero.Promise.coroutine(functi
});
Zotero.Sync.Data.Engine.prototype._uploadSettings = Zotero.Promise.coroutine(function* (settings, libraryVersion) {
let json = {};
for (let key in settings) {
json[key] = {
value: settings[key]
};
}
libraryVersion = yield this.apiClient.uploadSettings(
this.library.libraryType,
this.libraryTypeID,
libraryVersion,
json
);
yield Zotero.SyncedSettings.markAsSynced(
this.libraryID,
Zotero.Sync.Data.Engine.prototype._uploadSettings = async function (settings, libraryVersion) {
const SETTINGS_BATCH_SIZE = 250;
await Zotero.Utilities.Internal.forEachChunkAsync(
Object.keys(settings),
libraryVersion
);
if (this.library.libraryVersion == this.library.storageVersion) {
this.library.storageVersion = libraryVersion;
}
this.library.libraryVersion = libraryVersion;
yield this.library.saveTx({
skipNotifier: true
});
SETTINGS_BATCH_SIZE,
async function (keys) {
let json = {};
for (let key of keys) {
json[key] = {
value: settings[key]
};
}
libraryVersion = await this.apiClient.uploadSettings(
this.library.libraryType,
this.libraryTypeID,
libraryVersion,
json
);
await Zotero.SyncedSettings.markAsSynced(
this.libraryID,
keys,
libraryVersion
);
if (this.library.libraryVersion == this.library.storageVersion) {
this.library.storageVersion = libraryVersion;
}
this.library.libraryVersion = libraryVersion;
await this.library.saveTx({
skipNotifier: true
});
}.bind(this)
);
Zotero.debug("Done uploading settings in " + this.library.name);
return libraryVersion;
});
};
Zotero.Sync.Data.Engine.prototype._uploadObjects = Zotero.Promise.coroutine(function* (objectType, ids, libraryVersion) {

View file

@ -959,6 +959,67 @@ describe("Zotero.Sync.Data.Engine", function () {
});
it("should upload settings in batches", async function () {
({ engine, client, caller } = await setup());
var batchSize = 250;
var library = Zotero.Libraries.userLibrary;
var libraryID = library.id;
var lastLibraryVersion = 5;
library.libraryVersion = library.storageVersion = lastLibraryVersion;
await library.saveTx();
for (let i = 0; i < (batchSize * 2 + 5); i++) {
let key = Zotero.DataObjectUtilities.generateKey();
let page = Zotero.Utilities.rand(1, 20);
await Zotero.SyncedSettings.set(libraryID, `lastPageIndex_u_${key}`, page);
}
var keys = new Set();
var numRequests = 0;
server.respond(function (req) {
if (req.method == "POST") {
numRequests++;
assert.equal(
req.requestHeaders["If-Unmodified-Since-Version"], lastLibraryVersion
);
if (req.url == baseURL + "users/1/settings") {
let json = JSON.parse(req.requestBody);
Zotero.debug(json);
if (numRequests == 1 || numRequests == 2) {
assert.lengthOf(Object.keys(json), batchSize);
}
else {
assert.lengthOf(Object.keys(json), 5);
}
for (let key of Object.keys(json)) {
keys.add(key);
}
req.respond(
204,
{
"Last-Modified-Version": ++lastLibraryVersion
},
""
);
return;
}
}
})
await engine.start();
assert.equal(numRequests, 3);
assert.equal(keys.size, batchSize * 2 + 5);
});
it("shouldn't update library storage version after settings upload if storage version was already behind", function* () {
({ engine, client, caller } = yield setup());