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