diff options
author | Kali Kaneko <kali@leap.se> | 2014-02-12 12:37:31 -0400 |
---|---|---|
committer | Kali Kaneko <kali@leap.se> | 2014-02-17 11:39:49 -0400 |
commit | 54114126d0b8e16784b67ee972e549e5c152c9d0 (patch) | |
tree | 33030a7156fef3c658a6eccc79618c055e948a63 /src/leap/mail/imap | |
parent | f5fe0fdefa61f4989735800980dc2a3241c2fdf3 (diff) |
purge empty fdocs on select
Diffstat (limited to 'src/leap/mail/imap')
-rw-r--r-- | src/leap/mail/imap/mailbox.py | 3 | ||||
-rw-r--r-- | src/leap/mail/imap/memorystore.py | 21 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/leap/mail/imap/mailbox.py b/src/leap/mail/imap/mailbox.py index 7083316..087780f 100644 --- a/src/leap/mail/imap/mailbox.py +++ b/src/leap/mail/imap/mailbox.py @@ -157,6 +157,9 @@ class SoledadMailbox(WithMsgFields, MBoxParser): from twisted.internet import reactor self.reactor = reactor + # purge memstore from empty fdocs. + self._memstore.purge_fdoc_store(mbox) + @property def listeners(self): """ diff --git a/src/leap/mail/imap/memorystore.py b/src/leap/mail/imap/memorystore.py index 423b891..4aaee75 100644 --- a/src/leap/mail/imap/memorystore.py +++ b/src/leap/mail/imap/memorystore.py @@ -362,6 +362,27 @@ class MemoryStore(object): self._sizes[key] = size.get_size(self._fdoc_store[key]) # TODO add hdoc and cdocs sizes too + def purge_fdoc_store(self, mbox): + """ + Purge the empty documents from a fdoc store. + Called during initialization of the SoledadMailbox + + :param mbox: the mailbox + :type mbox: str or unicode + """ + # XXX This is really a workaround until I find the conditions + # that are making the empty items remain there. + # This happens, for instance, after running several times + # the regression test, that issues a store deleted + expunge + select + # The items are being correclty deleted, but in succesive appends + # the empty items with previously deleted uids reappear as empty + # documents. I suspect it's a timing condition with a previously + # evaluated sequence being used after the items has been removed. + + for uid, value in self._fdoc_store[mbox].items(): + if empty(value): + del self._fdoc_store[mbox][uid] + def get_docid_for_fdoc(self, mbox, uid): """ Return Soledad document id for the flags-doc for a given mbox and uid, |