From: Timo Sirainen Date: Thu, 9 Oct 2014 15:26:05 +0000 (+0300) Subject: lib-index: Include reason string in warnings about keeping transaction log locked... X-Git-Tag: 2.2.14~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2f8da04d700cc23fcd6630226a4866e828b761bd;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Include reason string in warnings about keeping transaction log locked for too long. --- diff --git a/src/lib-index/mail-index-fsck.c b/src/lib-index/mail-index-fsck.c index 5114559073..1c1463c14f 100644 --- a/src/lib-index/mail-index-fsck.c +++ b/src/lib-index/mail-index-fsck.c @@ -457,7 +457,7 @@ int mail_index_fsck(struct mail_index *index) mail_index_write(index, FALSE); if (!orig_locked) - mail_transaction_log_sync_unlock(index->log); + mail_transaction_log_sync_unlock(index->log, "fsck"); return 0; } diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index 1e98d323a5..57aa1a1454 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -348,14 +348,14 @@ mail_index_sync_begin_init(struct mail_index *index, if ((ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD)) <= 0) { if (ret == 0) { if (locked) - mail_transaction_log_sync_unlock(index->log); + mail_transaction_log_sync_unlock(index->log, "sync init failure"); return -1; } /* let's try again */ if (mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) { if (locked) - mail_transaction_log_sync_unlock(index->log); + mail_transaction_log_sync_unlock(index->log, "sync init failure"); return -1; } } @@ -363,7 +363,7 @@ mail_index_sync_begin_init(struct mail_index *index, if (!mail_index_need_sync(index, flags, log_file_seq, log_file_offset) && !index->index_deleted) { if (locked) - mail_transaction_log_sync_unlock(index->log); + mail_transaction_log_sync_unlock(index->log, "syncing determined unnecessary"); return 0; } @@ -379,7 +379,7 @@ mail_index_sync_begin_init(struct mail_index *index, (flags & MAIL_INDEX_SYNC_FLAG_DELETING_INDEX) == 0) { /* index is already deleted. we can't sync. */ if (locked) - mail_transaction_log_sync_unlock(index->log); + mail_transaction_log_sync_unlock(index->log, "syncing detected deleted index"); return -1; } @@ -725,7 +725,8 @@ static void mail_index_sync_end(struct mail_index_sync_ctx **_ctx) *_ctx = NULL; ctx->index->syncing = FALSE; - mail_transaction_log_sync_unlock(ctx->index->log); + mail_transaction_log_sync_unlock(ctx->index->log, + "Mailbox was synchronized"); mail_index_view_close(&ctx->view); mail_index_transaction_rollback(&ctx->sync_trans); diff --git a/src/lib-index/mail-transaction-log-append.c b/src/lib-index/mail-transaction-log-append.c index 20eb6b0e2d..bd19fcbbf9 100644 --- a/src/lib-index/mail-transaction-log-append.c +++ b/src/lib-index/mail-transaction-log-append.c @@ -247,7 +247,7 @@ int mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx ** ret = mail_transaction_log_append_locked(ctx); if (!index->log_sync_locked) - mail_transaction_log_file_unlock(index->log->head); + mail_transaction_log_file_unlock(index->log->head, "appending"); buffer_free(&ctx->output); i_free(ctx); diff --git a/src/lib-index/mail-transaction-log-file.c b/src/lib-index/mail-transaction-log-file.c index e7294e16ab..8e11cc8f6c 100644 --- a/src/lib-index/mail-transaction-log-file.c +++ b/src/lib-index/mail-transaction-log-file.c @@ -394,7 +394,8 @@ int mail_transaction_log_file_lock(struct mail_transaction_log_file *file) return -1; } -void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file) +void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file, + const char *lock_reason) { unsigned int lock_time; @@ -408,9 +409,9 @@ void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file) return; lock_time = time(NULL) - file->lock_created; - if (lock_time >= MAIL_TRANSACTION_LOG_LOCK_TIMEOUT) { - i_warning("Transaction log file %s was locked for %u seconds", - file->filepath, lock_time); + if (lock_time >= MAIL_TRANSACTION_LOG_LOCK_TIMEOUT && lock_reason != NULL) { + i_warning("Transaction log file %s was locked for %u seconds (%s)", + file->filepath, lock_time, lock_reason); } if (file->log->index->lock_method == FILE_LOCK_METHOD_DOTLOCK) { diff --git a/src/lib-index/mail-transaction-log-private.h b/src/lib-index/mail-transaction-log-private.h index 7d4693c5ec..61d81a70d3 100644 --- a/src/lib-index/mail-transaction-log-private.h +++ b/src/lib-index/mail-transaction-log-private.h @@ -137,7 +137,8 @@ void mail_transaction_logs_clean(struct mail_transaction_log *log); bool mail_transaction_log_want_rotate(struct mail_transaction_log *log); int mail_transaction_log_rotate(struct mail_transaction_log *log, bool reset); int mail_transaction_log_lock_head(struct mail_transaction_log *log); -void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file); +void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file, + const char *lock_reason); void mail_transaction_update_modseq(const struct mail_transaction_header *hdr, const void *data, uint64_t *cur_modseq); diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 4e9488ae88..138378b53b 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -269,7 +269,9 @@ int mail_transaction_log_rotate(struct mail_transaction_log *log, bool reset) else { /* the newly created log file is already locked */ i_assert(file->locked); - mail_transaction_log_file_unlock(log->head); + mail_transaction_log_file_unlock(log->head, + !log->index->log_sync_locked ? "rotating" : + "rotating while syncing"); } mail_transaction_log_set_head(log, file); return 0; @@ -448,6 +450,7 @@ int mail_transaction_log_lock_head(struct mail_transaction_log *log) file->refcount++; ret = mail_transaction_log_refresh(log, TRUE); if (--file->refcount == 0) { + mail_transaction_log_file_unlock(file, "trying to lock head"); mail_transaction_logs_clean(log); file = NULL; } @@ -460,7 +463,7 @@ int mail_transaction_log_lock_head(struct mail_transaction_log *log) } if (file != NULL) - mail_transaction_log_file_unlock(file); + mail_transaction_log_file_unlock(file, "trying to lock head"); if (ret < 0) break; @@ -487,7 +490,7 @@ int mail_transaction_log_sync_lock(struct mail_transaction_log *log, /* update sync_offset */ if (mail_transaction_log_file_map(log->head, log->head->sync_offset, (uoff_t)-1) <= 0) { - mail_transaction_log_file_unlock(log->head); + mail_transaction_log_file_unlock(log->head, "trying to lock syncing"); return -1; } @@ -497,12 +500,13 @@ int mail_transaction_log_sync_lock(struct mail_transaction_log *log, return 0; } -void mail_transaction_log_sync_unlock(struct mail_transaction_log *log) +void mail_transaction_log_sync_unlock(struct mail_transaction_log *log, + const char *log_reason) { i_assert(log->index->log_sync_locked); log->index->log_sync_locked = FALSE; - mail_transaction_log_file_unlock(log->head); + mail_transaction_log_file_unlock(log->head, log_reason); } void mail_transaction_log_get_head(struct mail_transaction_log *log, diff --git a/src/lib-index/mail-transaction-log.h b/src/lib-index/mail-transaction-log.h index 96f3fd278e..d5a4c8201d 100644 --- a/src/lib-index/mail-transaction-log.h +++ b/src/lib-index/mail-transaction-log.h @@ -279,7 +279,8 @@ int mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx ** written to while it's locked. Returns end offset. */ int mail_transaction_log_sync_lock(struct mail_transaction_log *log, uint32_t *file_seq_r, uoff_t *file_offset_r); -void mail_transaction_log_sync_unlock(struct mail_transaction_log *log); +void mail_transaction_log_sync_unlock(struct mail_transaction_log *log, + const char *lock_reason); /* Returns the current head. Works only when log is locked. */ void mail_transaction_log_get_head(struct mail_transaction_log *log, uint32_t *file_seq_r, uoff_t *file_offset_r); diff --git a/src/lib-index/test-mail-transaction-log-append.c b/src/lib-index/test-mail-transaction-log-append.c index 890ab87f89..5880b851bc 100644 --- a/src/lib-index/test-mail-transaction-log-append.c +++ b/src/lib-index/test-mail-transaction-log-append.c @@ -22,7 +22,8 @@ int mail_transaction_log_lock_head(struct mail_transaction_log *log ATTR_UNUSED) return log_lock_failure ? -1 : 0; } -void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file ATTR_UNUSED) {} +void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file ATTR_UNUSED, + const char *lock_reason ATTR_UNUSED) {} void mail_transaction_update_modseq(const struct mail_transaction_header *hdr, const void *data ATTR_UNUSED,