]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add INDEXCACHE=<path> to mail_location
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 18 Nov 2017 16:57:51 +0000 (18:57 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 20 Nov 2017 12:29:57 +0000 (14:29 +0200)
This allows configuring a different directory for dovecot.index.cache files
than the rest of the index files.

src/lib-storage/index/index-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/list/mailbox-list-delete.c
src/lib-storage/list/mailbox-list-fs.c
src/lib-storage/list/mailbox-list-maildir.c
src/lib-storage/mail-storage.c
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h

index 8e84a1ad0c4943177d71854d2f806fbf00af9dcc..9dd1ad255ff25678d6e2512ff64c11b577b9c164 100644 (file)
@@ -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));
index cff08840fa7c8fe72a4a10575c249d67bb5970a2..f761011007d2d8a95ceb56f46a965ccfff0884fb 100644 (file)
@@ -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) {
index 69715851c22023cf0a06fcea6754175ca11bd7c2..2d4835e7924776ffac56942210856200b0e87757 100644 (file)
@@ -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;
index fea5a4fa375d86f849b063720ee7049e62cab73c..6b478ccfa6533a02461bd398b0fb3f0bd6f58255 100644 (file)
@@ -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;
 }
 
index 7e26917d3477e180dd718744a9f6ca19b7b5cd97..69a257b6a80dd2453f1f35550fb91031e666421c 100644 (file)
@@ -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 {
index 7625fc7d0c3ce2c10ff96bfd50752dc8ce8daaf1..f7dc7745e2e0ec4090e1db26397577c09489f852 100644 (file)
@@ -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);
index 082d64dbe7e1189dff3f45b69b49b8a3a6062367..e139c0c7cafd36e5b24b0364c74d1c68b23ef104 100644 (file)
@@ -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') {
index d651e1dde669546a6aa1e894e5ca8ad1a9fe5787..5e26d5b631d1542fe59375856005fa06448b7312 100644 (file)
@@ -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,