[dovecot-cvs] dovecot: mail_index_view_add_hidden_transaction() takes now a wh...

dovecot at dovecot.org dovecot at dovecot.org
Tue May 22 22:47:49 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/965e401fcb7b
changeset: 5653:965e401fcb7b
user:      Timo Sirainen <tss at iki.fi>
date:      Tue May 22 22:44:50 2007 +0300
description:
mail_index_view_add_hidden_transaction() takes now a whole area parameter so
it has to be called only once for each transaction, instead of each for each
transaction record.

mail_index_view_add_synced_transaction() is no longer public.

diffstat:

4 files changed, 62 insertions(+), 76 deletions(-)
src/lib-index/mail-index-transaction.c      |    1 
src/lib-index/mail-index-view-private.h     |   15 ++--
src/lib-index/mail-index-view-sync.c        |   89 ++++++++++++++-------------
src/lib-index/mail-transaction-log-append.c |   33 +---------

diffs (293 lines):

diff -r aff5fb7bb580 -r 965e401fcb7b src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c	Tue May 22 21:32:10 2007 +0300
+++ b/src/lib-index/mail-index-transaction.c	Tue May 22 22:44:50 2007 +0300
@@ -495,6 +495,7 @@ void mail_index_append_assign_uids(struc
 
 void mail_index_expunge(struct mail_index_transaction *t, uint32_t seq)
 {
+	i_assert(!t->hide_transaction);
 	i_assert(seq > 0 && seq <= mail_index_view_get_messages_count(t->view));
 
 	t->log_updates = TRUE;
diff -r aff5fb7bb580 -r 965e401fcb7b src/lib-index/mail-index-view-private.h
--- a/src/lib-index/mail-index-view-private.h	Tue May 22 21:32:10 2007 +0300
+++ b/src/lib-index/mail-index-view-private.h	Tue May 22 22:44:50 2007 +0300
@@ -3,11 +3,12 @@
 
 #include "mail-index-private.h"
 
-struct mail_index_view_log_sync_pos {
+struct mail_index_view_log_sync_area {
 	uint32_t log_file_seq;
+	unsigned int length;
 	uoff_t log_file_offset;
 };
-ARRAY_DEFINE_TYPE(view_log_sync_pos, struct mail_index_view_log_sync_pos);
+ARRAY_DEFINE_TYPE(view_log_sync_area, struct mail_index_view_log_sync_area);
 
 struct mail_index_view_vfuncs {
 	void (*close)(struct mail_index_view *view);
@@ -56,9 +57,9 @@ struct mail_index_view {
 	uint32_t log_file_seq;
 	uoff_t log_file_offset;
 	/* Transaction log offsets which we have already synced */
-	ARRAY_TYPE(view_log_sync_pos) syncs_done;
+	ARRAY_TYPE(view_log_sync_area) syncs_done;
 	/* Transaction log offsets which we don't want to return in view sync */
-	ARRAY_TYPE(view_log_sync_pos) syncs_hidden;
+	ARRAY_TYPE(view_log_sync_area) syncs_hidden;
 
 	/* Module-specific contexts. */
 	ARRAY_DEFINE(module_contexts, union mail_index_view_module_context *);
@@ -80,12 +81,10 @@ int mail_index_view_lock(struct mail_ind
 int mail_index_view_lock(struct mail_index_view *view);
 int mail_index_view_lock_head(struct mail_index_view *view, bool update_index);
 void mail_index_view_unref_maps(struct mail_index_view *view);
-void mail_index_view_add_synced_transaction(struct mail_index_view *view,
-					    uint32_t log_file_seq,
-					    uoff_t log_file_offset);
 void mail_index_view_add_hidden_transaction(struct mail_index_view *view,
 					    uint32_t log_file_seq,
-					    uoff_t log_file_offset);
+					    uoff_t log_file_offset,
+					    unsigned int length);
 
 struct mail_index_view *mail_index_dummy_view_open(struct mail_index *index);
 
diff -r aff5fb7bb580 -r 965e401fcb7b src/lib-index/mail-index-view-sync.c
--- a/src/lib-index/mail-index-view-sync.c	Tue May 22 21:32:10 2007 +0300
+++ b/src/lib-index/mail-index-view-sync.c	Tue May 22 22:44:50 2007 +0300
@@ -368,10 +368,25 @@ int mail_index_view_sync_begin(struct ma
 	return 0;
 }
 
-static bool view_sync_pos_find(ARRAY_TYPE(view_log_sync_pos) *sync_arr,
-			       uint32_t seq, uoff_t offset)
-{
-	const struct mail_index_view_log_sync_pos *syncs;
+static void
+view_add_synced_transaction(struct mail_index_view *view,
+			    uint32_t log_file_seq, uoff_t log_file_offset)
+{
+	struct mail_index_view_log_sync_area *pos;
+
+	if (!array_is_created(&view->syncs_done))
+		i_array_init(&view->syncs_done, 32);
+
+	pos = array_append_space(&view->syncs_done);
+	pos->log_file_seq = log_file_seq;
+	pos->log_file_offset = log_file_offset;
+	pos->length = 1;
+}
+
+static bool view_sync_area_find(ARRAY_TYPE(view_log_sync_area) *sync_arr,
+				uint32_t seq, uoff_t offset)
+{
+	const struct mail_index_view_log_sync_area *syncs;
 	unsigned int i, count;
 
 	if (!array_is_created(sync_arr))
@@ -379,7 +394,8 @@ static bool view_sync_pos_find(ARRAY_TYP
 
 	syncs = array_get(sync_arr, &count);
 	for (i = 0; i < count; i++) {
-		if (syncs[i].log_file_offset == offset &&
+		if (syncs[i].log_file_offset <= offset &&
+		    offset - syncs[i].log_file_offset < syncs[i].length &&
 		    syncs[i].log_file_seq == seq)
 			return TRUE;
 	}
@@ -429,7 +445,7 @@ mail_index_view_sync_get_next_transactio
 		}
 
 		/* skip everything we've already synced */
-		if (view_sync_pos_find(&view->syncs_done, seq, offset))
+		if (view_sync_area_find(&view->syncs_done, seq, offset))
 			continue;
 
 		if (ctx->skipped_some) {
@@ -437,8 +453,7 @@ mail_index_view_sync_get_next_transactio
 			   we'll go through these same transactions again
 			   later. Since we're syncing this one, we don't want
 			   to do it again. */
-			mail_index_view_add_synced_transaction(view, seq,
-							       offset);
+			view_add_synced_transaction(view, seq, offset);
 		}
 
 		/* if we started from a map that we didn't create ourself,
@@ -469,7 +484,7 @@ mail_index_view_sync_get_next_transactio
 
 		/* skip changes committed by hidden transactions (eg. in IMAP
 		   store +flags.silent command) */
-		if (view_sync_pos_find(&view->syncs_hidden, seq, offset))
+		if (view_sync_area_find(&view->syncs_hidden, seq, offset))
 			continue;
 		break;
 	}
@@ -594,16 +609,19 @@ void mail_index_view_sync_get_expunges(s
 
 static void
 mail_index_view_sync_clean_log_syncs(struct mail_index_view_sync_ctx *ctx,
-				     ARRAY_TYPE(view_log_sync_pos) *sync_arr)
+				     ARRAY_TYPE(view_log_sync_area) *sync_arr,
+				     bool fast_clean)
 {
 	struct mail_index_view *view = ctx->view;
-	const struct mail_index_view_log_sync_pos *syncs;
+	const struct mail_index_view_log_sync_area *syncs;
+	uint32_t seq = view->log_file_seq;
+	uoff_t offset = view->log_file_offset;
 	unsigned int i, count;
 
 	if (!array_is_created(sync_arr))
 		return;
 
-	if (!ctx->skipped_some) {
+	if (!ctx->skipped_some && fast_clean) {
 		/* Nothing skipped. Clean it up the quick way. */
 		array_clear(sync_arr);
 		return;
@@ -612,9 +630,9 @@ mail_index_view_sync_clean_log_syncs(str
 	/* Clean up until view's current syncing position */
 	syncs = array_get(sync_arr, &count);
 	for (i = 0; i < count; i++) {
-		if ((syncs[i].log_file_offset >= view->log_file_offset &&
-                     syncs[i].log_file_seq == view->log_file_seq) ||
-		    syncs[i].log_file_seq > view->log_file_seq)
+		if ((syncs[i].log_file_offset + syncs[i].length > offset &&
+                     syncs[i].log_file_seq == seq) ||
+		    syncs[i].log_file_seq > seq)
 			break;
 	}
 	if (i > 0)
@@ -630,8 +648,8 @@ void mail_index_view_sync_end(struct mai
 
 	*_ctx = NULL;
 	mail_index_sync_map_deinit(&ctx->sync_map_ctx);
-	mail_index_view_sync_clean_log_syncs(ctx, &view->syncs_done);
-	mail_index_view_sync_clean_log_syncs(ctx, &view->syncs_hidden);
+	mail_index_view_sync_clean_log_syncs(ctx, &view->syncs_done, TRUE);
+	mail_index_view_sync_clean_log_syncs(ctx, &view->syncs_hidden, FALSE);
 
 	if (!ctx->last_read && ctx->hdr != NULL &&
 	    ctx->data_offset != ctx->hdr->size) {
@@ -685,29 +703,18 @@ void mail_index_view_sync_end(struct mai
 	i_free(ctx);
 }
 
-static void log_sync_pos_add(ARRAY_TYPE(view_log_sync_pos) *sync_arr,
-			     uint32_t log_file_seq, uoff_t log_file_offset)
-{
-	struct mail_index_view_log_sync_pos *pos;
-
-	if (!array_is_created(sync_arr))
-		i_array_init(sync_arr, 32);
-
-	pos = array_append_space(sync_arr);
-	pos->log_file_seq = log_file_seq;
-	pos->log_file_offset = log_file_offset;
-}
-
-void mail_index_view_add_synced_transaction(struct mail_index_view *view,
-					    uint32_t log_file_seq,
-					    uoff_t log_file_offset)
-{
-	log_sync_pos_add(&view->syncs_done, log_file_seq, log_file_offset);
-}
-
 void mail_index_view_add_hidden_transaction(struct mail_index_view *view,
 					    uint32_t log_file_seq,
-					    uoff_t log_file_offset)
-{
-	log_sync_pos_add(&view->syncs_hidden, log_file_seq, log_file_offset);
-}
+					    uoff_t log_file_offset,
+					    unsigned int length)
+{
+	struct mail_index_view_log_sync_area *area;
+
+	if (!array_is_created(&view->syncs_hidden))
+		i_array_init(&view->syncs_hidden, 32);
+
+	area = array_append_space(&view->syncs_hidden);
+	area->log_file_seq = log_file_seq;
+	area->log_file_offset = log_file_offset;
+	area->length = length;
+}
diff -r aff5fb7bb580 -r 965e401fcb7b src/lib-index/mail-transaction-log-append.c
--- a/src/lib-index/mail-transaction-log-append.c	Tue May 22 21:32:10 2007 +0300
+++ b/src/lib-index/mail-transaction-log-append.c	Tue May 22 22:44:50 2007 +0300
@@ -321,11 +321,6 @@ log_append_keyword_update(struct mail_tr
 	if ((hdr_buf->used % 4) != 0)
 		buffer_append_zero(hdr_buf, 4 - (hdr_buf->used % 4));
 
-	if (t->hide_transaction) {
-		mail_index_view_add_hidden_transaction(t->view,
-			file->hdr.file_seq, file->sync_offset);
-	}
-
 	return log_append_buffer(file, buffer, hdr_buf,
 				 MAIL_TRANSACTION_KEYWORD_UPDATE, t->external);
 }
@@ -449,18 +444,10 @@ mail_transaction_log_append_locked(struc
 					t->external);
 	}
 	if (array_is_created(&t->appends) && ret == 0) {
-		if (t->hide_transaction) {
-			mail_index_view_add_hidden_transaction(view,
-				file->hdr.file_seq, file->sync_offset);
-		}
 		ret = log_append_buffer(file, t->appends.arr.buffer, NULL,
 					MAIL_TRANSACTION_APPEND, t->external);
 	}
 	if (array_is_created(&t->updates) && ret == 0) {
-		if (t->hide_transaction) {
-			mail_index_view_add_hidden_transaction(view,
-				file->hdr.file_seq, file->sync_offset);
-		}
 		ret = log_append_buffer(file, t->updates.arr.buffer, NULL,
 					MAIL_TRANSACTION_FLAG_UPDATE,
 					t->external);
@@ -471,10 +458,6 @@ mail_transaction_log_append_locked(struc
 
 	/* keyword resets before updates */
 	if (array_is_created(&t->keyword_resets) && ret == 0) {
-		if (t->hide_transaction) {
-			mail_index_view_add_hidden_transaction(view,
-				file->hdr.file_seq, file->sync_offset);
-		}
 		ret = log_append_buffer(file, t->keyword_resets.arr.buffer,
 					NULL, MAIL_TRANSACTION_KEYWORD_RESET,
 					t->external);
@@ -483,7 +466,6 @@ mail_transaction_log_append_locked(struc
 		ret = log_append_keyword_updates(file, t);
 
 	if (array_is_created(&t->expunges) && ret == 0) {
-		/* Expunges cannot be hidden */
 		ret = log_append_buffer(file, t->expunges.arr.buffer, NULL,
 					MAIL_TRANSACTION_EXPUNGE, t->external);
 	}
@@ -527,16 +509,13 @@ mail_transaction_log_append_locked(struc
 		}
 	}
 
-	if (ret < 0) {
-		if (array_is_created(&view->syncs_hidden)) {
-			/* revert changes to log_syncs */
-			array_delete(&view->syncs_hidden,
-				     old_hidden_syncs_count,
-				     array_count(&view->syncs_hidden) -
-				     old_hidden_syncs_count);
-		}
+	if (t->hide_transaction && ret == 0) {
+		/* mark the area covered by this transaction hidden */
+		mail_index_view_add_hidden_transaction(view, file->hdr.file_seq,
+			append_offset, file->sync_offset - append_offset);
+	}
+	if (ret < 0)
 		file->sync_offset = append_offset;
-	}
 
 	*log_file_seq_r = file->hdr.file_seq;
 	*log_file_offset_r = file->sync_offset;


More information about the dovecot-cvs mailing list