Mercurial > dovecot > core-2.2
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,