return ret;
}
-int mailbox_list_index_sync(struct mailbox_list *list)
+int mailbox_list_index_sync(struct mailbox_list *list, bool refresh)
{
struct mailbox_list_index_sync_context *sync_ctx;
int ret = 0;
if (mailbox_list_index_sync_begin(list, &sync_ctx) < 0)
return -1;
- if (sync_ctx->ilist->has_backing_store)
+ if (!sync_ctx->ilist->has_backing_store) {
+ /* no backing store - we have nothing to sync to */
+ } else if (refresh ||
+ sync_ctx->ilist->call_corruption_callback ||
+ sync_ctx->ilist->corrupted_names_or_parents ||
+ !sync_ctx->list->mail_set->mailbox_list_index_very_dirty_syncs) {
+ /* sync the index against the backing store */
ret = mailbox_list_index_sync_list(sync_ctx);
+ }
return mailbox_list_index_sync_end(&sync_ctx, ret == 0);
}
struct mailbox_list_index_sync_context **sync_ctx_r);
int mailbox_list_index_sync_end(struct mailbox_list_index_sync_context **_sync_ctx,
bool success);
-int mailbox_list_index_sync(struct mailbox_list *list);
+int mailbox_list_index_sync(struct mailbox_list *list, bool refresh);
/* Add name to index, return seq in index. */
uint32_t mailbox_list_index_sync_name(struct mailbox_list_index_sync_context *ctx,
struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
struct mail_index_view *view;
int ret;
+ bool refresh;
i_assert(!ilist->syncing);
}
view = mail_index_view_open(ilist->index);
- if (ilist->mailbox_tree == NULL ||
- mailbox_list_index_need_refresh(ilist, view)) {
+ if ((refresh = mailbox_list_index_need_refresh(ilist, view)) ||
+ ilist->mailbox_tree == NULL) {
/* refresh list of mailboxes */
- ret = mailbox_list_index_sync(list);
+ ret = mailbox_list_index_sync(list, refresh);
} else {
ret = mailbox_list_index_parse(list, view, FALSE);
}