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