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;
}
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;
}
}
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;
}
(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;
}
*_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);
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);
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;
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) {
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);
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;
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;
}
}
if (file != NULL)
- mail_transaction_log_file_unlock(file);
+ mail_transaction_log_file_unlock(file, "trying to lock head");
if (ret < 0)
break;
/* 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;
}
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,
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);
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,