]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: Avoid opening cache file when getting physical message size.
authorTimo Sirainen <tss@iki.fi>
Wed, 29 Sep 2010 17:49:34 +0000 (18:49 +0100)
committerTimo Sirainen <tss@iki.fi>
Wed, 29 Sep 2010 17:49:34 +0000 (18:49 +0100)
src/lib-storage/index/maildir/maildir-mail.c

index 9a125ea81070b9fe23703833c5336f753d482d20..3c17d20aa857eff1f3c67330db598461e0e11c76 100644 (file)
@@ -387,8 +387,8 @@ static int maildir_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
                        maildir_handle_size_caching(mail, TRUE, TRUE);
                        return 0;
                }
-
-               if (maildir_quick_size_lookup(mail, TRUE, &data->virtual_size) < 0)
+               if (maildir_quick_size_lookup(mail, TRUE,
+                                             &data->virtual_size) < 0)
                        return -1;
        }
        if (data->virtual_size != (uoff_t)-1) {
@@ -417,14 +417,24 @@ static int maildir_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
        const char *path;
        int ret;
 
-       if (index_mail_get_physical_size(_mail, size_r) == 0) {
-               i_assert(mail->data.physical_size != (uoff_t)-1);
-               maildir_handle_size_caching(mail, TRUE, FALSE);
-               return 0;
+       if (maildir_uidlist_is_read(mbox->uidlist) ||
+           (_mail->box->flags & MAILBOX_FLAG_POP3_SESSION) != 0) {
+               /* try to get the size from uidlist (see virtual size above) */
+               if (maildir_quick_size_lookup(mail, FALSE,
+                                             &data->physical_size) < 0)
+                       return -1;
        }
 
-       if (maildir_quick_size_lookup(mail, FALSE, &data->physical_size) < 0)
-               return -1;
+       if (data->physical_size == (uoff_t)-1) {
+               if (index_mail_get_physical_size(_mail, size_r) == 0) {
+                       i_assert(mail->data.physical_size != (uoff_t)-1);
+                       maildir_handle_size_caching(mail, TRUE, FALSE);
+                       return 0;
+               }
+               if (maildir_quick_size_lookup(mail, FALSE,
+                                             &data->physical_size) < 0)
+                       return -1;
+       }
        if (data->physical_size != (uoff_t)-1) {
                data->dont_cache_fetch_fields |= MAIL_FETCH_PHYSICAL_SIZE;
                *size_r = data->physical_size;