dovecot: Added dotlock_try mbox lock.

dovecot at dovecot.org dovecot at dovecot.org
Mon Aug 6 19:29:20 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/66971adb55e5
changeset: 6178:66971adb55e5
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Aug 06 19:29:16 2007 +0300
description:
Added dotlock_try mbox lock.

diffstat:

2 files changed, 23 insertions(+), 2 deletions(-)
dovecot-example.conf                   |    2 ++
src/lib-storage/index/mbox/mbox-lock.c |   23 +++++++++++++++++++++--

diffs (80 lines):

diff -r abec53314897 -r 66971adb55e5 dovecot-example.conf
--- 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.
diff -r abec53314897 -r 66971adb55e5 src/lib-storage/index/mbox/mbox-lock.c
--- 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 @@ struct mbox_lock_data {
 
 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 @@ static int mbox_lock_lockf(struct mbox_l
 
 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 @@ static bool dotlock_callback(unsigned in
 	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 @@ static int mbox_lock_dotlock(struct mbox
 
 	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;
 	}
@@ -276,6 +283,18 @@ static int mbox_lock_dotlock(struct mbox
 	if (mbox_file_open_latest(ctx, lock_type) < 0)
 		return -1;
 	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


More information about the dovecot-cvs mailing list