From 63b1bd02b7ef0551bfee6bbe29e956dc9171108a Mon Sep 17 00:00:00 2001 From: "Yvan E. Watchman" Date: Wed, 11 Jan 2023 14:58:06 +0100 Subject: [PATCH 1/2] fts: add additional index type to segregate fts indexes from imap indexes --- src/doveadm/doveadm-mail-mailbox.c | 2 +- src/lib-storage/index/mbox/mbox-storage.c | 1 + src/lib-storage/list/mailbox-list-fs.c | 8 +++++++ src/lib-storage/list/mailbox-list-maildir.c | 9 ++++++++ src/lib-storage/mail-storage-private.h | 2 ++ src/lib-storage/mail-storage.c | 9 ++++++++ src/lib-storage/mailbox-list.c | 21 ++++++++++++++++++- src/lib-storage/mailbox-list.h | 3 +++ .../fts-flatcurve/fts-backend-flatcurve.c | 12 +++++++++-- src/plugins/fts/fts-storage.c | 4 +++- 10 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/doveadm/doveadm-mail-mailbox.c b/src/doveadm/doveadm-mail-mailbox.c index a86fb288105..c8b876a6295 100644 --- a/src/doveadm/doveadm-mail-mailbox.c +++ b/src/doveadm/doveadm-mail-mailbox.c @@ -63,7 +63,7 @@ struct path_cmd_context { static const char *mailbox_list_path_type_names[] = { "dir", "alt-dir", "mailbox", "alt-mailbox", - "control", "index", "index-private", "index-cache", "list-index", + "control", "index", "fts-index", "index-private", "index-cache", "list-index", }; static_assert_array_size(mailbox_list_path_type_names, MAILBOX_LIST_PATH_TYPE_COUNT); diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index bd9ca7edd23..41216253d69 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -146,6 +146,7 @@ mbox_list_get_path(struct mailbox_list *list, const char *name, *path_r = t_strconcat(t_strdup_until(path, p), "/"MBOX_INDEX_DIR_NAME"/", p+1, NULL); break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: case MAILBOX_LIST_PATH_TYPE_DIR: case MAILBOX_LIST_PATH_TYPE_ALT_DIR: case MAILBOX_LIST_PATH_TYPE_MAILBOX: diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index 8e4640647ee..feb5595c49f 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -130,6 +130,14 @@ fs_list_get_path(struct mailbox_list *_list, const char *name, return 1; } break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: + if (set->fts_index_dir != NULL) { + if (*set->fts_index_dir == '\0') + return 0; + *path_r = fs_list_get_path_to(set, set->fts_index_dir, name); + return 1; + } + break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: if (set->index_pvt_dir == NULL) return 0; diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 7e5808e1e31..105ebd5953d 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -152,6 +152,15 @@ maildir_list_get_path(struct mailbox_list *_list, const char *name, return 1; } break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: + if (_list->set.fts_index_dir != NULL) { + if (*_list->set.fts_index_dir == '\0') + return 0; + *path_r = maildir_list_get_dirname_path(_list, + _list->set.fts_index_dir, name); + return 1; + } + break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: if (_list->set.index_pvt_dir == NULL) return 0; diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index d8bc614cf66..a86adac1164 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -856,6 +856,8 @@ int mailbox_mark_index_deleted(struct mailbox *box, bool del); const char *mailbox_get_path(struct mailbox *box) ATTR_PURE; /* Similar to mailbox_get_path() but for MAILBOX_LIST_PATH_TYPE_INDEX. */ const char *mailbox_get_index_path(struct mailbox *box) ATTR_PURE; +/* Check if mailbox path for type exists. */ +int mailbox_path_exists(struct mailbox *box, enum mailbox_list_path_type type); /* Wrapper to mailbox_list_get_path() */ int mailbox_get_path_to(struct mailbox *box, enum mailbox_list_path_type type, const char **path_r); diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 05ce59d48fa..93432048d98 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -3008,6 +3008,15 @@ const char *mailbox_get_index_path(struct mailbox *box) return box->_index_path; } +int mailbox_path_exists(struct mailbox *box, enum mailbox_list_path_type type) +{ + const char *path; + if (get_path_to(box, type, NULL, &path) < 0) + return 0; + + return 1; +} + static void mailbox_get_permissions_if_not_set(struct mailbox *box) { if (box->_perm.file_create_mode != 0) diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 8a3e95eccf1..e52d9d8298e 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -210,10 +210,11 @@ int mailbox_list_create(const char *driver, struct mail_namespace *ns, } e_debug(ns->user->event, - "%s: root=%s, index=%s, indexpvt=%s, control=%s, inbox=%s, alt=%s", + "%s: root=%s, index=%s, fts_index=%s, indexpvt=%s, control=%s, inbox=%s, alt=%s", list->name, list->set.root_dir == NULL ? "" : list->set.root_dir, list->set.index_dir == NULL ? "" : list->set.index_dir, + list->set.fts_index_dir == NULL ? "" : list->set.fts_index_dir, list->set.index_pvt_dir == NULL ? "" : list->set.index_pvt_dir, list->set.control_dir == NULL ? "" : list->set.control_dir, @@ -333,6 +334,8 @@ mailbox_list_settings_parse_full(struct mail_user *user, const char *data, dest = &set_r->inbox_path; else if (strcmp(key, "INDEX") == 0) dest = &set_r->index_dir; + else if (strcmp(key, "FTS_INDEX") == 0) + dest = &set_r->fts_index_dir; else if (strcmp(key, "INDEXPVT") == 0) dest = &set_r->index_pvt_dir; else if (strcmp(key, "INDEXCACHE") == 0) @@ -1485,6 +1488,22 @@ bool mailbox_list_set_get_root_path(const struct mailbox_list_settings *set, path = set->root_dir; } break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: + if (set->fts_index_dir != NULL) { + if (set->fts_index_dir[0] == '\0') { + /* in-memory indexes */ + return 0; + } + path = set->fts_index_dir; + + /* Preserve the old behavior of using the index directory if + * fts_index_dir is not set. */ + } else if (set->index_dir != NULL) { + path = set->index_dir; + } else { + path = set->root_dir; + } + break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: path = set->index_pvt_dir; break; diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 27e8f4655b6..02a5c654066 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -95,6 +95,8 @@ enum mailbox_list_path_type { /* Return mailbox list index directory (usually same as MAILBOX_LIST_PATH_TYPE_INDEX) */ MAILBOX_LIST_PATH_TYPE_LIST_INDEX, + /* Return mailbox fts index directory path */ + MAILBOX_LIST_PATH_TYPE_FTS_INDEX, MAILBOX_LIST_PATH_TYPE_COUNT }; @@ -115,6 +117,7 @@ struct mailbox_list_settings { const char *layout; /* FIXME: shouldn't be here */ const char *root_dir; const char *index_dir; + const char *fts_index_dir; const char *index_pvt_dir; const char *index_cache_dir; const char *control_dir; diff --git a/src/plugins/fts-flatcurve/fts-backend-flatcurve.c b/src/plugins/fts-flatcurve/fts-backend-flatcurve.c index 76d2871a5bb..6c7ab11dd48 100644 --- a/src/plugins/fts-flatcurve/fts-backend-flatcurve.c +++ b/src/plugins/fts-flatcurve/fts-backend-flatcurve.c @@ -125,14 +125,22 @@ fts_backend_flatcurve_set_mailbox(struct flatcurve_fts_backend *backend, return -1; } - if (mailbox_open(box) < 0 || - mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX, &path) <= 0) { + if (mailbox_open(box) < 0 + || (mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_INDEX) == 0 && + mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX) == 0) + ) { *error_r = t_strdup_printf("Could not open mailbox: %s: %s", box->vname, mailbox_get_last_internal_error(box, NULL)); return -1; } + if (mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX)) { + mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX, &path); + } else { + mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX, &path); + } + str_append(backend->boxname, box->vname); str_printfa(backend->db_path, "%s/%s/", path, FTS_FLATCURVE_LABEL); diff --git a/src/plugins/fts/fts-storage.c b/src/plugins/fts/fts-storage.c index cf84b9042b1..4042fc59238 100644 --- a/src/plugins/fts/fts-storage.c +++ b/src/plugins/fts/fts-storage.c @@ -959,7 +959,9 @@ fts_mailbox_list_created(struct mailbox_list *list) return; } - if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX, &path)) { + /* TODO: Create config item for MAILBOX_LIST_PATH_TYPE... FTS_INDEX||=INDEX */ + bool has_fts_index_path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_FTS_INDEX, &path); + if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX, &path) && !has_fts_index_path) { e_debug(list->ns->user->event, "fts: Indexes disabled for namespace '%s'", list->ns->prefix); From d7b4d4577dbe5e7806837aff0e60fd7c0aca43b5 Mon Sep 17 00:00:00 2001 From: "Yvan E. Watchman" Date: Wed, 11 Jan 2023 15:08:34 +0100 Subject: [PATCH 2/2] fix cs --- src/lib-storage/list/mailbox-list-fs.c | 16 ++++----- src/lib-storage/list/mailbox-list-maildir.c | 18 +++++----- src/lib-storage/mailbox-list.c | 36 +++++++++---------- src/lib-storage/mailbox-list.h | 4 +-- .../fts-flatcurve/fts-backend-flatcurve.c | 20 +++++------ src/plugins/fts/fts-storage.c | 4 +-- 6 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index feb5595c49f..b4db77c3dce 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -130,14 +130,14 @@ fs_list_get_path(struct mailbox_list *_list, const char *name, return 1; } break; - case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: - if (set->fts_index_dir != NULL) { - if (*set->fts_index_dir == '\0') - return 0; - *path_r = fs_list_get_path_to(set, set->fts_index_dir, name); - return 1; - } - break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: + if (set->fts_index_dir != NULL) { + if (*set->fts_index_dir == '\0') + return 0; + *path_r = fs_list_get_path_to(set, set->fts_index_dir, name); + return 1; + } + break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: if (set->index_pvt_dir == NULL) return 0; diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 105ebd5953d..7eea592c314 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -152,15 +152,15 @@ maildir_list_get_path(struct mailbox_list *_list, const char *name, return 1; } break; - case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: - if (_list->set.fts_index_dir != NULL) { - if (*_list->set.fts_index_dir == '\0') - return 0; - *path_r = maildir_list_get_dirname_path(_list, - _list->set.fts_index_dir, name); - return 1; - } - break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: + if (_list->set.fts_index_dir != NULL) { + if (*_list->set.fts_index_dir == '\0') + return 0; + *path_r = maildir_list_get_dirname_path(_list, + _list->set.fts_index_dir, name); + return 1; + } + break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: if (_list->set.index_pvt_dir == NULL) return 0; diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index e52d9d8298e..ce5bc7a3454 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -125,7 +125,7 @@ int mailbox_list_create(const char *driver, struct mail_namespace *ns, } if ((class->props & MAILBOX_LIST_PROP_NO_MAILDIR_NAME) != 0 && - *set->maildir_name != '\0') { + *set->maildir_name != '\0') { *error_r = "maildir_name not supported by this driver"; return -1; } @@ -334,7 +334,7 @@ mailbox_list_settings_parse_full(struct mail_user *user, const char *data, dest = &set_r->inbox_path; else if (strcmp(key, "INDEX") == 0) dest = &set_r->index_dir; - else if (strcmp(key, "FTS_INDEX") == 0) + else if (strcmp(key, "FTS_INDEX") == 0) dest = &set_r->fts_index_dir; else if (strcmp(key, "INDEXPVT") == 0) dest = &set_r->index_pvt_dir; @@ -1488,22 +1488,22 @@ bool mailbox_list_set_get_root_path(const struct mailbox_list_settings *set, path = set->root_dir; } break; - case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: - if (set->fts_index_dir != NULL) { - if (set->fts_index_dir[0] == '\0') { - /* in-memory indexes */ - return 0; - } - path = set->fts_index_dir; - - /* Preserve the old behavior of using the index directory if - * fts_index_dir is not set. */ - } else if (set->index_dir != NULL) { - path = set->index_dir; - } else { - path = set->root_dir; - } - break; + case MAILBOX_LIST_PATH_TYPE_FTS_INDEX: + if (set->fts_index_dir != NULL) { + if (set->fts_index_dir[0] == '\0') { + /* in-memory indexes */ + return 0; + } + path = set->fts_index_dir; + + /* Preserve the old behavior of using the index directory if + * fts_index_dir is not set. */ + } else if (set->index_dir != NULL) { + path = set->index_dir; + } else { + path = set->root_dir; + } + break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: path = set->index_pvt_dir; break; diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 02a5c654066..8d027bd0402 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -95,8 +95,8 @@ enum mailbox_list_path_type { /* Return mailbox list index directory (usually same as MAILBOX_LIST_PATH_TYPE_INDEX) */ MAILBOX_LIST_PATH_TYPE_LIST_INDEX, - /* Return mailbox fts index directory path */ - MAILBOX_LIST_PATH_TYPE_FTS_INDEX, + /* Return mailbox fts index directory path */ + MAILBOX_LIST_PATH_TYPE_FTS_INDEX, MAILBOX_LIST_PATH_TYPE_COUNT }; diff --git a/src/plugins/fts-flatcurve/fts-backend-flatcurve.c b/src/plugins/fts-flatcurve/fts-backend-flatcurve.c index 6c7ab11dd48..fbbfd572e7f 100644 --- a/src/plugins/fts-flatcurve/fts-backend-flatcurve.c +++ b/src/plugins/fts-flatcurve/fts-backend-flatcurve.c @@ -126,20 +126,20 @@ fts_backend_flatcurve_set_mailbox(struct flatcurve_fts_backend *backend, } if (mailbox_open(box) < 0 - || (mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_INDEX) == 0 && - mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX) == 0) - ) { + || (mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_INDEX) == 0 && + mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX) == 0) + ) { *error_r = t_strdup_printf("Could not open mailbox: %s: %s", - box->vname, - mailbox_get_last_internal_error(box, NULL)); + box->vname, + mailbox_get_last_internal_error(box, NULL)); return -1; } - if (mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX)) { - mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX, &path); - } else { - mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX, &path); - } + if (mailbox_path_exists(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX)) { + mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_FTS_INDEX, &path); + } else { + mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX, &path); + } str_append(backend->boxname, box->vname); str_printfa(backend->db_path, "%s/%s/", path, FTS_FLATCURVE_LABEL); diff --git a/src/plugins/fts/fts-storage.c b/src/plugins/fts/fts-storage.c index 4042fc59238..50951230009 100644 --- a/src/plugins/fts/fts-storage.c +++ b/src/plugins/fts/fts-storage.c @@ -959,8 +959,8 @@ fts_mailbox_list_created(struct mailbox_list *list) return; } - /* TODO: Create config item for MAILBOX_LIST_PATH_TYPE... FTS_INDEX||=INDEX */ - bool has_fts_index_path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_FTS_INDEX, &path); + /* TODO: Create config item for MAILBOX_LIST_PATH_TYPE... FTS_INDEX||=INDEX */ + bool has_fts_index_path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_FTS_INDEX, &path); if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_INDEX, &path) && !has_fts_index_path) { e_debug(list->ns->user->event, "fts: Indexes disabled for namespace '%s'",