On 2018-10-05 11:50, Tom Sommer wrote:
On 2018-10-05 11:35, Timo Sirainen wrote:
On 4 Oct 2018, at 17.13, Tom Sommer <m...@tomsommer.dk> wrote:
On 2018-10-04 15:55, Timo Sirainen wrote:
On 4 Oct 2018, at 14.39, Tom Sommer <m...@tomsommer.dk> wrote:
Is this correct, and if so are there any plans to move dotlocks
etc. to this directory?
What dotlocks? I guess mbox and Maildir have some locks that could
be
moved there, but a better performance optimization for those
installations would be to switch to sdbox/mdbox. Other than that, I
don't remember there being anything important that could be moved
there.
Maildir locks yes, switching format is not a procedure I feel
comfortable with :)
Would it be possible to move the maildir/mbox locks to VOLATILEDIR?
Sure it would be possible, but it's such a low priority for us that I
doubt we'll be implementing it.
Might try and look into it myself.
Something like this? See attached.
diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c
index eb9d972..4ae2be0 100644
--- a/src/lib-storage/index/maildir/maildir-uidlist.c
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c
@@ -64,6 +64,7 @@ HASH_TABLE_DEFINE_TYPE(path_to_maildir_uidlist_rec,
struct maildir_uidlist {
struct mailbox *box;
char *path;
+ char *path_dotlock;
struct maildir_index_header *mhdr;
int fd;
@@ -138,7 +139,7 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
{
struct mailbox *box = uidlist->box;
const struct mailbox_permissions *perm = mailbox_get_permissions(box);
- const char *path = uidlist->path;
+ const char *path_dotlock = uidlist->path_dotlock;
mode_t old_mask;
const enum dotlock_create_flags dotlock_flags =
nonblock ? DOTLOCK_CREATE_FLAG_NONBLOCK : 0;
@@ -157,7 +158,7 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
for (i = 0;; i++) {
old_mask = umask(0777 & ~perm->file_create_mode);
- ret = file_dotlock_create(&uidlist->dotlock_settings, path,
+ ret = file_dotlock_create(&uidlist->dotlock_settings, path_dotlock,
dotlock_flags, &uidlist->dotlock);
umask(old_mask);
if (ret > 0)
@@ -172,11 +173,11 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT) {
if (errno == EACCES) {
mailbox_set_critical(box, "%s",
- eacces_error_get_creating("file_dotlock_create", path));
+ eacces_error_get_creating("file_dotlock_create", path_dotlock));
} else {
mailbox_set_critical(box,
"file_dotlock_create(%s) failed: %m",
- path);
+ path_dotlock);
}
return -1;
}
@@ -259,16 +260,21 @@ struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox)
struct mailbox *box = &mbox->box;
struct maildir_uidlist *uidlist;
const char *control_dir;
+ const char *volatile_dir;
if (mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_CONTROL,
&control_dir) <= 0)
i_unreached();
+ if (mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_VOLATILEDIR,
+ &volatile_dir) <= 0)
+ i_unreached();
uidlist = i_new(struct maildir_uidlist, 1);
uidlist->box = box;
uidlist->mhdr = &mbox->maildir_hdr;
uidlist->fd = -1;
uidlist->path = i_strconcat(control_dir, "/"MAILDIR_UIDLIST_NAME, NULL);
+ uidlist->path_dotlock = i_strconcat(volatile_dir, "/"MAILDIR_UIDLIST_NAME, NULL);
i_array_init(&uidlist->records, 128);
hash_table_create(&uidlist->files, default_pool, 4096,
maildir_filename_base_hash,
@@ -333,6 +339,7 @@ void maildir_uidlist_deinit(struct maildir_uidlist **_uidlist)
array_free(&uidlist->records);
str_free(&uidlist->hdr_extensions);
i_free(uidlist->path);
+ i_free(uidlist->path_dotlock);
i_free(uidlist);
}
diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c
index e409a50..c7b0ce9 100644
--- a/src/lib-storage/mailbox-list.c
+++ b/src/lib-storage/mailbox-list.c
@@ -1454,6 +1454,10 @@ bool mailbox_list_set_get_root_path(const struct mailbox_list_settings *set,
path = set->control_dir != NULL ?
set->control_dir : set->root_dir;
break;
+ case MAILBOX_LIST_PATH_TYPE_VOLATILEDIR:
+ path = set->volatile_dir != NULL ?
+ set->volatile_dir : set->root_dir;
+ break;
case MAILBOX_LIST_PATH_TYPE_LIST_INDEX:
if (set->list_index_dir != NULL) {
if (set->list_index_dir[0] == '/') {
diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h
index ef476ae..f46359d 100644
--- a/src/lib-storage/mailbox-list.h
+++ b/src/lib-storage/mailbox-list.h
@@ -85,6 +85,8 @@ enum mailbox_list_path_type {
MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX,
/* Return control directory */
MAILBOX_LIST_PATH_TYPE_CONTROL,
+ /* Return volatile directory */
+ MAILBOX_LIST_PATH_TYPE_VOLATILEDIR,
/* Return index directory ("" for in-memory) */
MAILBOX_LIST_PATH_TYPE_INDEX,
/* Return the private index directory (NULL if none) */