changeset 19800:363311913f82

lib-index: Added mail_index_sync_set_reason() to improve lock wait log warnings
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 22 Feb 2016 11:46:13 +0200
parents 8dfbf0629359
children 30573edaa04f
files src/lib-index/mail-index-sync.c src/lib-index/mail-index.h
diffstat 2 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-sync.c	Mon Feb 22 11:15:52 2016 +0200
+++ b/src/lib-index/mail-index-sync.c	Mon Feb 22 11:46:13 2016 +0200
@@ -16,6 +16,7 @@
 	struct mail_index_transaction *sync_trans, *ext_trans;
 	struct mail_index_transaction_commit_result *sync_commit_result;
 	enum mail_index_sync_flags flags;
+	char *reason;
 
 	const struct mail_transaction_header *hdr;
 	const void *data;
@@ -732,22 +733,36 @@
 	ctx->no_warning = TRUE;
 }
 
+void mail_index_sync_set_reason(struct mail_index_sync_ctx *ctx,
+				const char *reason)
+{
+	i_free(ctx->reason);
+	ctx->reason = i_strdup(reason);
+}
+
 static void mail_index_sync_end(struct mail_index_sync_ctx **_ctx)
 {
         struct mail_index_sync_ctx *ctx = *_ctx;
+	const char *lock_reason;
 
 	i_assert(ctx->index->syncing);
 
 	*_ctx = NULL;
 
 	ctx->index->syncing = FALSE;
-	mail_transaction_log_sync_unlock(ctx->index->log,
-		ctx->no_warning ? NULL : "Mailbox was synchronized");
+	if (ctx->no_warning)
+		lock_reason = NULL;
+	else if (ctx->reason != NULL)
+		lock_reason = ctx->reason;
+	else
+		lock_reason = "Mailbox was synchronized";
+	mail_transaction_log_sync_unlock(ctx->index->log, lock_reason);
 
 	mail_index_view_close(&ctx->view);
 	mail_index_transaction_rollback(&ctx->sync_trans);
 	if (array_is_created(&ctx->sync_list))
 		array_free(&ctx->sync_list);
+	i_free(ctx->reason);
 	i_free(ctx);
 }
 
--- a/src/lib-index/mail-index.h	Mon Feb 22 11:15:52 2016 +0200
+++ b/src/lib-index/mail-index.h	Mon Feb 22 11:46:13 2016 +0200
@@ -386,6 +386,11 @@
    MAIL_TRANSACTION_LOG_LOCK_WARN_SECS seconds. Usually this is called because
    the caller itself already logged a warning about it. */
 void mail_index_sync_no_warning(struct mail_index_sync_ctx *ctx);
+/* If a warning is logged because syncing took over
+   MAIL_TRANSACTION_LOG_LOCK_WARN_SECS seconds, log this as the reason for the
+   syncing. */
+void mail_index_sync_set_reason(struct mail_index_sync_ctx *ctx,
+				const char *reason);
 /* Commit synchronization by writing all changes to mail index file. */
 int mail_index_sync_commit(struct mail_index_sync_ctx **ctx);
 /* Rollback synchronization - none of the changes listed by sync_next() are