[PATCH v2] IMAP: reduce quickchanged() checks

Nicolas Sebrecht nicolas.s-dev at laposte.net
Fri Apr 15 19:04:35 BST 2011


From: Sebastian Spaeth <Sebastian at SSpaeth.de>

For each folder we were making a second IMAP request asking for the
latest UID and compared that with the highest UID in our
statusfolder. This catched the case that 1 mail has been deleted by
someone else and another one has arrived since we checked, so that the
total number of mails appears to not have changed.

We don't capture anymore this case in the quickchanged() case.

It improves my performance from 8 to about 7.5 seconds per check (with lots of
variation) and we would benefit even more in the IMAP<->IMAP case as we do one
additional IMAP lookup per folder on each side then.

Do cleanups on whitespaces while in this file.

Signed-off-by: Sebastian Spaeth <Sebastian at SSpaeth.de>
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev at laposte.net>
---
 offlineimap/folder/IMAP.py |   38 ++++++++++----------------------------
 1 files changed, 10 insertions(+), 28 deletions(-)

diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py
index f2d0dda..046c792 100644
--- a/offlineimap/folder/IMAP.py
+++ b/offlineimap/folder/IMAP.py
@@ -74,7 +74,7 @@ class IMAPFolder(BaseFolder):
             return long(imapobj._get_untagged_response('UIDVALIDITY', True)[0])
         finally:
             self.imapserver.releaseconnection(imapobj)
-    
+
     def quickchanged(self, statusfolder):
         # An IMAP folder has definitely changed if the number of
         # messages or the UID of the last message have changed.  Otherwise
@@ -97,26 +97,8 @@ class IMAPFolder(BaseFolder):
             if maxmsgid != statusfolder.getmessagecount():
                 return True
 
-            if maxmsgid < 1:
-                # No messages; return
-                return False
-
-            # Now, get the UID for the last message.
-            response = imapobj.fetch('%d' % maxmsgid, '(UID)')[1]
         finally:
             self.imapserver.releaseconnection(imapobj)
-
-        # Discard the message number.
-        messagestr = response[0].split(' ', 1)[1]
-        options = imaputil.flags2hash(messagestr)
-        if not options.has_key('UID'):
-            return True
-        uid = long(options['UID'])
-        saveduids = statusfolder.getmessageuidlist()
-        saveduids.sort()
-        if uid != saveduids[-1]:
-            return True
-
         return False
 
     # TODO: Make this so that it can define a date that would be the oldest messages etc.
@@ -216,13 +198,13 @@ class IMAPFolder(BaseFolder):
             self.ui.debug('imap', 'Returned object from fetching %d: %s' % \
                      (uid, str(initialresult)))
             return initialresult[1][0][1].replace("\r\n", "\n")
-                
+
         finally:
             self.imapserver.releaseconnection(imapobj)
 
     def getmessagetime(self, uid):
         return self.messagelist[uid]['time']
-    
+
     def getmessageflags(self, uid):
         return self.messagelist[uid]['flags']
 
@@ -416,16 +398,16 @@ class IMAPFolder(BaseFolder):
             # get the date of the message file, so we can pass it to the server.
             date = self.getmessageinternaldate(content, rtime)
             self.ui.debug('imap', 'savemessage: using date %s' % date)
-    
+
             content = re.sub("(?<!\r)\n", "\r\n", content)
-    
+
             if not use_uidplus:
                 # insert a random unique header that we can fetch later
                 (headername, headervalue) = self.generate_randomheader(content)
                 self.ui.debug('imap', 'savemessage: new headers are: %s: %s' % \
                              (headername, headervalue))
                 content = self.savemessage_addheader(content, headername,
-                                                     headervalue)    
+                                                     headervalue)
             self.ui.debug('imap', 'savemessage: content is: ' + repr(content))
 
             # TODO: - append could raise a ValueError if the date is not in
@@ -516,7 +498,7 @@ class IMAPFolder(BaseFolder):
             self.processmessagesflags(operation, uidlist[:100], flags)
             self.processmessagesflags(operation, uidlist[100:], flags)
             return
-        
+
         imapobj = self.imapserver.acquireconnection()
         try:
             try:
@@ -573,7 +555,7 @@ class IMAPFolder(BaseFolder):
         # Weed out ones not in self.messagelist
         uidlist = [uid for uid in uidlist if uid in self.messagelist]
         if not len(uidlist):
-            return        
+            return
 
         self.addmessagesflags_noconvert(uidlist, ['T'])
         imapobj = self.imapserver.acquireconnection()
@@ -589,5 +571,5 @@ class IMAPFolder(BaseFolder):
             self.imapserver.releaseconnection(imapobj)
         for uid in uidlist:
             del self.messagelist[uid]
-        
-        
+
+
-- 
1.7.5.rc1.228.g86d60b





More information about the OfflineIMAP-project mailing list