]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Small improvements to logging the reason for long transaction log lock...
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 22 Feb 2016 09:15:52 +0000 (11:15 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 22 Feb 2016 09:15:52 +0000 (11:15 +0200)
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-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 2845b941ae01d100d9c0eea179070dbb2758deb7..850ae93c5d6677b703fb423d9129ecd97b066ea7 100644 (file)
@@ -441,8 +441,8 @@ int mail_index_fsck(struct mail_index *index)
        }
 
        if (!orig_locked) {
-               if (mail_transaction_log_sync_lock(index->log, &file_seq,
-                                                  &file_offset) < 0)
+               if (mail_transaction_log_sync_lock(index->log, "fscking",
+                                                  &file_seq, &file_offset) < 0)
                        return -1;
        }
 
@@ -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, "fsck");
+               mail_transaction_log_sync_unlock(index->log, "fscking");
        return 0;
 }
 
index 405aa4c4cf2cbb98a704b51388d425118ef2c08f..023e54fa1c8a48a22ce0b5ec76279b9e11922771 100644 (file)
@@ -328,7 +328,7 @@ mail_index_sync_begin_init(struct mail_index *index,
        /* if we require changes, don't lock transaction log yet. first check
           if there's anything to sync. */
        if ((flags & MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES) == 0) {
-               if (mail_transaction_log_sync_lock(index->log,
+               if (mail_transaction_log_sync_lock(index->log, "syncing",
                                                   &seq, &offset) < 0)
                        return -1;
                locked = TRUE;
index cc5ee7d884c4aeea9bc1ee7ba7b639a04354b80e..9fd4c1387cec3712622a815a5d40b37f1e78fe6b 100644 (file)
@@ -221,7 +221,7 @@ int mail_transaction_log_append_begin(struct mail_index *index,
        struct mail_transaction_boundary boundary;
 
        if (!index->log_sync_locked) {
-               if (mail_transaction_log_lock_head(index->log) < 0)
+               if (mail_transaction_log_lock_head(index->log, "appending") < 0)
                        return -1;
        }
        ctx = i_new(struct mail_transaction_log_append_ctx, 1);
index 61d81a70d35fd22e6bb6a9ac54763cca2ac2768e..a0e0c8c988033a9743f54a7c73fdeee173c589d2 100644 (file)
@@ -136,7 +136,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);
+int mail_transaction_log_lock_head(struct mail_transaction_log *log,
+                                  const char *lock_reason);
 void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file,
                                      const char *lock_reason);
 
index 243f32ebddf96b81bf4bd83fd2eeac1b3a2691c4..ce71d0afe5385dc0edbe74dbb9fb12df6341b158 100644 (file)
@@ -421,7 +421,8 @@ int mail_transaction_log_find_file(struct mail_transaction_log *log,
        return 1;
 }
 
-int mail_transaction_log_lock_head(struct mail_transaction_log *log)
+int mail_transaction_log_lock_head(struct mail_transaction_log *log,
+                                  const char *lock_reason)
 {
        struct mail_transaction_log_file *file;
        time_t lock_wait_started, lock_secs = 0;
@@ -455,7 +456,8 @@ 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_log_file_unlock(file, t_strdup_printf(
+                               "trying to lock head for %s", lock_reason));
                        mail_transaction_logs_clean(log);
                        file = NULL;
                }
@@ -467,9 +469,10 @@ int mail_transaction_log_lock_head(struct mail_transaction_log *log)
                        break;
                }
 
-               if (file != NULL)
-                       mail_transaction_log_file_unlock(file, "trying to lock head");
-
+               if (file != NULL) {
+                       mail_transaction_log_file_unlock(file, t_strdup_printf(
+                               "trying to lock head for %s", lock_reason));
+               }
                if (ret < 0)
                        break;
 
@@ -485,17 +488,19 @@ int mail_transaction_log_lock_head(struct mail_transaction_log *log)
 }
 
 int mail_transaction_log_sync_lock(struct mail_transaction_log *log,
+                                  const char *lock_reason,
                                   uint32_t *file_seq_r, uoff_t *file_offset_r)
 {
        i_assert(!log->index->log_sync_locked);
 
-       if (mail_transaction_log_lock_head(log) < 0)
+       if (mail_transaction_log_lock_head(log, lock_reason) < 0)
                return -1;
 
        /* 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, "trying to lock syncing");
+               mail_transaction_log_file_unlock(log->head, t_strdup_printf(
+                       "%s - map failed", lock_reason));
                return -1;
        }
 
@@ -506,12 +511,12 @@ int mail_transaction_log_sync_lock(struct mail_transaction_log *log,
 }
 
 void mail_transaction_log_sync_unlock(struct mail_transaction_log *log,
-                                     const char *log_reason)
+                                     const char *lock_reason)
 {
        i_assert(log->index->log_sync_locked);
 
        log->index->log_sync_locked = FALSE;
-       mail_transaction_log_file_unlock(log->head, log_reason);
+       mail_transaction_log_file_unlock(log->head, lock_reason);
 }
 
 void mail_transaction_log_get_head(struct mail_transaction_log *log,
index e75ecd034d8cdbb4964db055de833aedd6d78c7b..f1e997309b05ac07302f07304dd2f84778bc7a01 100644 (file)
@@ -278,6 +278,7 @@ int mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx **
 /* Lock transaction log for index synchronization. Log cannot be read or
    written to while it's locked. Returns end offset. */
 int mail_transaction_log_sync_lock(struct mail_transaction_log *log,
+                                  const char *lock_reason,
                                   uint32_t *file_seq_r, uoff_t *file_offset_r);
 void mail_transaction_log_sync_unlock(struct mail_transaction_log *log,
                                      const char *lock_reason);
index a2b560e0757b5ac554595e1414c63bf2295f957c..58cc966b1961c6c84fc9ecfde56713dc7b73bfe8 100644 (file)
@@ -16,7 +16,8 @@ void mail_index_file_set_syscall_error(struct mail_index *index ATTR_UNUSED,
 {
 }
 
-int mail_transaction_log_lock_head(struct mail_transaction_log *log ATTR_UNUSED)
+int mail_transaction_log_lock_head(struct mail_transaction_log *log ATTR_UNUSED,
+                                  const char *lock_reason ATTR_UNUSED)
 {
        return log_lock_failure ? -1 : 0;
 }