]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Preserve messages' vsize record when rebuilding index
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 8 Sep 2017 09:20:21 +0000 (12:20 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 8 Sep 2017 11:24:38 +0000 (14:24 +0300)
Since vsize is often used by quota, losing this can be very expensive.
If the vsize is wrong, it gets fixed automatically when fetching the
message body.

src/lib-storage/index/index-rebuild.c

index 6533f061d79b8a50e70bd060a056db4f7cfb6bda..ef234eab20bf25149caa97d6fd7670b5b6e6c267 100644 (file)
@@ -9,6 +9,22 @@
 #include "index-storage.h"
 #include "index-rebuild.h"
 
+static void
+index_index_copy_vsize(struct index_rebuild_context *ctx,
+                      struct mail_index_view *view,
+                      uint32_t old_seq, uint32_t new_seq)
+{
+       const void *data;
+       bool expunged;
+
+       mail_index_lookup_ext(view, old_seq, ctx->box->mail_vsize_ext_id,
+                             &data, &expunged);
+       if (data != NULL && !expunged) {
+               mail_index_update_ext(ctx->trans, new_seq,
+                                     ctx->box->mail_vsize_ext_id, data, NULL);
+       }
+}
+
 static void
 index_index_copy_cache(struct index_rebuild_context *ctx,
                       struct mail_index_view *view,
@@ -71,6 +87,7 @@ index_index_copy_from_old(struct index_rebuild_context *ctx,
        modseq = mail_index_modseq_lookup(view, old_seq);
        mail_index_update_modseq(ctx->trans, new_seq, modseq);
 
+       index_index_copy_vsize(ctx, view, old_seq, new_seq);
        index_index_copy_cache(ctx, view, old_seq, new_seq);
 }