Mercurial > dovecot > original-hg > dovecot-1.2
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 {