Bug 1273342 - Don't retry skippable records that fail to sync due to being too large. r?markh
MozReview-Commit-ID: HjzL1crTVDB
--- a/services/sync/modules/engines.js
+++ b/services/sync/modules/engines.js
@@ -1581,16 +1581,18 @@ SyncEngine.prototype = {
}
if (ok) {
let { enqueued, error } = postQueue.enqueue(out);
if (!enqueued) {
++counts.failed;
if (!this.allowSkippedRecord) {
throw error;
}
+ this._modified.delete(id);
+ this._log.warn(`Failed to enqueue record "${id}" (skipping)`, error);
}
}
this._store._sleep(0);
}
postQueue.flush(true);
Observers.notify("weave:engine:sync:uploaded", counts, this.name);
}
},
--- a/services/sync/tests/unit/test_syncengine_sync.js
+++ b/services/sync/tests/unit/test_syncengine_sync.js
@@ -1364,16 +1364,63 @@ add_test(function test_uploadOutgoing_to
do_check_eq(collection.payload("flying"), undefined);
} finally {
cleanAndGo(server);
}
});
+add_test(function test_uploadOutgoing_huge() {
+ Service.identity.username = "foo";
+ let collection = new ServerCollection();
+ collection._wbos.flying = new ServerWBO('flying');
+ collection._wbos.scotsman = new ServerWBO('scotsman');
+
+ let server = sync_httpd_setup({
+ "/1.1/foo/storage/rotary": collection.handler(),
+ "/1.1/foo/storage/rotary/flying": collection.wbo("flying").handler(),
+ });
+
+ let syncTesting = new SyncTestingInfrastructure(server);
+ generateNewKeys(Service.collectionKeys);
+
+ let engine = makeRotaryEngine();
+ engine.allowSkippedRecord = true;
+ engine.lastSync = 1;
+ engine._store.items = { flying: "a".repeat(1024 * 1024) };
+
+ engine._tracker.addChangedID("flying", 1000);
+
+ let meta_global = Service.recordManager.set(engine.metaURL,
+ new WBORecord(engine.metaURL));
+ meta_global.payload.engines = {rotary: {version: engine.version,
+ syncID: engine.syncID}};
+
+ try {
+
+ // Confirm initial environment
+ do_check_eq(engine.lastSyncLocal, 0);
+ do_check_eq(collection.payload("flying"), undefined);
+
+ engine._syncStartup();
+ engine._uploadOutgoing();
+ engine.trackRemainingChanges();
+
+ // Check we didn't upload to the server
+ do_check_eq(collection.payload("flying"), undefined);
+ // And that we won't try to upload it again next time.
+ do_check_eq(engine._tracker.changedIDs["flying"], undefined);
+
+ } finally {
+ cleanAndGo(server);
+ }
+});
+
+
add_task(function *test_uploadOutgoing_failed() {
_("SyncEngine._uploadOutgoing doesn't clear the tracker of objects that failed to upload.");
Service.identity.username = "foo";
let collection = new ServerCollection();
// We only define the "flying" WBO on the server, not the "scotsman"
// and "peppercorn" ones.
collection._wbos.flying = new ServerWBO('flying');