From 3a854fc26bcccb0398f0a9a6fa72db1a4ab8f0b8 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 29 Sep 2010 17:15:12 +0100 Subject: [PATCH] maildir: Avoid refreshing transaction log immediately on first sync. --- src/lib-index/mail-index-sync.c | 2 -- .../index/maildir/maildir-storage.h | 1 + src/lib-storage/index/maildir/maildir-sync.c | 32 ++++++++++++------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index 8664091c4d..c8939f38b2 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -561,8 +561,6 @@ bool mail_index_sync_have_any(struct mail_index *index, struct mail_index_view *view; bool ret; - (void)mail_index_refresh(index); - view = mail_index_view_open(index); ret = mail_index_sync_view_have_any(view, flags); mail_index_view_close(&view); diff --git a/src/lib-storage/index/maildir/maildir-storage.h b/src/lib-storage/index/maildir/maildir-storage.h index c76bbe59c7..794b4fed09 100644 --- a/src/lib-storage/index/maildir/maildir-storage.h +++ b/src/lib-storage/index/maildir/maildir-storage.h @@ -85,6 +85,7 @@ struct maildir_mailbox { struct maildir_index_header maildir_hdr; uint32_t maildir_ext_id; + unsigned int synced:1; unsigned int syncing_commit:1; }; diff --git a/src/lib-storage/index/maildir/maildir-sync.c b/src/lib-storage/index/maildir/maildir-sync.c index f257958c52..0c5bf02776 100644 --- a/src/lib-storage/index/maildir/maildir-sync.c +++ b/src/lib-storage/index/maildir/maildir-sync.c @@ -532,25 +532,28 @@ maildir_scan_dir(struct maildir_sync_context *ctx, bool new_dir, bool final) (move_count <= MAILDIR_RENAME_RESCAN_COUNT || final ? 0 : 1); } -int maildir_sync_header_refresh(struct maildir_mailbox *mbox) +static void maildir_sync_get_header(struct maildir_mailbox *mbox) { const void *data; size_t data_size; - if (mail_index_refresh(mbox->box.index) < 0) { - mail_storage_set_index_error(&mbox->box); - return -1; - } - mail_index_get_header_ext(mbox->box.view, mbox->maildir_ext_id, &data, &data_size); if (data_size == 0) { - /* doesn't exist */ - return 0; + /* header doesn't exist */ + } else { + memcpy(&mbox->maildir_hdr, data, + I_MIN(sizeof(mbox->maildir_hdr), data_size)); } +} - memcpy(&mbox->maildir_hdr, data, - I_MIN(sizeof(mbox->maildir_hdr), data_size)); +int maildir_sync_header_refresh(struct maildir_mailbox *mbox) +{ + if (mail_index_refresh(mbox->box.index) < 0) { + mail_storage_set_index_error(&mbox->box); + return -1; + } + maildir_sync_get_header(mbox); return 0; } @@ -573,8 +576,7 @@ static int maildir_sync_quick_check(struct maildir_mailbox *mbox, bool undirty, bool refreshed = FALSE, check_new = FALSE, check_cur = FALSE; if (mbox->maildir_hdr.new_mtime == 0) { - if (maildir_sync_header_refresh(mbox) < 0) - return -1; + maildir_sync_get_header(mbox); if (mbox->maildir_hdr.new_mtime == 0) { /* first sync */ *new_changed_r = *cur_changed_r = TRUE; @@ -694,6 +696,11 @@ static int maildir_sync_get_changes(struct maildir_sync_context *ctx, if ((mbox->box.flags & MAILBOX_FLAG_KEEP_RECENT) == 0) flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT; + if (mbox->synced) { + /* refresh index only after the first sync, i.e. avoid wasting + time on refreshing it immediately after it was just opened */ + (void)mail_index_refresh(mbox->box.index); + } return mail_index_sync_have_any(mbox->box.index, flags) ? 1 : 0; } @@ -965,6 +972,7 @@ maildir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) mail_index_map_move_to_memory(mbox->flags_view->map); maildir_uidlist_set_all_nonsynced(mbox->uidlist); } + mbox->synced = TRUE; return index_mailbox_sync_init(box, flags, ret < 0); } -- 2.47.3