From: Timo Sirainen Date: Thu, 24 Oct 2019 07:56:06 +0000 (+0300) Subject: lib-storage: Create vsize records already when building the initial vsize header X-Git-Tag: 2.3.9~90 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52e5b25bc7753b4689c1fa52b1bf609ee807eea6;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Create vsize records already when building the initial vsize header This way they aren't first added to cache as size.virtuals, but immediately added as vsize extension records. --- diff --git a/src/lib-storage/index/index-mailbox-size.c b/src/lib-storage/index/index-mailbox-size.c index 8afdeaf900..6a8259baa3 100644 --- a/src/lib-storage/index/index-mailbox-size.c +++ b/src/lib-storage/index/index-mailbox-size.c @@ -166,10 +166,21 @@ bool index_mailbox_vsize_want_updates(struct mailbox_vsize_update *update) } static void -index_mailbox_vsize_update_write(struct mailbox_vsize_update *update) +index_mailbox_vsize_update_write_to_index(struct mailbox_vsize_update *update) { struct mail_index_transaction *trans; + trans = mail_index_transaction_begin(update->view, + MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); + mail_index_update_header_ext(trans, update->box->vsize_hdr_ext_id, + 0, &update->vsize_hdr, + sizeof(update->vsize_hdr)); + (void)mail_index_transaction_commit(&trans); +} + +static void +index_mailbox_vsize_update_write(struct mailbox_vsize_update *update) +{ if (update->written) return; update->written = TRUE; @@ -180,12 +191,7 @@ index_mailbox_vsize_update_write(struct mailbox_vsize_update *update) /* no changes */ return; } - trans = mail_index_transaction_begin(update->view, - MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); - mail_index_update_header_ext(trans, update->box->vsize_hdr_ext_id, - 0, &update->vsize_hdr, - sizeof(update->vsize_hdr)); - (void)mail_index_transaction_commit(&trans); + index_mailbox_vsize_update_write_to_index(update); } static void index_mailbox_vsize_notify_indexer(struct mailbox *box) @@ -267,7 +273,7 @@ index_mailbox_vsize_hdr_add_missing(struct mailbox_vsize_update *update, struct mail_search_args *search_args; struct mailbox_status status; struct mail *mail; - unsigned int mails_left; + unsigned int idx, mails_left; uint32_t seq1, seq2; uoff_t vsize; int ret = 0; @@ -294,6 +300,14 @@ index_mailbox_vsize_hdr_add_missing(struct mailbox_vsize_update *update, } mail_search_build_add_seqset(search_args, seq1, seq2); + if (!mail_index_map_get_ext_idx(update->box->view->map, + update->box->vsize_hdr_ext_id, &idx)) { + /* vsize header doesn't exist yet. Create it here early so + that vsize mail records get created (instead of adding + size.virtuals to cache). */ + index_mailbox_vsize_update_write_to_index(update); + } + trans = mailbox_transaction_begin(update->box, 0, "vsize update"); search_ctx = mailbox_search_init(trans, search_args, NULL, MAIL_FETCH_VIRTUAL_SIZE, NULL);