]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mailbox_update(): Updating uid_validity requires also reseting index.
authorTimo Sirainen <tss@iki.fi>
Mon, 15 Feb 2010 04:07:02 +0000 (06:07 +0200)
committerTimo Sirainen <tss@iki.fi>
Mon, 15 Feb 2010 04:07:02 +0000 (06:07 +0200)
--HG--
branch : HEAD

src/lib-storage/index/dbox-multi/mdbox-storage.c
src/lib-storage/index/dbox-single/sdbox-storage.c
src/lib-storage/index/index-storage.c

index 34afc89bef58a61f02e3719dfb1f9c2d3acd94a9..67d2f98eb48f08d39b47dbfc4fc4faf1029b00ee 100644 (file)
@@ -180,7 +180,6 @@ static int mdbox_write_index_header(struct mailbox *box,
 
        hdr = mail_index_get_header(box->view);
        trans = mail_index_transaction_begin(box->view, 0);
-       mdbox_update_header(mbox, trans, update);
 
        uid_validity = hdr->uid_validity;
        if (update != NULL && update->uid_validity != 0)
@@ -191,6 +190,10 @@ static int mdbox_write_index_header(struct mailbox *box,
        }
 
        if (hdr->uid_validity != uid_validity) {
+               if (hdr->uid_validity != 0) {
+                       /* UIDVALIDITY change requires index to be reset */
+                       mail_index_reset(trans);
+               }
                mail_index_update_header(trans,
                        offsetof(struct mail_index_header, uid_validity),
                        &uid_validity, sizeof(uid_validity), TRUE);
@@ -208,6 +211,7 @@ static int mdbox_write_index_header(struct mailbox *box,
                                                 update->min_highest_modseq);
        }
 
+       mdbox_update_header(mbox, trans, update);
        if (mail_index_transaction_commit(&trans) < 0) {
                mail_storage_set_index_error(box);
                return -1;
index 7e90d505263a7a0bcaad6c6b4dc1b1bc638aca74..42502b73cfa103cf0e5b9d74bb1729353748f5bd 100644 (file)
@@ -117,7 +117,6 @@ static int sdbox_write_index_header(struct mailbox *box,
 
        hdr = mail_index_get_header(box->view);
        trans = mail_index_transaction_begin(box->view, 0);
-       sdbox_update_header(mbox, trans, update);
 
        if (update != NULL && update->uid_validity != 0)
                uid_validity = update->uid_validity;
@@ -127,6 +126,10 @@ static int sdbox_write_index_header(struct mailbox *box,
        }
 
        if (hdr->uid_validity != uid_validity) {
+               if (hdr->uid_validity != 0) {
+                       /* UIDVALIDITY change requires index to be reset */
+                       mail_index_reset(trans);
+               }
                mail_index_update_header(trans,
                        offsetof(struct mail_index_header, uid_validity),
                        &uid_validity, sizeof(uid_validity), TRUE);
@@ -144,6 +147,7 @@ static int sdbox_write_index_header(struct mailbox *box,
                                                 update->min_highest_modseq);
        }
 
+       sdbox_update_header(mbox, trans, update);
        if (mail_index_transaction_commit(&trans) < 0) {
                mail_storage_set_internal_error(box->storage);
                mail_index_reset_error(box->index);
index 3245ac64f4ba017cee9e016854a673a72e99429d..b5d1b6a9449c8daba10162baee5028c8b1580aa2 100644 (file)
@@ -408,6 +408,10 @@ int index_storage_mailbox_update(struct mailbox *box,
            hdr->uid_validity != update->uid_validity) {
                uint32_t uid_validity = update->uid_validity;
 
+               if (hdr->uid_validity != 0) {
+                       /* UIDVALIDITY change requires index to be reset */
+                       mail_index_reset(trans);
+               }
                mail_index_update_header(trans,
                        offsetof(struct mail_index_header, uid_validity),
                        &uid_validity, sizeof(uid_validity), TRUE);