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));
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) {
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;
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;
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')
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;
}
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')
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);
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 {
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);
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);
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)
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') {
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,
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,