changeset 6178:66971adb55e5 HEAD

Added dotlock_try mbox lock.
author Timo Sirainen <tss@iki.fi>
date Mon, 06 Aug 2007 19:29:16 +0300
parents abec53314897
children 5c6af3b74d5f
files dovecot-example.conf src/lib-storage/index/mbox/mbox-lock.c
diffstat 2 files changed, 23 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/dovecot-example.conf	Mon Aug 06 19:07:36 2007 +0300
+++ b/dovecot-example.conf	Mon Aug 06 19:29:16 2007 +0300
@@ -453,6 +453,8 @@
 #  dotlock: Create <mailbox>.lock file. This is the oldest and most NFS-safe
 #           solution. If you want to use /var/mail/ like directory, the users
 #           will need write access to that directory.
+#  dotlock_try: Same as dotlock, but if it fails because of permissions or
+#               because there isn't enough disk space, just skip it.
 #  fcntl  : Use this if possible. Works with NFS too if lockd is used.
 #  flock  : May not exist in all systems. Doesn't work with NFS.
 #  lockf  : May not exist in all systems. Doesn't work with NFS.
--- a/src/lib-storage/index/mbox/mbox-lock.c	Mon Aug 06 19:07:36 2007 +0300
+++ b/src/lib-storage/index/mbox/mbox-lock.c	Mon Aug 06 19:29:16 2007 +0300
@@ -30,6 +30,7 @@
 
 enum mbox_lock_type {
 	MBOX_LOCK_DOTLOCK,
+	MBOX_LOCK_DOTLOCK_TRY,
 	MBOX_LOCK_FCNTL,
 	MBOX_LOCK_FLOCK,
 	MBOX_LOCK_LOCKF,
@@ -56,6 +57,8 @@
 
 static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
 			     time_t max_wait_time);
+static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type,
+				 time_t max_wait_time);
 static int mbox_lock_fcntl(struct mbox_lock_context *ctx, int lock_type,
 			   time_t max_wait_time);
 #ifdef HAVE_FLOCK
@@ -73,6 +76,7 @@
 
 struct mbox_lock_data lock_data[] = {
 	{ MBOX_LOCK_DOTLOCK, "dotlock", mbox_lock_dotlock },
+	{ MBOX_LOCK_DOTLOCK_TRY, "dotlock_try", mbox_lock_dotlock_try },
 	{ MBOX_LOCK_FCNTL, "fcntl", mbox_lock_fcntl },
 	{ MBOX_LOCK_FLOCK, "flock", mbox_lock_flock },
 	{ MBOX_LOCK_LOCKF, "lockf", mbox_lock_lockf },
@@ -229,8 +233,8 @@
 	return TRUE;
 }
 
-static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
-			     time_t max_wait_time __attr_unused__)
+static int
+mbox_lock_dotlock_int(struct mbox_lock_context *ctx, int lock_type, bool try)
 {
 	struct mbox_mailbox *mbox = ctx->mbox;
 	struct dotlock_settings set;
@@ -263,6 +267,9 @@
 
 	ret = file_dotlock_create(&set, mbox->path, 0, &mbox->mbox_dotlock);
 	if (ret < 0) {
+		if ((ENOSPACE(errno) || errno == EACCES) && try)
+			return 1;
+
 		mbox_set_syscall_error(mbox, "file_lock_dotlock()");
 		return -1;
 	}
@@ -278,6 +285,18 @@
 	return 1;
 }
 
+static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
+			     time_t max_wait_time __attr_unused__)
+{
+	return mbox_lock_dotlock_int(ctx, lock_type, FALSE);
+}
+
+static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type,
+				 time_t max_wait_time __attr_unused__)
+{
+	return mbox_lock_dotlock_int(ctx, lock_type, TRUE);
+}
+
 #ifdef HAVE_FLOCK
 static int mbox_lock_flock(struct mbox_lock_context *ctx, int lock_type,
 			   time_t max_wait_time)