From 5632261a6b3e4a76a2568a60fac891071f99b27c Mon Sep 17 00:00:00 2001 From: Grisha Kruglov Date: Thu, 20 Oct 2016 16:31:31 -0700 Subject: [PATCH] Bug 1291821 - Wrap local repositories in buffering middleware r=rnewman History stage does not wrap history respository in a buffer, because we'd like to use a high-water-mark and offset resuming later on, and using a persistent buffer for this stage does not make sense. MozReview-Commit-ID: FS1swml2bIC --HG-- extra : rebase_source : be197e0459d86a320076174936cea8ee76e1dbed --- .../AndroidBrowserHistoryRepositorySession.java | 7 ++++++- .../stage/AndroidBrowserBookmarksServerSyncStage.java | 8 +++++++- .../gecko/sync/stage/FennecTabsServerSyncStage.java | 8 +++++++- .../gecko/sync/stage/FormHistoryServerSyncStage.java | 8 +++++++- .../gecko/sync/stage/PasswordsServerSyncStage.java | 8 +++++++- .../gecko/sync/synchronizer/RecordsChannel.java | 11 ++++++++++- 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/repositories/android/AndroidBrowserHistoryRepositorySession.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/repositories/android/AndroidBrowserHistoryRepositorySession.java index 4e11303e3a7a..4dc7c788c1be 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/repositories/android/AndroidBrowserHistoryRepositorySession.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/repositories/android/AndroidBrowserHistoryRepositorySession.java @@ -191,6 +191,11 @@ public class AndroidBrowserHistoryRepositorySession extends AndroidBrowserReposi @Override public void storeDone() { + storeDone(System.currentTimeMillis()); + } + + @Override + public void storeDone(final long end) { storeWorkQueue.execute(new Runnable() { @Override public void run() { @@ -201,7 +206,7 @@ public class AndroidBrowserHistoryRepositorySession extends AndroidBrowserReposi Logger.warn(LOG_TAG, "Error flushing records to database.", e); } } - storeDone(System.currentTimeMillis()); + AndroidBrowserHistoryRepositorySession.super.storeDone(end); } }); } diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/AndroidBrowserBookmarksServerSyncStage.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/AndroidBrowserBookmarksServerSyncStage.java index c95d7c31ed7d..116e353690ee 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/AndroidBrowserBookmarksServerSyncStage.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/AndroidBrowserBookmarksServerSyncStage.java @@ -7,6 +7,8 @@ package org.mozilla.gecko.sync.stage; import java.net.URISyntaxException; import org.mozilla.gecko.sync.MetaGlobalException; +import org.mozilla.gecko.sync.middleware.BufferingMiddlewareRepository; +import org.mozilla.gecko.sync.middleware.storage.MemoryBufferStorage; import org.mozilla.gecko.sync.repositories.ConstrainedServer11Repository; import org.mozilla.gecko.sync.repositories.RecordFactory; import org.mozilla.gecko.sync.repositories.Repository; @@ -53,7 +55,11 @@ public class AndroidBrowserBookmarksServerSyncStage extends ServerSyncStage { @Override protected Repository getLocalRepository() { - return new AndroidBrowserBookmarksRepository(); + return new BufferingMiddlewareRepository( + session.getSyncDeadline(), + new MemoryBufferStorage(), + new AndroidBrowserBookmarksRepository() + ); } @Override diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FennecTabsServerSyncStage.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FennecTabsServerSyncStage.java index 40a474ef47f6..0567f6b5cfc9 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FennecTabsServerSyncStage.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FennecTabsServerSyncStage.java @@ -4,6 +4,8 @@ package org.mozilla.gecko.sync.stage; +import org.mozilla.gecko.sync.middleware.BufferingMiddlewareRepository; +import org.mozilla.gecko.sync.middleware.storage.MemoryBufferStorage; import org.mozilla.gecko.sync.repositories.RecordFactory; import org.mozilla.gecko.sync.repositories.Repository; import org.mozilla.gecko.sync.repositories.android.FennecTabsRepository; @@ -30,7 +32,11 @@ public class FennecTabsServerSyncStage extends ServerSyncStage { @Override protected Repository getLocalRepository() { - return new FennecTabsRepository(session.getClientsDelegate()); + return new BufferingMiddlewareRepository( + session.getSyncDeadline(), + new MemoryBufferStorage(), + new FennecTabsRepository(session.getClientsDelegate()) + ); } @Override diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FormHistoryServerSyncStage.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FormHistoryServerSyncStage.java index ecb88172bda5..78ce32500d7c 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FormHistoryServerSyncStage.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/FormHistoryServerSyncStage.java @@ -7,6 +7,8 @@ package org.mozilla.gecko.sync.stage; import java.net.URISyntaxException; import org.mozilla.gecko.sync.CryptoRecord; +import org.mozilla.gecko.sync.middleware.BufferingMiddlewareRepository; +import org.mozilla.gecko.sync.middleware.storage.MemoryBufferStorage; import org.mozilla.gecko.sync.repositories.ConstrainedServer11Repository; import org.mozilla.gecko.sync.repositories.RecordFactory; import org.mozilla.gecko.sync.repositories.Repository; @@ -54,7 +56,11 @@ public class FormHistoryServerSyncStage extends ServerSyncStage { @Override protected Repository getLocalRepository() { - return new FormHistoryRepositorySession.FormHistoryRepository(); + return new BufferingMiddlewareRepository( + session.getSyncDeadline(), + new MemoryBufferStorage(), + new FormHistoryRepositorySession.FormHistoryRepository() + ); } public class FormHistoryRecordFactory extends RecordFactory { diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/PasswordsServerSyncStage.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/PasswordsServerSyncStage.java index c781ce2cc5b2..4b7147488ac1 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/PasswordsServerSyncStage.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/stage/PasswordsServerSyncStage.java @@ -4,6 +4,8 @@ package org.mozilla.gecko.sync.stage; +import org.mozilla.gecko.sync.middleware.BufferingMiddlewareRepository; +import org.mozilla.gecko.sync.middleware.storage.MemoryBufferStorage; import org.mozilla.gecko.sync.repositories.RecordFactory; import org.mozilla.gecko.sync.repositories.Repository; import org.mozilla.gecko.sync.repositories.android.PasswordsRepositorySession; @@ -28,7 +30,11 @@ public class PasswordsServerSyncStage extends ServerSyncStage { @Override protected Repository getLocalRepository() { - return new PasswordsRepositorySession.PasswordsRepository(); + return new BufferingMiddlewareRepository( + session.getSyncDeadline(), + new MemoryBufferStorage(), + new PasswordsRepositorySession.PasswordsRepository() + ); } @Override diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/synchronizer/RecordsChannel.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/synchronizer/RecordsChannel.java index 0a82cfb0c074..93c7382d8551 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/synchronizer/RecordsChannel.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/synchronizer/RecordsChannel.java @@ -170,7 +170,16 @@ public class RecordsChannel implements this.consumer = new ConcurrentRecordConsumer(this); ThreadPool.run(this.consumer); waitingForQueueDone = true; - source.fetchSince(source.getLastSyncTimestamp(), this); + + // Fetch all records that were modified since our previous flow. If our previous flow succeeded, + // we will use source's last-sync timestamp. If our previous flow didn't complete, resume it, + // starting from sink's high water mark timestamp. + // If there was no previous flow (first sync, or data was cleared...), fetch everything. + // Resuming a flow is supported for buffered RepositorySessions. We degrade gracefully otherwise. + final long highWaterMark = sink.getHighWaterMarkTimestamp(); + final long lastSync = source.getLastSyncTimestamp(); + final long sinceTimestamp = Math.max(highWaterMark, lastSync); + source.fetchSince(sinceTimestamp, this); } /**