dovecot-2.2: lib-index: tail_offset wasn't updated as often as i...

dovecot at dovecot.org dovecot at dovecot.org
Tue Oct 20 15:43:46 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/a26d8492614e
changeset: 19323:a26d8492614e
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Oct 20 18:43:32 2015 +0300
description:
lib-index: tail_offset wasn't updated as often as it should have been.
ctx->last_tail_offset was being increased for every non-external transaction
and at the end we checked if head was larger than it. This logic didn't
really make any sense, since non-external transactions specifically were
supposed to update the tail_offset.

diffstat:

 src/lib-index/mail-index-sync.c |  30 ++++++++++--------------------
 1 files changed, 10 insertions(+), 20 deletions(-)

diffs (75 lines):

diff -r 89323ed80676 -r a26d8492614e src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c	Tue Oct 20 18:22:53 2015 +0300
+++ b/src/lib-index/mail-index-sync.c	Tue Oct 20 18:43:32 2015 +0300
@@ -22,7 +22,6 @@
 
 	ARRAY(struct mail_index_sync_list) sync_list;
 	uint32_t next_uid;
-	uint32_t last_tail_seq, last_tail_offset;
 
 	unsigned int no_warning:1;
 	unsigned int seen_nonexternal_transactions:1;
@@ -164,20 +163,6 @@
 	}
 }
 
-static void
-mail_index_sync_update_mailbox_pos(struct mail_index_sync_ctx *ctx)
-{
-	uint32_t seq;
-	uoff_t offset;
-
-	mail_transaction_log_view_get_prev_pos(ctx->view->log_view,
-					       &seq, &offset);
-
-	ctx->seen_nonexternal_transactions = TRUE;
-	ctx->last_tail_seq = seq;
-	ctx->last_tail_offset = offset + ctx->hdr->size + sizeof(*ctx->hdr);
-}
-
 static int
 mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx)
 {
@@ -203,8 +188,14 @@
 			continue;
 
 		T_BEGIN {
-			if (mail_index_sync_add_transaction(ctx))
-				mail_index_sync_update_mailbox_pos(ctx);
+			if (mail_index_sync_add_transaction(ctx)) {
+				/* update tail_offset if needed */
+				ctx->seen_nonexternal_transactions = TRUE;
+			} else {
+				/* this is an internal change. we don't
+				   necessarily need to update tail_offset, so
+				   avoid the extra write caused by it. */
+			}
 		} T_END;
 	}
 
@@ -436,8 +427,6 @@
 
 	ctx = i_new(struct mail_index_sync_ctx, 1);
 	ctx->index = index;
-	ctx->last_tail_seq = hdr->log_file_seq;
-	ctx->last_tail_offset = hdr->log_file_tail_offset;
 	ctx->flags = flags;
 
 	ctx->view = mail_index_view_open(index);
@@ -764,6 +753,7 @@
 static void
 mail_index_sync_update_mailbox_offset(struct mail_index_sync_ctx *ctx)
 {
+	const struct mail_index_header *hdr = &ctx->index->map->hdr;
 	uint32_t seq;
 	uoff_t offset;
 
@@ -785,7 +775,7 @@
 	   external, because that wouldn't change effective the tail offset.
 	   except e.g. mdbox map requires this to happen, so do it
 	   optionally. */
-	if ((ctx->last_tail_seq != seq || ctx->last_tail_offset < offset) &&
+	if ((hdr->log_file_seq != seq || hdr->log_file_tail_offset < offset) &&
 	    (ctx->seen_nonexternal_transactions ||
 	     (ctx->flags & MAIL_INDEX_SYNC_FLAG_UPDATE_TAIL_OFFSET) != 0)) {
 		ctx->ext_trans->log_updates = TRUE;


More information about the dovecot-cvs mailing list