[dovecot-cvs] dovecot: Changed mail_index_view_sync_begin() to take enum mail_...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jun 13 21:51:18 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/9c53047d3b2c
changeset: 5722:9c53047d3b2c
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Jun 13 21:51:15 2007 +0300
description:
Changed mail_index_view_sync_begin() to take enum mail_index_view_sync_type.
This limits how the view can be synced, but we couldn't handle before more
than the 3 useful cases anyway.

diffstat:

4 files changed, 36 insertions(+), 24 deletions(-)
src/lib-index/mail-index-view-sync.c      |   30 +++++++++++++++--------------
src/lib-index/mail-index.h                |   12 +++++++++--
src/lib-storage/index/index-sync.c        |   15 +++++++-------
src/lib-storage/list/index-mailbox-list.c |    3 +-

diffs (141 lines):

diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-index/mail-index-view-sync.c
--- a/src/lib-index/mail-index-view-sync.c	Wed Jun 13 21:35:14 2007 +0300
+++ b/src/lib-index/mail-index-view-sync.c	Wed Jun 13 21:51:15 2007 +0300
@@ -246,7 +246,7 @@ static void mail_index_view_check(struct
 	  array_count(&view->syncs_done) == 0))
 
 int mail_index_view_sync_begin(struct mail_index_view *view,
-                               enum mail_index_sync_type sync_mask,
+                               enum mail_index_view_sync_type sync_type,
 			       struct mail_index_view_sync_ctx **ctx_r)
 {
 	struct mail_index_view_sync_ctx *ctx;
@@ -254,29 +254,32 @@ int mail_index_view_sync_begin(struct ma
 	enum mail_transaction_type log_get_mask, visible_mask;
 	ARRAY_TYPE(seq_range) expunges = ARRAY_INIT;
 
-	/* We must sync flags as long as view is mmap()ed, as the flags may
-	   have already changed under us. */
-	i_assert((sync_mask & MAIL_INDEX_VIEW_VISIBLE_FLAGS_MASK) ==
-		 MAIL_INDEX_VIEW_VISIBLE_FLAGS_MASK);
-	/* Currently we're not handling correctly expunges + no-appends case */
-	i_assert((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) == 0 ||
-		 (sync_mask & MAIL_INDEX_SYNC_TYPE_APPEND) != 0);
-
 	i_assert(!view->syncing);
 	i_assert(view->transactions == 0);
 
 	if (mail_index_view_lock_head(view) < 0)
 		return -1;
 
-	if ((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) != 0) {
+	if (sync_type == MAIL_INDEX_VIEW_SYNC_TYPE_ALL) {
 		/* get list of all expunges first */
 		if (view_sync_get_expunges(view, &expunges) < 0)
 			return -1;
 	}
 
 	/* only flags, appends and expunges can be left to be synced later */
-	visible_mask = mail_transaction_type_mask_get(sync_mask);
-	i_assert((visible_mask & ~MAIL_TRANSACTION_VISIBLE_SYNC_MASK) == 0);
+	switch (sync_type) {
+	case MAIL_INDEX_VIEW_SYNC_TYPE_ALL:
+		visible_mask = MAIL_TRANSACTION_VISIBLE_SYNC_MASK;
+		break;
+	case MAIL_INDEX_VIEW_SYNC_TYPE_NOAPPENDS_NOEXPUNGES:
+		visible_mask = MAIL_TRANSACTION_VISIBLE_SYNC_MASK &
+			~(MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_APPEND);
+		break;
+	case MAIL_INDEX_VIEW_SYNC_TYPE_NOEXPUNGES:
+		visible_mask = MAIL_TRANSACTION_VISIBLE_SYNC_MASK &
+			~MAIL_TRANSACTION_EXPUNGE;
+		break;
+	}
 
 	/* we want to also get non-visible changes. especially because we use
 	   the returned skipped-flag in mail_transaction_log_view_next() to
@@ -296,8 +299,7 @@ int mail_index_view_sync_begin(struct ma
 	mail_index_sync_map_init(&ctx->sync_map_ctx, view,
 				 MAIL_INDEX_SYNC_HANDLER_VIEW);
 
-	if ((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) != 0 &&
-	    (sync_mask & MAIL_INDEX_SYNC_TYPE_APPEND) != 0) {
+	if (sync_type == MAIL_INDEX_VIEW_SYNC_TYPE_ALL) {
 		view->sync_new_map = view->index->map;
 		view->sync_new_map->refcount++;
 
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h	Wed Jun 13 21:35:14 2007 +0300
+++ b/src/lib-index/mail-index.h	Wed Jun 13 21:51:15 2007 +0300
@@ -107,7 +107,15 @@ enum mail_index_sync_type {
 	MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE	= 0x10,
 	MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET	= 0x20
 };
-#define MAIL_INDEX_SYNC_MASK_ALL 0xff
+
+enum mail_index_view_sync_type {
+	/* Sync everything */
+	MAIL_INDEX_VIEW_SYNC_TYPE_ALL,
+	/* Don't sync appends or expunges */
+	MAIL_INDEX_VIEW_SYNC_TYPE_NOAPPENDS_NOEXPUNGES,
+	/* Don't sync expunges */
+	MAIL_INDEX_VIEW_SYNC_TYPE_NOEXPUNGES
+};
 
 struct mail_index_sync_rec {
 	uint32_t uid1, uid2;
@@ -257,7 +265,7 @@ int mail_index_fsck(struct mail_index *i
    will be marked inconsistent. Only sync_mask type records are
    synchronized. */
 int mail_index_view_sync_begin(struct mail_index_view *view,
-                               enum mail_index_sync_type sync_mask,
+                               enum mail_index_view_sync_type sync_type,
 			       struct mail_index_view_sync_ctx **ctx_r);
 /* Returns -1 if error, 0 if sync is finished, 1 if record was filled. */
 int mail_index_view_sync_next(struct mail_index_view_sync_ctx *ctx,
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-storage/index/index-sync.c
--- a/src/lib-storage/index/index-sync.c	Wed Jun 13 21:35:14 2007 +0300
+++ b/src/lib-storage/index/index-sync.c	Wed Jun 13 21:51:15 2007 +0300
@@ -135,7 +135,7 @@ index_mailbox_sync_init(struct mailbox *
 {
 	struct index_mailbox *ibox = (struct index_mailbox *)box;
         struct index_mailbox_sync_context *ctx;
-	enum mail_index_sync_type sync_mask;
+	enum mail_index_view_sync_type sync_type;
 
 	ctx = i_new(struct index_mailbox_sync_context, 1);
 	ctx->ctx.box = box;
@@ -148,13 +148,14 @@ index_mailbox_sync_init(struct mailbox *
 
 	ctx->messages_count = mail_index_view_get_messages_count(ibox->view);
 
-	sync_mask = MAIL_INDEX_SYNC_MASK_ALL;
-	if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0)
-		sync_mask &= ~MAIL_INDEX_SYNC_TYPE_EXPUNGE;
 	if ((flags & MAILBOX_SYNC_FLAG_NO_NEWMAIL) != 0)
-		sync_mask &= ~MAIL_INDEX_SYNC_TYPE_APPEND;
-
-	if (mail_index_view_sync_begin(ibox->view, sync_mask,
+		sync_type = MAIL_INDEX_VIEW_SYNC_TYPE_NOAPPENDS_NOEXPUNGES;
+	else if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0)
+		sync_type = MAIL_INDEX_VIEW_SYNC_TYPE_NOEXPUNGES;
+	else
+		sync_type = MAIL_INDEX_VIEW_SYNC_TYPE_ALL;
+
+	if (mail_index_view_sync_begin(ibox->view, sync_type,
 				       &ctx->sync_ctx) < 0) {
 		mail_storage_set_index_error(ibox);
 		ctx->failed = TRUE;
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-storage/list/index-mailbox-list.c
--- a/src/lib-storage/list/index-mailbox-list.c	Wed Jun 13 21:35:14 2007 +0300
+++ b/src/lib-storage/list/index-mailbox-list.c	Wed Jun 13 21:51:15 2007 +0300
@@ -29,7 +29,8 @@ index_mailbox_view_sync(struct index_mai
 	struct mail_index_view_sync_rec sync_rec;
 	int ret;
 
-	if (mail_index_view_sync_begin(ctx->mail_view, MAIL_INDEX_SYNC_MASK_ALL,
+	if (mail_index_view_sync_begin(ctx->mail_view,
+				       MAIL_INDEX_VIEW_SYNC_TYPE_ALL,
 				       &sync_ctx) < 0) {
 		mailbox_list_set_internal_error(ctx->ctx.list);
 		return -1;


More information about the dovecot-cvs mailing list