]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
indexes: Error handling fixes.
authorTimo Sirainen <tss@iki.fi>
Mon, 13 Apr 2009 21:21:32 +0000 (17:21 -0400)
committerTimo Sirainen <tss@iki.fi>
Mon, 13 Apr 2009 21:21:32 +0000 (17:21 -0400)
--HG--
branch : HEAD

src/lib-index/mail-index-map.c
src/lib-index/mail-transaction-log-append.c
src/lib-index/mail-transaction-log-file.c
src/lib-index/mail-transaction-log.c

index 34e8b106f8f8c449e0ca5939bdede529acc70d56..cd20b507896eb2d632c37911920a87982ea894fb 100644 (file)
@@ -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;
 }
index be8bf22d7dfd9c149a7c3213add9e1cbc646d8f8..240675c54719cbb4756fd858adeacc94c97efbdb 100644 (file)
@@ -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;
index 434044f64d7198ca3eb6b548717e08cf9e0c9738..54a20ab45b60a79d9b70d365956e9564ce00edfd 100644 (file)
@@ -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,
index 8eb60501cc6246c40aeab53e965c643a369c3bf0..68b3ba5b7cd27046606e0cc6fc8c6273856b1d8b 100644 (file)
@@ -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 {