1
0
mirror of https://github.com/etesync/android synced 2025-01-10 15:51:08 +00:00

Syncmanager: fix an issue causing local cache corruption when failing to push.

Due to a logical issue in the code, new journal entries were added to the
local cache after they've been created locally, and not after they've
been added to the server. Under normal circumstances this doesn't pose a
problem, however when pushing to the server fails, the local cache
would have the new entries as if they were saved on the server, causing
the app to think there has been a corruption on the server (as entries
should never be removed from the server) and halt the sync.

This change makes it so the entries are saved to the local cache only
after they've been saved on the server.

Note: this was not spotted until now because it relies on an unfortunate
specific sequence of events. It only happens when creating journal
entries, and when trying to sync them successfully connecting to the
server to fetch the journal list and the content of the journal itself,
and only failing when coming to push the journals.

Many thanks to "359" (this user's preferred alias) for reporting the
issue that resulted in this fix.
This commit is contained in:
Tom Hacohen 2017-05-15 15:43:12 +01:00
parent 9ffdc6a9a0
commit 04e50459d4

View File

@ -271,7 +271,6 @@ abstract public class SyncManager {
App.log.info("Processing (" + String.valueOf(i) + "/" + strTotal + ") " + entry.toString());
SyncEntry cEntry = SyncEntry.fromJournalEntry(crypto, entry);
persistSyncEntry(entry.getUid(), cEntry);
if (cEntry.isAction(SyncEntry.Actions.DELETE)) {
continue;
}
@ -335,6 +334,11 @@ abstract public class SyncManager {
if (!localEntries.isEmpty()) {
for (List<JournalEntryManager.Entry> entries : ListUtils.partition(localEntries, MAX_PUSH)) {
journal.create(entries, remoteCTag);
// Persist the entries after they've been pushed
for (JournalEntryManager.Entry entry : entries) {
SyncEntry cEntry = SyncEntry.fromJournalEntry(crypto, entry);
persistSyncEntry(entry.getUid(), cEntry);
}
remoteCTag = entries.get(entries.size() - 1).getUid();
pushed += entries.size();
}