changeset 20406:15a74a75d401

LAYOUT=index: Existence or GUID lookups don't need to refresh mailboxes.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 21 Jun 2016 21:26:29 +0300
parents 8518e1a31640
children 3786bd9e2579
files src/lib-storage/list/mailbox-list-index-status.c
diffstat 1 files changed, 14 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-index-status.c	Tue Jun 21 21:39:49 2016 +0300
+++ b/src/lib-storage/list/mailbox-list-index-status.c	Tue Jun 21 21:26:29 2016 +0300
@@ -34,8 +34,8 @@
 	((box)->inbox_any)
 
 static int
-index_list_open_view(struct mailbox *box, struct mail_index_view **view_r,
-		     uint32_t *seq_r)
+index_list_open_view(struct mailbox *box, bool refresh,
+		     struct mail_index_view **view_r, uint32_t *seq_r)
 {
 	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list);
 	struct mailbox_list_index_node *node;
@@ -58,6 +58,9 @@
 	if (!mail_index_lookup_seq(view, node->uid, &seq)) {
 		/* our in-memory tree is out of sync */
 		ret = 1;
+	} else if (!refresh) {
+		/* this operation doesn't need the index to be up-to-date */
+		ret = 0;
 	} else T_BEGIN {
 		ret = box->v.list_index_has_changed == NULL ? 0 :
 			box->v.list_index_has_changed(box, view, seq);
@@ -89,7 +92,7 @@
 	uint32_t seq;
 	int ret;
 
-	if ((ret = index_list_open_view(box, &view, &seq)) <= 0) {
+	if ((ret = index_list_open_view(box, FALSE, &view, &seq)) <= 0) {
 		/* failure / not found. fallback to the real storage check
 		   just in case to see if the mailbox was just created. */
 		return ibox->module_ctx.super.
@@ -186,6 +189,9 @@
 	uint32_t seq;
 	int ret;
 
+	if (items == 0)
+		return 1;
+
 	if ((items & STATUS_UNSEEN) != 0 &&
 	    (mailbox_get_private_flags_mask(box) & MAIL_SEEN) != 0) {
 		/* can't get UNSEEN from list index, since each user has
@@ -193,7 +199,7 @@
 		return 0;
 	}
 
-	if ((ret = index_list_open_view(box, &view, &seq)) <= 0)
+	if ((ret = index_list_open_view(box, TRUE, &view, &seq)) <= 0)
 		return ret;
 
 	ret = mailbox_list_index_status(box->list, view, seq, items,
@@ -230,7 +236,7 @@
 		return 0;
 	}
 
-	if ((ret = index_list_open_view(box, &view, &seq)) <= 0)
+	if ((ret = index_list_open_view(box, FALSE, &view, &seq)) <= 0)
 		return ret;
 
 	ret = mailbox_list_index_status(box->list, view, seq, 0,
@@ -252,7 +258,7 @@
 
 	i_assert(!ilist->syncing);
 
-	if ((ret = index_list_open_view(box, &view, &seq)) <= 0)
+	if ((ret = index_list_open_view(box, TRUE, &view, &seq)) <= 0)
 		return ret;
 
 	ret = mailbox_list_index_status(box->list, view, seq,
@@ -283,7 +289,7 @@
 
 	memset(first_saved_r, 0, sizeof(*first_saved_r));
 
-	if ((ret = index_list_open_view(box, &view, &seq)) <= 0)
+	if ((ret = index_list_open_view(box, TRUE, &view, &seq)) <= 0)
 		return ret;
 
 	mail_index_lookup_ext(view, seq, ilist->first_saved_ext_id,
@@ -700,7 +706,7 @@
 	int ret;
 
 	memset(&changes, 0, sizeof(changes));
-	if ((ret = index_list_open_view(box, &list_view, &changes.seq)) <= 0)
+	if ((ret = index_list_open_view(box, TRUE, &list_view, &changes.seq)) <= 0)
 		return;
 
 	(void)mailbox_list_index_status(box->list, list_view, changes.seq,