}
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;
}
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;
}
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);
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;
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;
}
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;
}
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;
}
}
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,
/* 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);