int mail_index_fsck(struct mail_index *index)
{
- bool orig_locked = index->log_locked;
+ bool orig_locked = index->log_sync_locked;
struct mail_index_map *map;
uint32_t file_seq;
uoff_t file_offset;
{
int ret;
- i_assert(index->log_locked);
+ i_assert(index->log_sync_locked);
ret = mail_index_fsck(index);
i_assert(ret == 0);
}
unsigned int index_delete_requested:1; /* next sync sets it deleted */
unsigned int index_deleted:1; /* no changes allowed anymore */
- unsigned int log_locked:1;
+ unsigned int log_sync_locked:1;
unsigned int readonly:1;
unsigned int mapping:1;
unsigned int syncing:1;
}
file = t->view->index->log->head;
- if (!t->view->index->log_locked) {
+ if (!t->view->index->log_sync_locked) {
/* update sync_offset */
if (mail_transaction_log_file_map(file, file->sync_offset,
(uoff_t)-1) <= 0)
unsigned int lock_id;
int ret;
- i_assert(index->log_locked);
+ i_assert(index->log_sync_locked);
if (!mail_index_map_has_changed(map) || index->readonly)
return;
index->readonly = FALSE;
index->nodiskspace = FALSE;
index->index_lock_timeout = FALSE;
- index->log_locked = FALSE;
+ index->log_sync_locked = FALSE;
index->flags = flags;
index->readonly = (flags & MAIL_INDEX_OPEN_FLAG_READONLY) != 0;
{
struct mail_transaction_log_append_ctx *ctx;
- if (!index->log_locked) {
+ if (!index->log_sync_locked) {
if (mail_transaction_log_lock_head(index->log) < 0)
return -1;
}
*_ctx = NULL;
ret = mail_transaction_log_append_locked(ctx);
- if (!index->log_locked)
+ if (!index->log_sync_locked)
mail_transaction_log_file_unlock(index->log->head);
buffer_free(&ctx->output);
return;
file->locked = FALSE;
+ file->locked_sync_offset_updated = FALSE;
if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file))
return;
i_assert(start_offset >= file->hdr.hdr_size);
i_assert(start_offset <= end_offset);
- if (index->log_locked && file == file->log->head &&
+ if (file->locked_sync_offset_updated && file == file->log->head &&
end_offset == (uoff_t)-1) {
/* we're not interested of going further than sync_offset */
if (log_file_map_check_offsets(file, start_offset,
end_offset = file->sync_offset;
}
+ if (file->locked)
+ file->locked_sync_offset_updated = TRUE;
+
if (file->buffer != NULL && file->buffer_offset <= start_offset) {
/* see if we already have it */
size = buffer_get_used_size(file->buffer);
time_t lock_created;
unsigned int locked:1;
+ unsigned int locked_sync_offset_updated:1;
unsigned int corrupted:1;
};
int mail_transaction_log_sync_lock(struct mail_transaction_log *log,
uint32_t *file_seq_r, uoff_t *file_offset_r)
{
- i_assert(!log->index->log_locked);
+ i_assert(!log->index->log_sync_locked);
if (mail_transaction_log_lock_head(log) < 0)
return -1;
return -1;
}
- log->index->log_locked = TRUE;
+ log->index->log_sync_locked = TRUE;
*file_seq_r = log->head->hdr.file_seq;
*file_offset_r = log->head->sync_offset;
return 0;
void mail_transaction_log_sync_unlock(struct mail_transaction_log *log)
{
- i_assert(log->index->log_locked);
+ i_assert(log->index->log_sync_locked);
- log->index->log_locked = FALSE;
+ log->index->log_sync_locked = FALSE;
mail_transaction_log_file_unlock(log->head);
}
log = i_new(struct mail_transaction_log, 1);
log->index = i_new(struct mail_index, 1);
log->index->log = log;
- log->index->log_locked = TRUE;
+ log->index->log_sync_locked = TRUE;
test_transaction_log_file_add(1);
test_transaction_log_file_add(2);
test_transaction_log_file_add(3);