do GC on autosave

- ensures we're not called as part of the db progress callback
- minimises the chance of data loss if a gc causes a crash
This commit is contained in:
Damien Elmes 2017-01-13 16:20:39 +10:00
parent 82352800a8
commit a05ebdbefb
2 changed files with 9 additions and 9 deletions

View file

@ -134,9 +134,10 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""",
self._lastSave = time.time() self._lastSave = time.time()
def autosave(self): def autosave(self):
"Save if 5 minutes has passed since last save." "Save if 5 minutes has passed since last save. True if saved."
if time.time() - self._lastSave > 300: if time.time() - self._lastSave > 300:
self.save() self.save()
return True
def lock(self): def lock(self):
# make sure we don't accidentally bump mod time # make sure we don't accidentally bump mod time

View file

@ -69,7 +69,7 @@ class AnkiQt(QMainWindow):
def setupUI(self): def setupUI(self):
self.col = None self.col = None
self.setupCrashLog() self.setupCrashLog()
self.setupGC() self.disableGC()
self.setupAppMsg() self.setupAppMsg()
self.setupKeys() self.setupKeys()
self.setupThreads() self.setupThreads()
@ -709,8 +709,10 @@ title="%s" %s>%s</button>''' % (
self.maybeEnableUndo() self.maybeEnableUndo()
def autosave(self): def autosave(self):
self.col.autosave() saved = self.col.autosave()
self.maybeEnableUndo() self.maybeEnableUndo()
if saved:
self.doGC()
# Other menu operations # Other menu operations
########################################################################## ##########################################################################
@ -1172,15 +1174,12 @@ Please ensure a profile is open and Anki is not busy, then try again."""),
def gcWindow(self, obj): def gcWindow(self, obj):
obj.deleteLater() obj.deleteLater()
def setupGC(self): def disableGC(self):
gc.collect() gc.collect()
gc.disable() gc.disable()
#gc.set_debug(gc.DEBUG_SAVEALL)
self.gcTimer = QTimer(self)
self.gcTimer.timeout.connect(self.runGC)
self.gcTimer.start(60*1000)
def runGC(self): def doGC(self):
assert not self.progress.inDB
gc.collect() gc.collect()
# Crash log # Crash log