From: Marco Bettini Date: Tue, 18 Jul 2023 07:59:07 +0000 (+0000) Subject: fts: fts_backend_refresh() - Refresh also underlying backends for virtual mailboxes X-Git-Tag: 2.4.0~2542 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=271d858e20cf69c38a485393207c3a952d784882;p=thirdparty%2Fdovecot%2Fcore.git fts: fts_backend_refresh() - Refresh also underlying backends for virtual mailboxes --- diff --git a/src/plugins/fts/fts-api.c b/src/plugins/fts/fts-api.c index a4d481f636..9d7bc06323 100644 --- a/src/plugins/fts/fts-api.c +++ b/src/plugins/fts/fts-api.c @@ -9,6 +9,7 @@ #include "mailbox-list-iter.h" #include "mail-search.h" #include "fts-api-private.h" +#include "fts-storage.h" struct event_category event_category_fts = { .name = "fts", @@ -252,9 +253,44 @@ int fts_backend_update_build_more(struct fts_backend_update_context *ctx, return ret; } -int fts_backend_refresh(struct fts_backend *backend) +static int fts_backend_cmp(struct fts_backend *const *lhs_i, + struct fts_backend *const *rhs_i) { - return backend->v.refresh(backend); + struct fts_backend *lhs = *lhs_i; + struct fts_backend *rhs = *rhs_i; + return lhs < rhs ? -1 : lhs > rhs ? 1 : 0; +} + +static int fts_backend_virtual_refresh(struct mailbox *box) +{ + ARRAY_TYPE(mailboxes) mailboxes; + t_array_init(&mailboxes, 8); + box->virtual_vfuncs->get_virtual_backend_boxes(box, &mailboxes, TRUE); + + ARRAY(struct fts_backend *) backends; + t_array_init(&backends, 4); + struct mailbox *bbox; + array_foreach_elem(&mailboxes, bbox) { + struct fts_backend *backend = fts_list_backend(bbox->list); + if (array_lsearch(&backends, &backend, fts_backend_cmp) != NULL) + continue; + + array_push_back(&backends, &backend); + if (fts_backend_refresh(backend, bbox) < 0) + return -1; + } + return 0; +} + +int fts_backend_refresh(struct fts_backend *backend, struct mailbox *box) +{ + int ret = 0; + T_BEGIN { + ret = backend->v.refresh(backend); + if (ret == 0 && box->virtual_vfuncs != NULL) + ret = fts_backend_virtual_refresh(box); + } T_END; + return ret; } int fts_backend_reset_last_uids(struct fts_backend *backend) diff --git a/src/plugins/fts/fts-api.h b/src/plugins/fts/fts-api.h index 6ae54501d4..1ac6ddb504 100644 --- a/src/plugins/fts/fts-api.h +++ b/src/plugins/fts/fts-api.h @@ -140,7 +140,7 @@ int fts_backend_update_build_more(struct fts_backend_update_context *ctx, /* Refresh index to make sure we see latest changes from lookups. Returns 0 if ok, -1 if error. */ -int fts_backend_refresh(struct fts_backend *backend); +int fts_backend_refresh(struct fts_backend *backend, struct mailbox *box); /* Go through the entire index and make sure all mails are indexed, and delete any extra mails in the index. */ int fts_backend_rescan(struct fts_backend *backend); diff --git a/src/plugins/fts/fts-search.c b/src/plugins/fts/fts-search.c index c7197cc2ef..c87d7573c6 100644 --- a/src/plugins/fts/fts-search.c +++ b/src/plugins/fts/fts-search.c @@ -362,7 +362,7 @@ int fts_search_get_first_missing_uid(struct fts_backend *backend, /* UID doesn't seem to be indexed yet. Refresh FTS and check again. */ - if (fts_backend_refresh(backend) < 0) + if (fts_backend_refresh(backend, box) < 0) return -1; } i_unreached();