changeset 6881:b1554dea8ee8 HEAD

If we're doing a fast sync, try only once to lock uidlist.
author Timo Sirainen <tss@iki.fi>
date Sat, 01 Dec 2007 09:48:19 +0200
parents 724c8f12eed2
children 19baca289025
files src/lib-storage/index/maildir/maildir-sync.c src/lib-storage/index/maildir/maildir-uidlist.c src/lib-storage/index/maildir/maildir-uidlist.h
diffstat 3 files changed, 14 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-sync.c	Sat Dec 01 09:23:21 2007 +0200
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Sat Dec 01 09:48:19 2007 +0200
@@ -209,6 +209,7 @@
         struct maildir_mailbox *mbox;
 	const char *new_dir, *cur_dir;
 
+	enum mailbox_sync_flags flags;
 	time_t last_touch, last_notify;
 
 	struct maildir_uidlist_sync_ctx *uidlist_sync_ctx;
@@ -246,7 +247,8 @@
 }
 
 static struct maildir_sync_context *
-maildir_sync_context_new(struct maildir_mailbox *mbox)
+maildir_sync_context_new(struct maildir_mailbox *mbox,
+			 enum mailbox_sync_flags flags)
 {
         struct maildir_sync_context *ctx;
 
@@ -256,6 +258,7 @@
 	ctx->cur_dir = t_strconcat(mbox->path, "/cur", NULL);
 	ctx->last_touch = ioloop_time;
 	ctx->last_notify = ioloop_time;
+	ctx->flags = flags;
 	return ctx;
 }
 
@@ -764,6 +767,8 @@
 	} else {
 		ctx->partial = FALSE;
 		sync_flags = 0;
+		if ((ctx->flags & MAILBOX_SYNC_FLAG_FAST) != 0)
+			sync_flags |= MAILDIR_UIDLIST_SYNC_TRYLOCK;
 	}
 	ret = maildir_uidlist_sync_init(ctx->mbox->uidlist, sync_flags,
 					&ctx->uidlist_sync_ctx);
@@ -832,7 +837,7 @@
 	bool lost_files;
 	int ret;
 
-	ctx = maildir_sync_context_new(mbox);
+	ctx = maildir_sync_context_new(mbox, 0);
 	ret = maildir_sync_context(ctx, TRUE, &lost_files);
 	maildir_sync_deinit(ctx);
 	return ret;
@@ -854,7 +859,7 @@
 	    ioloop_time) {
 		mbox->ibox.sync_last_check = ioloop_time;
 
-		ctx = maildir_sync_context_new(mbox);
+		ctx = maildir_sync_context_new(mbox, flags);
 		ret = maildir_sync_context(ctx, FALSE, &lost_files);
 		maildir_sync_deinit(ctx);
 
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Sat Dec 01 09:23:21 2007 +0200
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Sat Dec 01 09:48:19 2007 +0200
@@ -1068,12 +1068,15 @@
 	struct maildir_uidlist_sync_ctx *ctx;
 	int ret;
 
-	if ((sync_flags & MAILDIR_UIDLIST_SYNC_FORCE) == 0) {
+	if ((sync_flags & (MAILDIR_UIDLIST_SYNC_TRYLOCK |
+			   MAILDIR_UIDLIST_SYNC_FORCE)) == 0) {
 		if ((ret = maildir_uidlist_lock(uidlist)) <= 0)
 			return ret;
 	} else {
 		if ((ret = maildir_uidlist_try_lock(uidlist)) < 0)
 			return -1;
+		if (ret == 0 && (sync_flags & MAILDIR_UIDLIST_SYNC_FORCE) == 0)
+			return 0;
 	}
 
 	*sync_ctx_r = ctx = i_new(struct maildir_uidlist_sync_ctx, 1);
--- a/src/lib-storage/index/maildir/maildir-uidlist.h	Sat Dec 01 09:23:21 2007 +0200
+++ b/src/lib-storage/index/maildir/maildir-uidlist.h	Sat Dec 01 09:48:19 2007 +0200
@@ -10,7 +10,8 @@
 enum maildir_uidlist_sync_flags {
 	MAILDIR_UIDLIST_SYNC_PARTIAL	= 0x01,
 	MAILDIR_UIDLIST_SYNC_KEEP_STATE	= 0x02,
-	MAILDIR_UIDLIST_SYNC_FORCE	= 0x04
+	MAILDIR_UIDLIST_SYNC_FORCE	= 0x04,
+	MAILDIR_UIDLIST_SYNC_TRYLOCK	= 0x08
 };
 
 enum maildir_uidlist_rec_flag {