]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Expunging messages didn't update mailbox_status.virtual_size
authorTimo Sirainen <tss@iki.fi>
Thu, 13 May 2010 07:25:41 +0000 (09:25 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 13 May 2010 07:25:41 +0000 (09:25 +0200)
--HG--
branch : HEAD

src/doveadm/doveadm-dump-index.c
src/lib-storage/index/index-status.c
src/lib-storage/index/index-storage.h

index 5013e9aa56661d607b9e03bbd76841ea8c2cfe7a..f778f30a37b5cb48a90b7cdb0e3d882a20944e84 100644 (file)
@@ -18,6 +18,7 @@
 struct index_vsize_header {
        uint64_t vsize;
        uint32_t highest_uid;
+       uint32_t message_count;
 };
 struct maildir_index_header {
        uint32_t new_check_time, new_mtime, new_mtime_nsecs;
@@ -113,8 +114,9 @@ static void dump_extension_header(struct mail_index *index,
                const struct index_vsize_header *hdr = data;
 
                printf("header\n");
-               printf(" - highest uid = %u\n", hdr->highest_uid);
-               printf(" - vsize ..... = %llu\n", (unsigned long long)hdr->vsize);
+               printf(" - highest uid . = %u\n", hdr->highest_uid);
+               printf(" - message count = %u\n", hdr->message_count);
+               printf(" - vsize ....... = %llu\n", (unsigned long long)hdr->vsize);
        } else if (strcmp(ext->name, "maildir") == 0) {
                const struct maildir_index_header *hdr = data;
 
index 74b67c55b434bf9386a0dabbcb4c5193dde3cb8d..df593d4fc1dd5f469d54254b7b3550fc71ed5646 100644 (file)
@@ -46,15 +46,28 @@ index_storage_virtual_size_add_new(struct mailbox *box,
        int ret = 0;
 
        hdr = mail_index_get_header(box->view);
-       if (!mail_index_lookup_seq_range(box->view, vsize_hdr->highest_uid+1,
-                                        hdr->next_uid, &seq1, &seq2)) {
-               /* the last messages are already expunged,
-                  don't bother updating cache */
-               return;
+       if (vsize_hdr->highest_uid == 0)
+               seq2 = 0;
+       else if (!mail_index_lookup_seq_range(box->view, 1,
+                                             vsize_hdr->highest_uid,
+                                             &seq1, &seq2))
+               seq2 = 0;
+
+       if (vsize_hdr->message_count != seq2) {
+               if (vsize_hdr->message_count < seq2) {
+                       mail_storage_set_critical(box->storage,
+                               "vsize-hdr has invalid message-count (%u < %u)",
+                               vsize_hdr->message_count, seq2);
+               } else {
+                       /* some messages have been expunged, rescan */
+               }
+               memset(vsize_hdr, 0, sizeof(*vsize_hdr));
+               seq2 = 0;
        }
 
        search_args = mail_search_build_init();
-       mail_search_build_add_seqset(search_args, seq1, seq2);
+       mail_search_build_add_seqset(search_args, seq2 + 1,
+                                    hdr->messages_count);
 
        trans = mailbox_transaction_begin(box, 0);
        search_ctx = mailbox_search_init(trans, search_args, NULL);
@@ -66,6 +79,7 @@ index_storage_virtual_size_add_new(struct mailbox *box,
                }
                vsize_hdr->vsize += vsize;
                vsize_hdr->highest_uid = mail->uid;
+               vsize_hdr->message_count++;
        }
        mail_free(&mail);
        if (mailbox_search_deinit(&search_ctx) < 0)
@@ -105,7 +119,8 @@ index_storage_get_status_virtual_size(struct mailbox *box,
                memset(&vsize_hdr, 0, sizeof(vsize_hdr));
        }
 
-       if (vsize_hdr.highest_uid + 1 == status_r->uidnext) {
+       if (vsize_hdr.highest_uid + 1 == status_r->uidnext &&
+           vsize_hdr.message_count == status_r->messages) {
                /* up to date */
                status_r->virtual_size = vsize_hdr.vsize;
                return;
index 95a1992fe68e029624845a2ff5ac6b30d0e13233..189414767d73c0e5ee62d3b0a8906bc430f9da0c 100644 (file)
@@ -30,6 +30,7 @@ struct index_transaction_context {
 struct index_vsize_header {
        uint64_t vsize;
        uint32_t highest_uid;
+       uint32_t message_count;
 };
 
 struct index_mailbox_context {