dovecot-2.1: maildir_very_dirty_syncs=yes: Try harder to avoid r...

dovecot at dovecot.org dovecot at dovecot.org
Thu Apr 19 14:40:29 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/ff07827db69a
changeset: 14426: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