summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2014-02-12 12:37:31 -0400
committerKali Kaneko <kali@leap.se>2014-02-17 11:39:49 -0400
commit54114126d0b8e16784b67ee972e549e5c152c9d0 (patch)
tree33030a7156fef3c658a6eccc79618c055e948a63
parentf5fe0fdefa61f4989735800980dc2a3241c2fdf3 (diff)
purge empty fdocs on select
-rw-r--r--src/leap/mail/imap/mailbox.py3
-rw-r--r--src/leap/mail/imap/memorystore.py21
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,