From: Timo Sirainen Date: Wed, 6 Oct 2010 17:20:26 +0000 (+0100) Subject: lib-index: Always update index map while committing a transaction. X-Git-Tag: 2.0.6~85 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5e88e4624aa6d482b5b195acd2f4e02aeb385f20;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Always update index map while committing a transaction. The previous code was doing this only in some situations, which was probably enough, except maybe in some special cases. The log file was also read until EOF always anyway, so the only thing this was saving was some CPU. With the new behavior the committing stage should be more reliable, and also makes it easier to do changes without accidentally breaking it. --- diff --git a/src/lib-index/mail-index-transaction-finish.c b/src/lib-index/mail-index-transaction-finish.c index 0d6ab1e2d9..6af99568f7 100644 --- a/src/lib-index/mail-index-transaction-finish.c +++ b/src/lib-index/mail-index-transaction-finish.c @@ -316,7 +316,7 @@ mail_index_transaction_convert_to_uids(struct mail_index_transaction *t) mail_index_convert_to_uid_ranges(t, &t->keyword_resets); } -int mail_index_transaction_finish(struct mail_index_transaction *t) +void mail_index_transaction_finish(struct mail_index_transaction *t) { if (array_is_created(&t->appends)) { mail_index_update_day_headers(t); @@ -324,11 +324,6 @@ int mail_index_transaction_finish(struct mail_index_transaction *t) } mail_index_transaction_finish_flag_updates(t); - if (array_is_created(&t->ext_reset_atomic) || t->max_modseq != 0) { - if (mail_index_map(t->view->index, - MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) - return -1; - } if (array_is_created(&t->ext_reset_atomic)) transaction_update_atomic_reset_ids(t); if (t->max_modseq != 0) @@ -340,5 +335,4 @@ int mail_index_transaction_finish(struct mail_index_transaction *t) /* and kind of ugly way to update highest modseq */ if (t->min_highest_modseq != 0) mail_index_update_modseq(t, 0, t->min_highest_modseq); - return 0; } diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index c8a89e5583..1004dfcbcd 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -126,7 +126,7 @@ bool mail_index_cancel_flag_updates(struct mail_index_transaction *t, bool mail_index_cancel_keyword_updates(struct mail_index_transaction *t, uint32_t seq); -int mail_index_transaction_finish(struct mail_index_transaction *t); +void mail_index_transaction_finish(struct mail_index_transaction *t); void mail_index_transaction_export(struct mail_index_transaction *t, struct mail_transaction_log_append_ctx *append_ctx); int mail_transaction_expunge_guid_cmp(const struct mail_transaction_expunge_guid *e1, diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index 81fe7a7f85..95ed239f1f 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -109,12 +109,10 @@ mail_transaction_log_file_refresh(struct mail_index_transaction *t, } file = t->view->index->log->head; - if (!t->view->index->log_sync_locked) { - /* update sync_offset */ - if (mail_transaction_log_file_map(file, file->sync_offset, - (uoff_t)-1) <= 0) - return -1; - } + /* make sure we have everything mapped */ + if (mail_index_map(t->view->index, MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) + return -1; + i_assert(file->sync_offset >= file->buffer_offset); ctx->new_highest_modseq = file->sync_highest_modseq; return 1; @@ -135,9 +133,8 @@ mail_index_transaction_commit_real(struct mail_index_transaction *t, return -1; ret = mail_transaction_log_file_refresh(t, ctx); if (ret > 0) { - ret = mail_index_transaction_finish(t); - if (ret == 0) - mail_index_transaction_export(t, ctx); + mail_index_transaction_finish(t); + mail_index_transaction_export(t, ctx); } mail_transaction_log_get_head(log, &log_seq1, &log_offset1);