Mercurial > dovecot > core-2.2
diff src/lib-storage/index/mbox/mbox-lock.c @ 9002:9d0037a997f4 HEAD
Initial commit for config rewrite.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 27 Jan 2009 18:21:53 -0500 |
parents | a9dd29e7dc4f |
children | 21d4363a3cf7 |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/mbox-lock.c Mon Jan 26 19:17:54 2009 -0500 +++ b/src/lib-storage/index/mbox/mbox-lock.c Tue Jan 27 18:21:53 2009 -0500 @@ -22,14 +22,6 @@ /* 0.1 .. 0.2msec */ #define LOCK_RANDOM_USLEEP_TIME (100000 + (unsigned int)rand() % 100000) -/* lock methods to use in wanted order */ -#define DEFAULT_READ_LOCK_METHODS "fcntl" -#define DEFAULT_WRITE_LOCK_METHODS "dotlock fcntl" -/* lock timeout */ -#define MBOX_DEFAULT_LOCK_TIMEOUT (5*60) -/* assume stale dotlock if mbox file hasn't changed for n seconds */ -#define DEFAULT_DOTLOCK_CHANGE_TIMEOUT (120) - enum mbox_lock_type { MBOX_LOCK_DOTLOCK, MBOX_LOCK_DOTLOCK_TRY, @@ -92,11 +84,6 @@ { 0, NULL, NULL } }; -static bool lock_settings_initialized = FALSE; -static enum mbox_lock_type read_locks[MBOX_LOCK_COUNT+1]; -static enum mbox_lock_type write_locks[MBOX_LOCK_COUNT+1]; -static int lock_timeout, dotlock_change_timeout; - static int mbox_lock_list(struct mbox_lock_context *ctx, int lock_type, time_t max_wait_time, int idx); static int mbox_unlock_files(struct mbox_lock_context *ctx); @@ -133,18 +120,16 @@ locks[dest] = (enum mbox_lock_type)-1; } -static void mbox_init_lock_settings(void) +static void mbox_init_lock_settings(struct mbox_storage *storage) { - const char *str; + enum mbox_lock_type read_locks[MBOX_LOCK_COUNT+1]; + enum mbox_lock_type write_locks[MBOX_LOCK_COUNT+1]; int r, w; - str = getenv("MBOX_READ_LOCKS"); - if (str == NULL) str = DEFAULT_READ_LOCK_METHODS; - mbox_read_lock_methods(str, "MBOX_READ_LOCKS", read_locks); - - str = getenv("MBOX_WRITE_LOCKS"); - if (str == NULL) str = DEFAULT_WRITE_LOCK_METHODS; - mbox_read_lock_methods(str, "MBOX_WRITE_LOCKS", write_locks); + mbox_read_lock_methods(storage->set->mbox_read_locks, + "mbox_read_locks", read_locks); + mbox_read_lock_methods(storage->set->mbox_write_locks, + "mbox_write_locks", write_locks); /* check that read/write list orders match. write_locks must contain at least read_locks and possibly more. */ @@ -161,14 +146,17 @@ "(and possibly more)"); } - str = getenv("MBOX_LOCK_TIMEOUT"); - lock_timeout = str == NULL ? MBOX_DEFAULT_LOCK_TIMEOUT : atoi(str); + storage->read_locks = p_new(storage->storage.pool, + enum mbox_lock_type, MBOX_LOCK_COUNT+1); + memcpy(storage->read_locks, read_locks, + sizeof(*storage->read_locks) * (MBOX_LOCK_COUNT+1)); - str = getenv("MBOX_DOTLOCK_CHANGE_TIMEOUT"); - dotlock_change_timeout = str == NULL ? - DEFAULT_DOTLOCK_CHANGE_TIMEOUT : atoi(str); + storage->write_locks = p_new(storage->storage.pool, + enum mbox_lock_type, MBOX_LOCK_COUNT+1); + memcpy(storage->write_locks, write_locks, + sizeof(*storage->write_locks) * (MBOX_LOCK_COUNT+1)); - lock_settings_initialized = TRUE; + storage->lock_settings_initialized = TRUE; } static int mbox_file_open_latest(struct mbox_lock_context *ctx, int lock_type) @@ -221,7 +209,8 @@ lock_types = ctx->lock_type == F_WRLCK || (ctx->lock_type == F_UNLCK && ctx->mbox->mbox_lock_type == F_WRLCK) ? - write_locks : read_locks; + ctx->mbox->storage->write_locks : + ctx->mbox->storage->read_locks; for (i = 0; lock_types[i] != (enum mbox_lock_type)-1; i++) { if (lock_types[i] == MBOX_LOCK_DOTLOCK) @@ -370,12 +359,10 @@ ctx->dotlock_last_stale = -1; memset(&set, 0, sizeof(set)); - set.use_excl_lock = (mbox->storage->storage.flags & - MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL) != 0; - set.nfs_flush = (mbox->storage->storage.flags & - MAIL_STORAGE_FLAG_NFS_FLUSH_STORAGE) != 0; - set.timeout = lock_timeout; - set.stale_timeout = dotlock_change_timeout; + set.use_excl_lock = mbox->storage->storage.set->dotlock_use_excl; + set.nfs_flush = mbox->storage->storage.set->mail_nfs_storage; + set.timeout = mbox->storage->set->mbox_lock_timeout; + set.stale_timeout = mbox->storage->set->mbox_dotlock_change_timeout; set.callback = dotlock_callback; set.context = ctx; @@ -588,7 +575,8 @@ lock_types = lock_type == F_WRLCK || (lock_type == F_UNLCK && ctx->mbox->mbox_lock_type == F_WRLCK) ? - write_locks : read_locks; + ctx->mbox->storage->write_locks : + ctx->mbox->storage->read_locks; for (i = idx; lock_types[i] != (enum mbox_lock_type)-1; i++) { type = lock_types[i]; lock_status = lock_type != F_UNLCK; @@ -616,8 +604,8 @@ index_storage_lock_notify_reset(&mbox->ibox); - if (!lock_settings_initialized) - mbox_init_lock_settings(); + if (!mbox->storage->lock_settings_initialized) + mbox_init_lock_settings(mbox->storage); if (mbox->mbox_fd == -1 && mbox->mbox_file_stream != NULL) { /* read-only mbox stream. no need to lock. */ @@ -626,7 +614,7 @@ return 1; } - max_wait_time = time(NULL) + lock_timeout; + max_wait_time = time(NULL) + mbox->storage->set->mbox_lock_timeout; memset(&ctx, 0, sizeof(ctx)); ctx.mbox = mbox; @@ -634,6 +622,9 @@ if (mbox->mbox_lock_type == F_WRLCK) { /* dropping to shared lock. first drop those that we don't remove completely. */ + const enum mbox_lock_type *read_locks = + mbox->storage->read_locks; + for (i = 0; i < MBOX_LOCK_COUNT; i++) ctx.lock_status[i] = 1; for (i = 0; read_locks[i] != (enum mbox_lock_type)-1; i++) @@ -658,6 +649,11 @@ if (drop_locks) { /* dropping to shared lock: drop the locks that are only in write list */ + const enum mbox_lock_type *read_locks = + mbox->storage->read_locks; + const enum mbox_lock_type *write_locks = + mbox->storage->write_locks; + memset(ctx.lock_status, 0, sizeof(ctx.lock_status)); for (i = 0; write_locks[i] != (enum mbox_lock_type)-1; i++) ctx.lock_status[write_locks[i]] = 1; @@ -691,8 +687,7 @@ if (ret <= 0) return ret; - if ((mbox->storage->storage.flags & - MAIL_STORAGE_FLAG_NFS_FLUSH_STORAGE) != 0) { + if (mbox->storage->storage.set->mail_nfs_storage) { if (fcntl_locked) { nfs_flush_attr_cache_fd_locked(mbox->path, mbox->mbox_fd);