logs (which we'll also do even if the reopening succeeds).
if index files are unusable (e.g. major version change)
don't even try to use the transaction log. */
- if (mail_index_map_latest_file(index) == 0) {
- /* make sure we don't try to open the file again */
- if (unlink(index->filepath) < 0 && errno != ENOENT)
- mail_index_set_syscall_error(index, "unlink()");
- } else {
+ ret = mail_index_map_latest_file(index);
+ if (ret > 0) {
/* if we're creating the index file, we don't have any
logs yet */
if (index->log->head != NULL && index->indexid != 0) {
ret = mail_index_sync_map(&index->map, type,
TRUE);
}
+ } else if (ret == 0) {
+ /* make sure we don't try to open the file again */
+ if (unlink(index->filepath) < 0 && errno != ENOENT)
+ mail_index_set_syscall_error(index, "unlink()");
}
}
- index->initial_mapped = TRUE;
+ if (ret >= 0)
+ index->initial_mapped = TRUE;
index->mapping = FALSE;
return ret;
}
struct mail_transaction_log_file *file = ctx->file;
if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) {
+ if (file->buffer == NULL) {
+ file->buffer = buffer_create_dynamic(default_pool, 4096);
+ file->buffer_offset = sizeof(file->hdr);
+ }
buffer_append_buf(file->buffer, ctx->output, 0, (size_t)-1);
file->sync_offset = file->buffer_offset + file->buffer->used;
return 0;
/* we don't have the full log in the memory. read it. */
(void)mail_transaction_log_file_read(file, 0, FALSE);
}
+ file->last_size = 0;
if (close(file->fd) < 0) {
mail_index_file_set_syscall_error(file->log->index,
{
struct mail_transaction_log_file *file;
+ if (!log->index->initial_mapped && log->files != NULL &&
+ log->files->hdr.prev_file_seq != 0) {
+ /* we couldn't read dovecot.index and we don't have the first
+ .log file, so just start from scratch */
+ mail_transaction_log_close(log);
+ }
+
if (log->head != NULL)
mail_transaction_log_file_move_to_memory(log->head);
else {