dovecot: Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and cha...

dovecot at dovecot.org dovecot at dovecot.org
Thu Nov 15 14:45:36 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/9d8c00d4c467
changeset: 6809:9d8c00d4c467
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Nov 15 14:45:27 2007 +0200
description:
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
mail_index_sync_begin() to return 1 at success and 0 if there's nothing to do.

diffstat:

10 files changed, 72 insertions(+), 36 deletions(-)
src/lib-index/mail-index-sync.c          |   27 ++++++++++++++++++++++-----
src/lib-index/mail-index.h               |    7 ++++++-
src/lib-storage/index/cydir/cydir-save.c |    2 +-
src/lib-storage/index/cydir/cydir-sync.c |   23 +++++++++++++++--------
src/lib-storage/index/cydir/cydir-sync.h |    2 +-
src/lib-storage/index/dbox/dbox-save.c   |    2 +-
src/lib-storage/index/dbox/dbox-sync.c   |   26 +++++++++++++++-----------
src/lib-storage/index/dbox/dbox-sync.h   |    2 +-
src/lib-storage/index/mbox/mbox-sync.c   |    3 +--
src/lib-storage/index/raw/raw-sync.c     |   14 +++++++++-----

diffs (282 lines):

diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-index/mail-index-sync.c	Thu Nov 15 14:45:27 2007 +0200
@@ -257,13 +257,26 @@ mail_index_need_sync(struct mail_index *
 		     enum mail_index_sync_flags flags,
 		     uint32_t log_file_seq, uoff_t log_file_offset)
 {
+	if ((flags & MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES) == 0)
+		return TRUE;
+
+	/* sync only if there's something to do */
 	if (hdr->first_recent_uid < hdr->next_uid &&
 	    (flags & MAIL_INDEX_SYNC_FLAG_DROP_RECENT) != 0)
 		return TRUE;
 
-	if (hdr->log_file_seq < log_file_seq ||
-	     (hdr->log_file_seq == log_file_seq &&
-	      hdr->log_file_tail_offset < log_file_offset))
+	if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) &&
+	    (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0)
+		return TRUE;
+
+	if (log_file_seq == (uint32_t)-1) {
+		/* we want to sync up to transaction log's head */
+		mail_transaction_log_get_head(index->log,
+					      &log_file_seq, &log_file_offset);
+	}
+	if ((hdr->log_file_tail_offset < log_file_offset &&
+	     hdr->log_file_seq == log_file_seq) ||
+	    hdr->log_file_seq < log_file_seq)
 		return TRUE;
 
 	/* already synced */
@@ -305,8 +318,9 @@ int mail_index_sync_begin(struct mail_in
 
 	ret = mail_index_sync_begin_to(index, ctx_r, view_r, trans_r,
 				       (uint32_t)-1, (uoff_t)-1, flags);
-	i_assert(ret != 0);
-	return ret <= 0 ? -1 : 0;
+	i_assert(ret != 0 ||
+		 (flags & MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES) != 0);
+	return ret;
 }
 
 int mail_index_sync_begin_to(struct mail_index *index,
@@ -325,6 +339,9 @@ int mail_index_sync_begin_to(struct mail
 	int ret;
 
 	i_assert(!index->syncing);
+
+	if (log_file_seq != (uint32_t)-1)
+		flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
 
 	if (mail_transaction_log_sync_lock(index->log, &seq, &offset) < 0)
 		return -1;
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-index/mail-index.h	Thu Nov 15 14:45:27 2007 +0200
@@ -128,6 +128,9 @@ enum mail_index_sync_flags {
 	MAIL_INDEX_SYNC_FLAG_DROP_RECENT	= 0x02,
 	/* Create the transaction with AVOID_FLAG_UPDATES flag */
 	MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES	= 0x04,
+	/* If there are no new transactions and nothing else to do,
+	   return 0 in mail_index_sync_begin() */
+	MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES	= 0x08
 };
 
 enum mail_index_view_sync_flags {
@@ -231,7 +234,9 @@ struct mail_index_view *
 struct mail_index_view *
 mail_index_transaction_open_updated_view(struct mail_index_transaction *t);
 
-/* Begin synchronizing mailbox with index file. Returns 0 if ok, -1 if error.
+/* Begin synchronizing mailbox with index file. Returns 1 if ok,
+   0 if MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES is set and there's nothing to
+   sync, -1 if error.
 
    mail_index_sync_next() returns all changes from previously committed
    transactions which haven't yet been committed to the actual mailbox.
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/cydir/cydir-save.c
--- a/src/lib-storage/index/cydir/cydir-save.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/cydir/cydir-save.c	Thu Nov 15 14:45:27 2007 +0200
@@ -239,7 +239,7 @@ int cydir_transaction_save_commit_pre(st
 
 	i_assert(ctx->finished);
 
-	if (cydir_sync_begin(ctx->mbox, &ctx->sync_ctx) < 0) {
+	if (cydir_sync_begin(ctx->mbox, &ctx->sync_ctx, TRUE) < 0) {
 		ctx->failed = TRUE;
 		cydir_transaction_save_rollback(ctx);
 		return -1;
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/cydir/cydir-sync.c
--- a/src/lib-storage/index/cydir/cydir-sync.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/cydir/cydir-sync.c	Thu Nov 15 14:45:27 2007 +0200
@@ -108,10 +108,11 @@ static void cydir_sync_index(struct cydi
 }
 
 int cydir_sync_begin(struct cydir_mailbox *mbox,
-		     struct cydir_sync_context **ctx_r)
+		     struct cydir_sync_context **ctx_r, bool force)
 {
 	struct cydir_sync_context *ctx;
 	enum mail_index_sync_flags sync_flags;
+	int ret;
 
 	ctx = i_new(struct cydir_sync_context, 1);
 	ctx->mbox = mbox;
@@ -119,13 +120,18 @@ int cydir_sync_begin(struct cydir_mailbo
 	sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY;
 	if (!mbox->ibox.keep_recent)
 		sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+	if (!force)
+		sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
 
-	if (mail_index_sync_begin(mbox->ibox.index, &ctx->index_sync_ctx,
-				  &ctx->sync_view, &ctx->trans,
-				  sync_flags) < 0) {
-		mail_storage_set_index_error(&mbox->ibox);
+	ret = mail_index_sync_begin(mbox->ibox.index, &ctx->index_sync_ctx,
+				    &ctx->sync_view, &ctx->trans,
+				    sync_flags);
+	if (ret <= 0) {
+		if (ret < 0)
+			mail_storage_set_index_error(&mbox->ibox);
 		i_free(ctx);
-		return -1;
+		*ctx_r = NULL;
+		return ret;
 	}
 
 	cydir_sync_index(ctx);
@@ -157,10 +163,11 @@ static int cydir_sync(struct cydir_mailb
 {
 	struct cydir_sync_context *sync_ctx;
 
-	if (cydir_sync_begin(mbox, &sync_ctx) < 0)
+	if (cydir_sync_begin(mbox, &sync_ctx, FALSE) < 0)
 		return -1;
 
-	return cydir_sync_finish(&sync_ctx, TRUE);
+	return sync_ctx == NULL ? 0 :
+		cydir_sync_finish(&sync_ctx, TRUE);
 }
 
 struct mailbox_sync_context *
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/cydir/cydir-sync.h
--- a/src/lib-storage/index/cydir/cydir-sync.h	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/cydir/cydir-sync.h	Thu Nov 15 14:45:27 2007 +0200
@@ -15,7 +15,7 @@ struct cydir_sync_context {
 };
 
 int cydir_sync_begin(struct cydir_mailbox *mbox,
-		     struct cydir_sync_context **ctx_r);
+		     struct cydir_sync_context **ctx_r, bool force);
 int cydir_sync_finish(struct cydir_sync_context **ctx, bool success);
 
 struct mailbox_sync_context *
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/dbox/dbox-save.c
--- a/src/lib-storage/index/dbox/dbox-save.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/dbox/dbox-save.c	Thu Nov 15 14:45:27 2007 +0200
@@ -405,7 +405,7 @@ int dbox_transaction_save_commit_pre(str
 
 	i_assert(ctx->finished);
 
-	if (dbox_sync_begin(ctx->mbox, &ctx->sync_ctx, FALSE) < 0) {
+	if (dbox_sync_begin(ctx->mbox, &ctx->sync_ctx, FALSE, TRUE) < 0) {
 		ctx->failed = TRUE;
 		dbox_transaction_save_rollback(ctx);
 		return -1;
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/dbox/dbox-sync.c
--- a/src/lib-storage/index/dbox/dbox-sync.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/dbox/dbox-sync.c	Thu Nov 15 14:45:27 2007 +0200
@@ -269,7 +269,7 @@ static int dbox_sync_want_flush_dirty(st
 
 int dbox_sync_begin(struct dbox_mailbox *mbox,
 		    struct dbox_sync_context **ctx_r,
-		    bool close_flush_dirty_flags)
+		    bool close_flush_dirty_flags, bool force)
 {
 	struct mail_storage *storage = mbox->ibox.box.storage;
 	struct dbox_sync_context *ctx;
@@ -298,17 +298,22 @@ int dbox_sync_begin(struct dbox_mailbox 
 
 	if (!mbox->ibox.keep_recent)
 		sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
+	if (!rebuild && !force)
+		sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
 	/* don't write unnecessary dirty flag updates */
 	sync_flags |= MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES;
 
 	for (i = 0;; i++) {
-		if (mail_index_sync_begin(mbox->ibox.index,
-					  &ctx->index_sync_ctx,
-					  &ctx->sync_view, &ctx->trans,
-					  sync_flags) < 0) {
-			mail_storage_set_index_error(&mbox->ibox);
+		ret = mail_index_sync_begin(mbox->ibox.index,
+					    &ctx->index_sync_ctx,
+					    &ctx->sync_view, &ctx->trans,
+					    sync_flags);
+		if (ret <= 0) {
+			if (ret < 0)
+				mail_storage_set_index_error(&mbox->ibox);
 			i_free(ctx);
-			return -1;
+			*ctx_r = NULL;
+			return ret;
 		}
 
 		if (rebuild) {
@@ -368,13 +373,12 @@ int dbox_sync(struct dbox_mailbox *mbox,
 {
 	struct dbox_sync_context *sync_ctx;
 
-	if (dbox_sync_begin(mbox, &sync_ctx, close_flush_dirty_flags) < 0)
+	if (dbox_sync_begin(mbox, &sync_ctx,
+			    close_flush_dirty_flags, FALSE) < 0)
 		return -1;
 
-	if (sync_ctx == NULL) {
-		i_assert(close_flush_dirty_flags);
+	if (sync_ctx == NULL)
 		return 0;
-	}
 	return dbox_sync_finish(&sync_ctx, TRUE);
 }
 
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/dbox/dbox-sync.h
--- a/src/lib-storage/index/dbox/dbox-sync.h	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/dbox/dbox-sync.h	Thu Nov 15 14:45:27 2007 +0200
@@ -29,7 +29,7 @@ struct dbox_sync_context {
 
 int dbox_sync_begin(struct dbox_mailbox *mbox,
 		    struct dbox_sync_context **ctx_r,
-		    bool close_flush_dirty_flags);
+		    bool close_flush_dirty_flags, bool force);
 int dbox_sync_finish(struct dbox_sync_context **ctx, bool success);
 int dbox_sync(struct dbox_mailbox *mbox, bool close_flush_dirty_flags);
 
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/mbox/mbox-sync.c
--- a/src/lib-storage/index/mbox/mbox-sync.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/mbox/mbox-sync.c	Thu Nov 15 14:45:27 2007 +0200
@@ -1624,8 +1624,7 @@ again:
 				mbox->ibox.commit_log_file_offset, sync_flags);
 	} else {
 		ret = mail_index_sync_begin(mbox->ibox.index, &index_sync_ctx,
-					    &sync_view, &trans,
-					    sync_flags) < 0 ? -1 : 1;
+					    &sync_view, &trans, sync_flags);
 	}
 
 	if (ret <= 0) {
diff -r 937faba78a68 -r 9d8c00d4c467 src/lib-storage/index/raw/raw-sync.c
--- a/src/lib-storage/index/raw/raw-sync.c	Thu Nov 15 14:18:03 2007 +0200
+++ b/src/lib-storage/index/raw/raw-sync.c	Thu Nov 15 14:45:27 2007 +0200
@@ -12,17 +12,21 @@ static int raw_sync(struct raw_mailbox *
 	struct mail_index_transaction *trans;
 	uint32_t seq, uid_validity = ioloop_time;
 	enum mail_index_sync_flags sync_flags;
+	int ret;
 
 	i_assert(!mbox->synced);
 
-	sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY;
+	sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY |
+		MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
 	if (!mbox->ibox.keep_recent)
 		sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT;
 
-	if (mail_index_sync_begin(mbox->ibox.index, &index_sync_ctx,
-				  &sync_view, &trans, sync_flags) < 0) {
-		mail_storage_set_index_error(&mbox->ibox);
-		return -1;
+	ret = mail_index_sync_begin(mbox->ibox.index, &index_sync_ctx,
+				    &sync_view, &trans, sync_flags);
+	if (ret <= 0) {
+		if (ret < 0)
+			mail_storage_set_index_error(&mbox->ibox);
+		return ret;
 	}
 
 	/* set our uidvalidity */


More information about the dovecot-cvs mailing list