Bug 1273342 - Don't retry skippable records that fail to sync due to being too large. r?markh draft
authorThom Chiovoloni <tchiovoloni@mozilla.com>
Mon, 21 Nov 2016 15:37:35 -0500
changeset 442150 156ac079073b11ff14b83b9c712ea57ce451fa2b
parent 442149 9ef303d80d12ed1f29d833d578eac2a61f556d3c
child 537709 dcbb22087de7060b33d92e5dade454d095d4df8c
push id36597
push userbmo:tchiovoloni@mozilla.com
push dateMon, 21 Nov 2016 20:38:10 +0000
reviewersmarkh
bugs1273342
milestone53.0a1
Bug 1273342 - Don't retry skippable records that fail to sync due to being too large. r?markh MozReview-Commit-ID: HjzL1crTVDB
services/sync/modules/engines.js
services/sync/tests/unit/test_syncengine_sync.js
--- 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');