From: Timo Sirainen Date: Sat, 18 Nov 2017 16:57:51 +0000 (+0200) Subject: lib-storage: Add INDEXCACHE= to mail_location X-Git-Tag: 2.3.0.rc1~427 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=638600575ee95f2513c683ef09cb188f76eacd22;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add INDEXCACHE= to mail_location This allows configuring a different directory for dovecot.index.cache files than the rest of the index files. --- diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 8e84a1ad0c..9dd1ad255f 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -235,16 +235,22 @@ int index_storage_mailbox_exists_full(struct mailbox *box, const char *subdir, int index_storage_mailbox_alloc_index(struct mailbox *box) { + const char *cache_dir; + if (box->index != NULL) return 0; if (mailbox_create_missing_dir(box, MAILBOX_LIST_PATH_TYPE_INDEX) < 0) return -1; - if (index_mailbox_alloc_index(box, &box->index) < 0) return -1; - mail_index_set_fsync_mode(box->index, - box->storage->set->parsed_fsync_mode, 0); + + if (mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX_CACHE, + &cache_dir) > 0) { + if (mailbox_create_missing_dir(box, MAILBOX_LIST_PATH_TYPE_INDEX_CACHE) < 0) + return -1; + mail_index_set_cache_dir(box->index, cache_dir); + } mail_index_set_lock_method(box->index, box->storage->set->parsed_lock_method, mail_storage_get_lock_timeout(box->storage, UINT_MAX)); diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index cff08840fa..f761011007 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -101,6 +101,7 @@ mbox_list_get_path(struct mailbox_list *list, const char *name, switch (type) { case MAILBOX_LIST_PATH_TYPE_CONTROL: case MAILBOX_LIST_PATH_TYPE_INDEX: + case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE: case MAILBOX_LIST_PATH_TYPE_LIST_INDEX: if (name == NULL && type == MAILBOX_LIST_PATH_TYPE_CONTROL && list->set.control_dir != NULL) { diff --git a/src/lib-storage/list/mailbox-list-delete.c b/src/lib-storage/list/mailbox-list-delete.c index 69715851c2..2d4835e792 100644 --- a/src/lib-storage/list/mailbox-list-delete.c +++ b/src/lib-storage/list/mailbox-list-delete.c @@ -330,6 +330,7 @@ void mailbox_list_delete_mailbox_until_root(struct mailbox_list *list, MAILBOX_LIST_PATH_TYPE_CONTROL, MAILBOX_LIST_PATH_TYPE_INDEX, MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE, + MAILBOX_LIST_PATH_TYPE_INDEX_CACHE, }; const char *path; @@ -404,6 +405,9 @@ int mailbox_list_delete_finish(struct mailbox_list *list, const char *name) int ret, ret2; ret = mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_INDEX); + ret2 = mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_INDEX_CACHE); + if (ret == 0 || ret2 < 0) + ret = ret2; ret2 = mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_CONTROL); if (ret == 0 || ret2 < 0) ret = ret2; diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index fea5a4fa37..6b478ccfa6 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -116,6 +116,12 @@ fs_list_get_path(struct mailbox_list *_list, const char *name, return 1; } break; + case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE: + if (set->index_cache_dir != NULL) { + *path_r = fs_list_get_path_to(set, set->index_cache_dir, name); + return 1; + } + /* fall through */ case MAILBOX_LIST_PATH_TYPE_INDEX: if (set->index_dir != NULL) { if (*set->index_dir == '\0') @@ -519,6 +525,8 @@ static int fs_list_rename_mailbox(struct mailbox_list *oldlist, MAILBOX_LIST_PATH_TYPE_CONTROL, rmdir_parent); (void)rename_dir(oldlist, oldname, newlist, newname, MAILBOX_LIST_PATH_TYPE_INDEX, rmdir_parent); + (void)rename_dir(oldlist, oldname, newlist, newname, + MAILBOX_LIST_PATH_TYPE_INDEX_CACHE, rmdir_parent); return 0; } diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 7e26917d34..69a257b6a8 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -136,6 +136,13 @@ maildir_list_get_path(struct mailbox_list *_list, const char *name, return 1; } break; + case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE: + if (_list->set.index_cache_dir != NULL) { + *path_r = maildir_list_get_dirname_path(_list, + _list->set.index_cache_dir, name); + return 1; + } + /* fall through */ case MAILBOX_LIST_PATH_TYPE_INDEX: if (_list->set.index_dir != NULL) { if (*_list->set.index_dir == '\0') @@ -391,6 +398,8 @@ maildir_rename_children(struct mailbox_list *oldlist, const char *oldname, MAILBOX_LIST_PATH_TYPE_CONTROL); (void)rename_dir(oldlist, old_childname, newlist, new_childname, MAILBOX_LIST_PATH_TYPE_INDEX); + (void)rename_dir(oldlist, old_childname, newlist, new_childname, + MAILBOX_LIST_PATH_TYPE_INDEX_CACHE); } array_free(&names_arr); pool_unref(&pool); @@ -449,6 +458,8 @@ maildir_list_rename_mailbox(struct mailbox_list *oldlist, const char *oldname, MAILBOX_LIST_PATH_TYPE_CONTROL); (void)rename_dir(oldlist, oldname, newlist, newname, MAILBOX_LIST_PATH_TYPE_INDEX); + (void)rename_dir(oldlist, oldname, newlist, newname, + MAILBOX_LIST_PATH_TYPE_INDEX_CACHE); found = ret == 0; T_BEGIN { diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 7625fc7d0c..f7dc7745e2 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -1681,6 +1681,11 @@ mailbox_lists_rename_compatible(struct mailbox_list *list1, list1->ns->prefix, list2->ns->prefix); return FALSE; } + if (!nullequals(list1->set.index_cache_dir, list2->set.index_cache_dir)) { + *error_r = t_strdup_printf("Namespace %s has index cache dir, %s doesn't", + list1->ns->prefix, list2->ns->prefix); + return FALSE; + } if (!nullequals(list1->set.control_dir, list2->set.control_dir)) { *error_r = t_strdup_printf("Namespace %s has control dir, %s doesn't", list1->ns->prefix, list2->ns->prefix); diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 082d64dbe7..e139c0c7ca 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -158,6 +158,9 @@ int mailbox_list_create(const char *driver, struct mail_namespace *ns, list->set.index_pvt_dir = set->index_pvt_dir == NULL || strcmp(set->index_pvt_dir, set->root_dir) == 0 ? NULL : p_strdup(list->pool, set->index_pvt_dir); + list->set.index_cache_dir = set->index_cache_dir == NULL || + strcmp(set->index_cache_dir, set->root_dir) == 0 ? NULL : + p_strdup(list->pool, set->index_cache_dir); list->set.control_dir = set->control_dir == NULL || strcmp(set->control_dir, set->root_dir) == 0 ? NULL : p_strdup(list->pool, set->control_dir); @@ -329,6 +332,8 @@ mailbox_list_settings_parse_full(struct mail_user *user, const char *data, dest = &set_r->index_dir; else if (strcmp(key, "INDEXPVT") == 0) dest = &set_r->index_pvt_dir; + else if (strcmp(key, "INDEXCACHE") == 0) + dest = &set_r->index_cache_dir; else if (strcmp(key, "CONTROL") == 0) dest = &set_r->control_dir; else if (strcmp(key, "ALT") == 0) @@ -1455,6 +1460,12 @@ bool mailbox_list_set_get_root_path(const struct mailbox_list_settings *set, break; } /* fall through - default to index directory */ + case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE: + if (set->index_cache_dir != NULL && + type == MAILBOX_LIST_PATH_TYPE_INDEX_CACHE) { + path = set->index_cache_dir; + break; + } case MAILBOX_LIST_PATH_TYPE_INDEX: if (set->index_dir != NULL) { if (set->index_dir[0] == '\0') { diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index d651e1dde6..5e26d5b631 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -85,6 +85,9 @@ enum mailbox_list_path_type { MAILBOX_LIST_PATH_TYPE_INDEX, /* Return the private index directory (NULL if none) */ MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE, + /* Return the index cache directory (usually same as + MAILBOX_LIST_PATH_TYPE_INDEX) */ + MAILBOX_LIST_PATH_TYPE_INDEX_CACHE, /* Return mailbox list index directory (usually same as MAILBOX_LIST_PATH_TYPE_INDEX) */ MAILBOX_LIST_PATH_TYPE_LIST_INDEX, @@ -103,6 +106,7 @@ struct mailbox_list_settings { const char *root_dir; const char *index_dir; const char *index_pvt_dir; + const char *index_cache_dir; const char *control_dir; const char *alt_dir; /* FIXME: dbox-specific.. */ /* Backend-local directory where volatile data, such as lock files,