]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: Avoid refreshing uidlist unnecessarily.
authorTimo Sirainen <tss@iki.fi>
Mon, 5 Sep 2011 09:46:49 +0000 (12:46 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 5 Sep 2011 09:46:49 +0000 (12:46 +0300)
Even if the uidlist itself wasn't read, it was still stat()ed.

src/lib-storage/index/maildir/maildir-storage.h
src/lib-storage/index/maildir/maildir-sync.c

index dd50e22d4dd0b64c483fdfed2a879b59ff1b84a8..817f7a0fe4d8dcb652f601aa75cd78116b472ee0 100644 (file)
@@ -93,6 +93,7 @@ struct maildir_mailbox {
        unsigned int private_flags_mask_set:1;
        unsigned int backend_readonly:1;
        unsigned int backend_readonly_set:1;
+       unsigned int sync_uidlist_refreshed:1;
 };
 
 extern struct mail_vfuncs maildir_mail_vfuncs;
index c055d766bef75254d6822893d2c15520a7d2e4e9..0b0f3a14d89fe00b01b77cb3af668eff7907af42 100644 (file)
@@ -942,26 +942,27 @@ int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid,
        int ret;
 
        ret = maildir_uidlist_lookup(mbox->uidlist, uid, flags_r, fname_r);
-       if (ret <= 0) {
-               if (ret < 0)
-                       return -1;
-               if (maildir_uidlist_is_open(mbox->uidlist)) {
-                       /* refresh uidlist and check again in case it was added
-                          after the last mailbox sync */
-                       if (maildir_uidlist_refresh(mbox->uidlist) < 0)
-                               return -1;
-               } else {
-                       /* the uidlist doesn't exist. */
-                       if (maildir_storage_sync_force(mbox, uid) < 0)
-                               return -1;
+       if (ret != 0)
+               return ret;
+
+       if (maildir_uidlist_is_open(mbox->uidlist)) {
+               /* refresh uidlist and check again in case it was added
+                  after the last mailbox sync */
+               if (mbox->sync_uidlist_refreshed) {
+                       /* we've already refreshed it, don't bother again */
+                       return ret;
                }
-
-               /* try again */
-               ret = maildir_uidlist_lookup(mbox->uidlist, uid,
-                                            flags_r, fname_r);
+               mbox->sync_uidlist_refreshed = TRUE;
+               if (maildir_uidlist_refresh(mbox->uidlist) < 0)
+                       return -1;
+       } else {
+               /* the uidlist doesn't exist. */
+               if (maildir_storage_sync_force(mbox, uid) < 0)
+                       return -1;
        }
 
-       return ret;
+       /* try again */
+       return maildir_uidlist_lookup(mbox->uidlist, uid, flags_r, fname_r);
 }
 
 int maildir_storage_sync_force(struct maildir_mailbox *mbox, uint32_t uid)
@@ -1046,6 +1047,7 @@ maildir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
                maildir_uidlist_set_all_nonsynced(mbox->uidlist);
        }
        mbox->synced = TRUE;
+       mbox->sync_uidlist_refreshed = FALSE;
        return index_mailbox_sync_init(box, flags, ret < 0);
 }