dovecot-2.2: maildir_very_dirty_syncs=yes: Try harder to avoid r...
dovecot at dovecot.org
dovecot at dovecot.org
Sun May 20 03:26:32 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/ff07827db69a
changeset: 14462:ff07827db69a
user: Timo Sirainen <tss at iki.fi>
date: Thu Apr 19 14:39:26 2012 +0300
description:
maildir_very_dirty_syncs=yes: Try harder to avoid readdir()ing.
diffstat:
src/lib-storage/index/maildir/maildir-sync.c | 51 +++++++++++++++------------
src/lib-storage/index/maildir/maildir-sync.h | 1 +
src/lib-storage/index/maildir/maildir-util.c | 11 ++++++
3 files changed, 41 insertions(+), 22 deletions(-)
diffs (108 lines):
diff -r bda92bf286a0 -r ff07827db69a src/lib-storage/index/maildir/maildir-sync.c
--- a/src/lib-storage/index/maildir/maildir-sync.c Wed Apr 18 20:09:30 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.c Thu Apr 19 14:39:26 2012 +0300
@@ -993,6 +993,34 @@
return ret;
}
+int maildir_sync_refresh_flags_view(struct maildir_mailbox *mbox)
+{
+ struct mail_index_view_sync_ctx *sync_ctx;
+ bool delayed_expunges;
+
+ (void)mail_index_refresh(mbox->box.index);
+ if (mbox->flags_view == NULL)
+ mbox->flags_view = mail_index_view_open(mbox->box.index);
+
+ sync_ctx = mail_index_view_sync_begin(mbox->flags_view,
+ MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT);
+ if (mail_index_view_sync_commit(&sync_ctx, &delayed_expunges) < 0) {
+ mail_storage_set_index_error(&mbox->box);
+ return -1;
+ }
+ /* make sure the map stays in private memory */
+ if (mbox->flags_view->map->refcount > 1) {
+ struct mail_index_map *map;
+
+ map = mail_index_map_clone(mbox->flags_view->map);
+ mail_index_unmap(&mbox->flags_view->map);
+ mbox->flags_view->map = map;
+ }
+ mail_index_record_map_move_to_private(mbox->flags_view->map);
+ mail_index_map_move_to_memory(mbox->flags_view->map);
+ return 0;
+}
+
struct mailbox_sync_context *
maildir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
{
@@ -1025,29 +1053,8 @@
}
if (mbox->storage->set->maildir_very_dirty_syncs) {
- struct mail_index_view_sync_ctx *sync_ctx;
- bool b;
-
- if (mbox->flags_view == NULL) {
- mbox->flags_view =
- mail_index_view_open(mbox->box.index);
- }
- sync_ctx = mail_index_view_sync_begin(mbox->flags_view,
- MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT);
- if (mail_index_view_sync_commit(&sync_ctx, &b) < 0) {
- mail_storage_set_index_error(&mbox->box);
+ if (maildir_sync_refresh_flags_view(mbox) < 0)
ret = -1;
- }
- /* make sure the map stays in private memory */
- if (mbox->flags_view->map->refcount > 1) {
- struct mail_index_map *map;
-
- map = mail_index_map_clone(mbox->flags_view->map);
- mail_index_unmap(&mbox->flags_view->map);
- mbox->flags_view->map = map;
- }
- mail_index_record_map_move_to_private(mbox->flags_view->map);
- mail_index_map_move_to_memory(mbox->flags_view->map);
maildir_uidlist_set_all_nonsynced(mbox->uidlist);
}
mbox->synced = TRUE;
diff -r bda92bf286a0 -r ff07827db69a src/lib-storage/index/maildir/maildir-sync.h
--- a/src/lib-storage/index/maildir/maildir-sync.h Wed Apr 18 20:09:30 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.h Thu Apr 19 14:39:26 2012 +0300
@@ -42,6 +42,7 @@
void maildir_sync_notify(struct maildir_sync_context *ctx);
void maildir_sync_set_new_msgs_count(struct maildir_index_sync_context *ctx,
unsigned int count);
+int maildir_sync_refresh_flags_view(struct maildir_mailbox *mbox);
int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid,
enum maildir_uidlist_rec_flag *flags_r,
diff -r bda92bf286a0 -r ff07827db69a src/lib-storage/index/maildir/maildir-util.c
--- a/src/lib-storage/index/maildir/maildir-util.c Wed Apr 18 20:09:30 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-util.c Thu Apr 19 14:39:26 2012 +0300
@@ -103,6 +103,12 @@
if (ret > 0 && (flags & MAILDIR_UIDLIST_REC_FLAG_NONSYNCED) != 0) {
/* file was found. make sure we remember its latest name. */
maildir_uidlist_update_fname(mbox->uidlist, fname);
+ } else if (ret == 0 &&
+ (flags & MAILDIR_UIDLIST_REC_FLAG_NONSYNCED) == 0) {
+ /* file wasn't found. mark this message nonsynced, so we can
+ retry the lookup by guessing the flags */
+ maildir_uidlist_add_flags(mbox->uidlist, fname,
+ MAILDIR_UIDLIST_REC_FLAG_NONSYNCED);
}
return ret;
}
@@ -133,6 +139,11 @@
T_BEGIN {
ret = maildir_file_do_try(mbox, uid, callback, context);
} T_END;
+ if (ret == 0 && mbox->storage->set->maildir_very_dirty_syncs) T_BEGIN {
+ /* try guessing again with refreshed flags */
+ if (maildir_sync_refresh_flags_view(mbox) == 0)
+ ret = maildir_file_do_try(mbox, uid, callback, context);
+ } T_END;
for (i = 0; i < MAILDIR_RESYNC_RETRY_COUNT && ret == 0; i++) {
/* file is either renamed or deleted. sync the maildir and
see which one. if file appears to be renamed constantly,
More information about the dovecot-cvs
mailing list