changeset 6809:9d8c00d4c467 HEAD

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.
author Timo Sirainen <tss@iki.fi>
date Thu, 15 Nov 2007 14:45:27 +0200
parents 937faba78a68
children a4c87d5d881c
files src/lib-index/mail-index-sync.c src/lib-index/mail-index.h src/lib-storage/index/cydir/cydir-save.c src/lib-storage/index/cydir/cydir-sync.c src/lib-storage/index/cydir/cydir-sync.h src/lib-storage/index/dbox/dbox-save.c src/lib-storage/index/dbox/dbox-sync.c src/lib-storage/index/dbox/dbox-sync.h src/lib-storage/index/mbox/mbox-sync.c src/lib-storage/index/raw/raw-sync.c
diffstat 10 files changed, 72 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 		     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 @@
 
 	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,
@@ -326,6 +340,9 @@
 
 	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;
 
--- 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 @@
 	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 *
 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.
--- 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 @@
 
 	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;
--- 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 @@
 }
 
 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 @@
 	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 @@
 {
 	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 *
--- 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 @@
 };
 
 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 *
--- 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 @@
 
 	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;
--- 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 @@
 
 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 @@
 
 	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 @@
 {
 	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);
 }
 
--- 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 @@
 
 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);
 
--- 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 @@
 				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) {
--- 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 @@
 	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 */