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) */

Reply via email to