From: Timo Sirainen Date: Thu, 23 Sep 2010 14:53:09 +0000 (+0100) Subject: lib-index: Log a warning if transaction log lock is kept over 3 minutes. X-Git-Tag: 2.0.4~27 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d9fda7e3a0fa5551547ac3e3054b837fc77f4bfb;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Log a warning if transaction log lock is kept over 3 minutes. --- diff --git a/src/lib-index/mail-transaction-log-file.c b/src/lib-index/mail-transaction-log-file.c index d195ccda67..f8f023654c 100644 --- a/src/lib-index/mail-transaction-log-file.c +++ b/src/lib-index/mail-transaction-log-file.c @@ -282,6 +282,7 @@ mail_transaction_log_file_dotlock(struct mail_transaction_log_file *file) if (ret > 0) { file->log->dotlock_count++; file->locked = TRUE; + file->lock_created = time(NULL); return 0; } if (ret < 0) { @@ -344,6 +345,7 @@ int mail_transaction_log_file_lock(struct mail_transaction_log_file *file) &file->file_lock); if (ret > 0) { file->locked = TRUE; + file->lock_created = time(NULL); return 0; } if (ret < 0) { @@ -361,6 +363,8 @@ int mail_transaction_log_file_lock(struct mail_transaction_log_file *file) void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file) { + unsigned int lock_time; + if (!file->locked) return; @@ -369,6 +373,12 @@ void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file) if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) return; + lock_time = time(NULL) - file->lock_created; + if (lock_time >= MAIL_TRANSCATION_LOG_LOCK_TIMEOUT) { + i_warning("Transaction log file %s was locked for %u seconds", + file->filepath, lock_time); + } + if (file->log->index->lock_method == FILE_LOCK_METHOD_DOTLOCK) { mail_transaction_log_file_undotlock(file); return; diff --git a/src/lib-index/mail-transaction-log-private.h b/src/lib-index/mail-transaction-log-private.h index 09dae1b6e0..26fddcde90 100644 --- a/src/lib-index/mail-transaction-log-private.h +++ b/src/lib-index/mail-transaction-log-private.h @@ -73,6 +73,7 @@ struct mail_transaction_log_file { struct modseq_cache modseq_cache[LOG_FILE_MODSEQ_CACHE_SIZE]; struct file_lock *file_lock; + time_t lock_created; unsigned int locked:1; unsigned int corrupted:1;