From: Timo Sirainen Date: Mon, 13 Apr 2009 21:21:32 +0000 (-0400) Subject: indexes: Error handling fixes. X-Git-Tag: 2.0.alpha1~955 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f90ce01176bd920609d9d12e6419b9ba27c1359;p=thirdparty%2Fdovecot%2Fcore.git indexes: Error handling fixes. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-map.c b/src/lib-index/mail-index-map.c index 34e8b106f8..cd20b50789 100644 --- a/src/lib-index/mail-index-map.c +++ b/src/lib-index/mail-index-map.c @@ -942,11 +942,8 @@ int mail_index_map(struct mail_index *index, 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) { @@ -955,10 +952,15 @@ int mail_index_map(struct mail_index *index, 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; } diff --git a/src/lib-index/mail-transaction-log-append.c b/src/lib-index/mail-transaction-log-append.c index be8bf22d7d..240675c547 100644 --- a/src/lib-index/mail-transaction-log-append.c +++ b/src/lib-index/mail-transaction-log-append.c @@ -98,6 +98,10 @@ static int log_buffer_write(struct log_append_context *ctx, bool want_fsync) 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; diff --git a/src/lib-index/mail-transaction-log-file.c b/src/lib-index/mail-transaction-log-file.c index 434044f64d..54a20ab45b 100644 --- a/src/lib-index/mail-transaction-log-file.c +++ b/src/lib-index/mail-transaction-log-file.c @@ -1566,6 +1566,7 @@ void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file /* 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, diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 8eb60501cc..68b3ba5b7c 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -160,6 +160,13 @@ void mail_transaction_log_move_to_memory(struct mail_transaction_log *log) { 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 {