]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Include reason string in warnings about keeping transaction log locked...
authorTimo Sirainen <tss@iki.fi>
Thu, 9 Oct 2014 15:26:05 +0000 (18:26 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 9 Oct 2014 15:26:05 +0000 (18:26 +0300)
src/lib-index/mail-index-fsck.c
src/lib-index/mail-index-sync.c
src/lib-index/mail-transaction-log-append.c
src/lib-index/mail-transaction-log-file.c
src/lib-index/mail-transaction-log-private.h
src/lib-index/mail-transaction-log.c
src/lib-index/mail-transaction-log.h
src/lib-index/test-mail-transaction-log-append.c

index 5114559073661b15d69ddd1f1b721509ea7791fe..1c1463c14f74dac23c9a9312796afb990ec01525 100644 (file)
@@ -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;
 }
 
index 1e98d323a5d4149a627e95f3b51177bc567ec3c1..57aa1a1454f2f7742dcd22355a0737f1553491c2 100644 (file)
@@ -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);
index 20eb6b0e2d62d3fe3481f770ce24a8688fe6c3c2..bd19fcbbf938f041aac4f5b6eca23419369d13e4 100644 (file)
@@ -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);
index e7294e16ab6da3f7090211ba221a8ae5a2cf685c..8e11cc8f6ce90df77b16a28284bf25be861b01e8 100644 (file)
@@ -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) {
index 7d4693c5ecfea724eb382c8f578d67a555cc0c52..61d81a70d35fd22e6bb6a9ac54763cca2ac2768e 100644 (file)
@@ -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);
index 4e9488ae88abc108471c3a22d6253451f82ec790..138378b53badf09264c40e4e33bf9933f7a6e1c7 100644 (file)
@@ -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,
index 96f3fd278ec7e220a1818630773210fe2d6ec63c..d5a4c8201d96cfcd8916f308db068b2087600e24 100644 (file)
@@ -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);
index 890ab87f8916f497efdf532d564ca731c6975757..5880b851bc2dc42b88f2464d911c8f548eb5659d 100644 (file)
@@ -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,