dovecot-2.0: maildir: Avoid refreshing transaction log immediate...

dovecot at dovecot.org dovecot at dovecot.org
Wed Sep 29 19:15:39 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/49bd77c018bd
changeset: 12203:49bd77c018bd
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Sep 29 17:15:12 2010 +0100
description:
maildir: Avoid refreshing transaction log immediately on first sync.

diffstat:

 src/lib-index/mail-index-sync.c                 |   2 -
 src/lib-storage/index/maildir/maildir-storage.h |   1 +
 src/lib-storage/index/maildir/maildir-sync.c    |  34 ++++++++++------
 3 files changed, 22 insertions(+), 15 deletions(-)

diffs (96 lines):

diff -r 8af455e61dad -r 49bd77c018bd src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c	Wed Sep 29 17:14:22 2010 +0100
+++ b/src/lib-index/mail-index-sync.c	Wed Sep 29 17:15:12 2010 +0100
@@ -561,8 +561,6 @@
 	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 -r 8af455e61dad -r 49bd77c018bd src/lib-storage/index/maildir/maildir-storage.h
--- a/src/lib-storage/index/maildir/maildir-storage.h	Wed Sep 29 17:14:22 2010 +0100
+++ b/src/lib-storage/index/maildir/maildir-storage.h	Wed Sep 29 17:15:12 2010 +0100
@@ -85,6 +85,7 @@
 	struct maildir_index_header maildir_hdr;
 	uint32_t maildir_ext_id;
 
+	unsigned int synced:1;
 	unsigned int syncing_commit:1;
 };
 
diff -r 8af455e61dad -r 49bd77c018bd src/lib-storage/index/maildir/maildir-sync.c
--- a/src/lib-storage/index/maildir/maildir-sync.c	Wed Sep 29 17:14:22 2010 +0100
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Wed Sep 29 17:15:12 2010 +0100
@@ -532,25 +532,28 @@
 		(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;
 
+	mail_index_get_header_ext(mbox->box.view, mbox->maildir_ext_id,
+				  &data, &data_size);
+	if (data_size == 0) {
+		/* header doesn't exist */
+	} else {
+		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;
 	}
-
-	mail_index_get_header_ext(mbox->box.view, mbox->maildir_ext_id,
-				  &data, &data_size);
-	if (data_size == 0) {
-		/* doesn't exist */
-		return 0;
-	}
-
-	memcpy(&mbox->maildir_hdr, data,
-	       I_MIN(sizeof(mbox->maildir_hdr), data_size));
+	maildir_sync_get_header(mbox);
 	return 0;
 }
 
@@ -573,8 +576,7 @@
 	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 @@
 	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 @@
 		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);
 }
 


More information about the dovecot-cvs mailing list