From d3fb189a72f9536c4bfb18ed24bde8ce6cf0b419 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Tue, 27 Jul 2010 22:46:04 +0900 Subject: [PATCH] improved lastSync/modified handling - never bump deck mod while syncing - set lastSync to current time, not deck modified time - don't update lastSync until the final part of the sync - lower clock skew allowance to ~5 minutes - bump full sync threshold to 1000 modified items --- anki/sync.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/anki/sync.py b/anki/sync.py index 34966814d..8abddf000 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -120,8 +120,11 @@ class SyncTools(object): if self.localTime == self.remoteTime: return False l = self._lastSync(); r = self.server._lastSync() + # Set lastSync to the lower of the two sides, minus some leeway for + # clock skew. Near the end of the sync we'll bump this to the new + # time. if l != r: - self.deck.lastSync = min(l, r) - 600 + self.deck.lastSync = min(l, r) - 350 else: self.deck.lastSync = l return True @@ -143,11 +146,11 @@ class SyncTools(object): self.deleteObjsFromKey(diff[3], key) # handle the remainder if self.localTime > self.remoteTime: - payload['deck'] = self.bundleDeck() payload['stats'] = self.bundleStats() payload['history'] = self.bundleHistory() payload['sources'] = self.bundleSources() - self.deck.lastSync = self.deck.modified + # finally, set new lastSync and bundle the deck info + payload['deck'] = self.bundleDeck() return payload def applyPayload(self, payload): @@ -164,11 +167,11 @@ class SyncTools(object): self.deleteObjsFromKey(payload['deleted-' + key], key) # send back deck-related stuff if it wasn't sent to us if not 'deck' in payload: - reply['deck'] = self.bundleDeck() reply['stats'] = self.bundleStats() reply['history'] = self.bundleHistory() reply['sources'] = self.bundleSources() - self.deck.lastSync = self.deck.modified + # finally, set new lastSync and bundle the deck info + reply['deck'] = self.bundleDeck() else: self.updateDeck(payload['deck']) self.updateStats(payload['stats']) @@ -602,6 +605,7 @@ values ########################################################################## def bundleDeck(self): + self.deck.lastSync = time.time() d = self.dictFromObj(self.deck) del d['Session'] del d['engine'] @@ -625,7 +629,6 @@ insert or replace into deckVars (key, value) values (:k, :v)""", k=k, v=v) del deck['meta'] self.applyDict(self.deck, deck) - self.deck.lastSync = self.deck.modified self.deck.updateDynamicIndices() def bundleStats(self): @@ -914,11 +917,11 @@ and cards.id in %s""" % ids2str([c[0] for c in cards]))) return True for sum in sums: for l in sum.values(): - if len(l) > 500: + if len(l) > 1000: return True if self.deck.s.scalar( "select count() from reviewHistory where time > :ls", - ls=self.deck.lastSync) > 500: + ls=self.deck.lastSync) > 1000: return True lastDay = date.fromtimestamp(max(0, self.deck.lastSync - 60*60*24)) if self.deck.s.scalar( @@ -929,8 +932,7 @@ and cards.id in %s""" % ids2str([c[0] for c in cards]))) def prepareFullSync(self): t = time.time() - self.deck.flushMod() - self.deck.lastSync = self.deck.modified + self.deck.lastSync = time.time() self.deck.s.commit() self.deck.close() fields = {