Fix one cause of "operation timed out" during sync

Remove some unnecessary transactions in Sync.Data.Local
This commit is contained in:
Dan Stillman 2017-06-16 01:50:17 -04:00
parent 3e0ab63b9b
commit 8de0b024f0

View file

@ -640,22 +640,20 @@ Zotero.Sync.Data.Local = {
var sql = "INSERT OR REPLACE INTO syncCache " var sql = "INSERT OR REPLACE INTO syncCache "
+ "(libraryID, key, syncObjectTypeID, version, data) VALUES "; + "(libraryID, key, syncObjectTypeID, version, data) VALUES ";
var chunkSize = Math.floor(Zotero.DB.MAX_BOUND_PARAMETERS / 5); var chunkSize = Math.floor(Zotero.DB.MAX_BOUND_PARAMETERS / 5);
return Zotero.DB.executeTransaction(function* () { return Zotero.Utilities.Internal.forEachChunkAsync(
return Zotero.Utilities.Internal.forEachChunkAsync( jsonArray,
jsonArray, chunkSize,
chunkSize, Zotero.Promise.coroutine(function* (chunk) {
Zotero.Promise.coroutine(function* (chunk) { var params = [];
var params = []; for (let i = 0; i < chunk.length; i++) {
for (let i = 0; i < chunk.length; i++) { let o = chunk[i];
let o = chunk[i]; params.push(libraryID, o.key, syncObjectTypeID, o.version, JSON.stringify(o));
params.push(libraryID, o.key, syncObjectTypeID, o.version, JSON.stringify(o)); }
} return Zotero.DB.queryAsync(
return Zotero.DB.queryAsync( sql + chunk.map(() => "(?, ?, ?, ?, ?)").join(", "), params
sql + chunk.map(() => "(?, ?, ?, ?, ?)").join(", "), params );
); })
}) );
);
}.bind(this));
}), }),
@ -1646,18 +1644,16 @@ Zotero.Sync.Data.Local = {
var syncObjectTypeID = Zotero.Sync.Data.Utilities.getSyncObjectTypeID(objectType); var syncObjectTypeID = Zotero.Sync.Data.Utilities.getSyncObjectTypeID(objectType);
var sql = "DELETE FROM syncDeleteLog WHERE libraryID=? AND syncObjectTypeID=? AND key IN ("; var sql = "DELETE FROM syncDeleteLog WHERE libraryID=? AND syncObjectTypeID=? AND key IN (";
return Zotero.DB.executeTransaction(function* () { return Zotero.Utilities.Internal.forEachChunkAsync(
return Zotero.Utilities.Internal.forEachChunkAsync( keys,
keys, Zotero.DB.MAX_BOUND_PARAMETERS - 2,
Zotero.DB.MAX_BOUND_PARAMETERS - 2, Zotero.Promise.coroutine(function* (chunk) {
Zotero.Promise.coroutine(function* (chunk) { var params = [libraryID, syncObjectTypeID].concat(chunk);
var params = [libraryID, syncObjectTypeID].concat(chunk); return Zotero.DB.queryAsync(
return Zotero.DB.queryAsync( sql + Array(chunk.length).fill('?').join(',') + ")", params
sql + Array(chunk.length).fill('?').join(',') + ")", params );
); })
}) );
);
}.bind(this));
}, },
@ -1691,24 +1687,22 @@ Zotero.Sync.Data.Local = {
); );
// Insert or update // Insert or update
yield Zotero.DB.executeTransaction(function* () { var sql = "INSERT OR REPLACE INTO syncQueue "
var sql = "INSERT OR REPLACE INTO syncQueue " + "(libraryID, key, syncObjectTypeID, lastCheck, tries) VALUES ";
+ "(libraryID, key, syncObjectTypeID, lastCheck, tries) VALUES "; return Zotero.Utilities.Internal.forEachChunkAsync(
return Zotero.Utilities.Internal.forEachChunkAsync( keys,
keys, Math.floor(Zotero.DB.MAX_BOUND_PARAMETERS / 5),
Math.floor(Zotero.DB.MAX_BOUND_PARAMETERS / 5), function (chunk) {
function (chunk) { var params = chunk.reduce(
var params = chunk.reduce( (arr, key) => arr.concat(
(arr, key) => arr.concat( [libraryID, key, syncObjectTypeID, now, keyTries[key]]
[libraryID, key, syncObjectTypeID, now, keyTries[key]] ), []
), [] );
); return Zotero.DB.queryAsync(
return Zotero.DB.queryAsync( sql + Array(chunk.length).fill('(?, ?, ?, ?, ?)').join(', '), params
sql + Array(chunk.length).fill('(?, ?, ?, ?, ?)').join(', '), params );
); }
} );
);
}.bind(this));
}), }),
@ -1746,18 +1740,16 @@ Zotero.Sync.Data.Local = {
removeObjectsFromSyncQueue: function (objectType, libraryID, keys) { removeObjectsFromSyncQueue: function (objectType, libraryID, keys) {
var syncObjectTypeID = Zotero.Sync.Data.Utilities.getSyncObjectTypeID(objectType); var syncObjectTypeID = Zotero.Sync.Data.Utilities.getSyncObjectTypeID(objectType);
var sql = "DELETE FROM syncQueue WHERE libraryID=? AND syncObjectTypeID=? AND key IN ("; var sql = "DELETE FROM syncQueue WHERE libraryID=? AND syncObjectTypeID=? AND key IN (";
return Zotero.DB.executeTransaction(function* () { return Zotero.Utilities.Internal.forEachChunkAsync(
return Zotero.Utilities.Internal.forEachChunkAsync( keys,
keys, Zotero.DB.MAX_BOUND_PARAMETERS - 2,
Zotero.DB.MAX_BOUND_PARAMETERS - 2, Zotero.Promise.coroutine(function* (chunk) {
Zotero.Promise.coroutine(function* (chunk) { var params = [libraryID, syncObjectTypeID].concat(chunk);
var params = [libraryID, syncObjectTypeID].concat(chunk); return Zotero.DB.queryAsync(
return Zotero.DB.queryAsync( sql + Array(chunk.length).fill('?').join(',') + ")", params
sql + Array(chunk.length).fill('?').join(',') + ")", params );
); })
}) );
);
}.bind(this));
}, },