From: Timo Sirainen Date: Tue, 21 Sep 2021 13:57:13 +0000 (+0300) Subject: lib-storage: List index rebuild - Split off mail_storage_list_index_find_indexed_mail... X-Git-Tag: 2.3.17~86 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=99b9890db083faf312f5a6d6c8e00f863f231d65;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: List index rebuild - Split off mail_storage_list_index_find_indexed_mailbox() --- diff --git a/src/lib-storage/list/mail-storage-list-index-rebuild.c b/src/lib-storage/list/mail-storage-list-index-rebuild.c index f121d7b967..ecc9242257 100644 --- a/src/lib-storage/list/mail-storage-list-index-rebuild.c +++ b/src/lib-storage/list/mail-storage-list-index-rebuild.c @@ -170,59 +170,70 @@ mail_storage_list_remove_duplicate(struct mail_storage_list_index_rebuild_ctx *c } static int -mail_storage_list_index_find_indexed_mailboxes(struct mail_storage_list_index_rebuild_ctx *ctx, - struct mail_storage_list_index_rebuild_ns *rebuild_ns) +mail_storage_list_index_find_indexed_mailbox(struct mail_storage_list_index_rebuild_ctx *ctx, + struct mail_storage_list_index_rebuild_ns *rebuild_ns, + const struct mailbox_info *info) { - struct mailbox_list_iterate_context *iter; - const struct mailbox_info *info; struct mail_storage_list_index_rebuild_mailbox *rebuild_box; struct mailbox *box; struct mailbox_metadata metadata; const uint8_t *guid_p; int ret = 0; + if ((info->flags & (MAILBOX_NOSELECT | MAILBOX_NONEXISTENT)) != 0) + return 0; + + box = mailbox_alloc(info->ns->list, info->vname, MAILBOX_FLAG_IGNORE_ACLS); + mailbox_set_reason(box, "mailbox list rebuild"); + if (mailbox_get_metadata(box, MAILBOX_METADATA_GUID, &metadata) < 0) { + mail_storage_set_critical(rebuild_ns->ns->storage, + "List rebuild: Couldn't lookup mailbox %s GUID: %s", + info->vname, mailbox_get_last_internal_error(box, NULL)); + ret = -1; + } else { + guid_p = metadata.guid; + rebuild_box = hash_table_lookup(ctx->mailboxes, guid_p); + if (rebuild_box == NULL) { + /* indexed but doesn't exist in storage. shouldn't + happen normally, but it'll be created when it gets + accessed. */ + e_debug(box->event, + "Mailbox GUID %s exists in list index, but not in storage", + guid_128_to_string(guid_p)); + } else if (rebuild_box->index_name == NULL) { + rebuild_box->index_name = + p_strdup(ctx->pool, box->name); + e_debug(box->event, + "Mailbox GUID %s exists in list index and in storage", + guid_128_to_string(guid_p)); + } else { + /* duplicate GUIDs in index. in theory this could be + possible because of mailbox aliases, but we don't + support that for now. especially dsync doesn't like + duplicates. */ + if (mail_storage_list_remove_duplicate(ctx, rebuild_ns, + box, rebuild_box) < 0) + ret = -1; + } + } + mailbox_free(&box); + return ret; +} + +static int +mail_storage_list_index_find_indexed_mailboxes(struct mail_storage_list_index_rebuild_ctx *ctx, + struct mail_storage_list_index_rebuild_ns *rebuild_ns) +{ + struct mailbox_list_iterate_context *iter; + const struct mailbox_info *info; + int ret = 0; + iter = mailbox_list_iter_init(rebuild_ns->ns->list, "*", MAILBOX_LIST_ITER_RAW_LIST | MAILBOX_LIST_ITER_NO_AUTO_BOXES | MAILBOX_LIST_ITER_SKIP_ALIASES); while (ret == 0 && (info = mailbox_list_iter_next(iter)) != NULL) { - if ((info->flags & (MAILBOX_NOSELECT | MAILBOX_NONEXISTENT)) != 0) - continue; - box = mailbox_alloc(info->ns->list, info->vname, MAILBOX_FLAG_IGNORE_ACLS); - mailbox_set_reason(box, "mailbox list rebuild"); - if (mailbox_get_metadata(box, MAILBOX_METADATA_GUID, - &metadata) < 0) { - mail_storage_set_critical(rebuild_ns->ns->storage, - "List rebuild: Couldn't lookup mailbox %s GUID: %s", - info->vname, mailbox_get_last_internal_error(box, NULL)); - ret = -1; - } else { - guid_p = metadata.guid; - rebuild_box = hash_table_lookup(ctx->mailboxes, guid_p); - if (rebuild_box == NULL) { - /* indexed but doesn't exist in storage. - shouldn't happen normally, but it'll be - created when it gets accessed. */ - e_debug(box->event, - "Mailbox GUID %s exists in list index, but not in storage", - guid_128_to_string(guid_p)); - } else if (rebuild_box->index_name == NULL) { - rebuild_box->index_name = - p_strdup(ctx->pool, box->name); - e_debug(box->event, - "Mailbox GUID %s exists in list index and in storage", - guid_128_to_string(guid_p)); - } else { - /* duplicate GUIDs in index. in theory this - could be possible because of mailbox - aliases, but we don't support that for now. - especially dsync doesn't like duplicates. */ - if (mail_storage_list_remove_duplicate(ctx, rebuild_ns, - box, rebuild_box) < 0) - ret = -1; - } - } - mailbox_free(&box); + ret = mail_storage_list_index_find_indexed_mailbox(ctx, rebuild_ns, info); } if (mailbox_list_iter_deinit(&iter) < 0) { mail_storage_set_critical(rebuild_ns->ns->storage,