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:
parent
9ffdc6a9a0
commit
04e50459d4
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user