changeset 8941:eb9e5ab575a9 HEAD

indexes: Error handling fixes.
author Timo Sirainen <tss@iki.fi>
date Mon, 13 Apr 2009 17:21:32 -0400
parents aba994bec90b
children 653197bf5f55
files 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
diffstat 4 files changed, 20 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-map.c	Mon Apr 13 16:11:15 2009 -0400
+++ b/src/lib-index/mail-index-map.c	Mon Apr 13 17:21:32 2009 -0400
@@ -942,11 +942,8 @@
 		   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 @@
 				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;
 }
--- a/src/lib-index/mail-transaction-log-append.c	Mon Apr 13 16:11:15 2009 -0400
+++ b/src/lib-index/mail-transaction-log-append.c	Mon Apr 13 17:21:32 2009 -0400
@@ -98,6 +98,10 @@
 	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;
--- a/src/lib-index/mail-transaction-log-file.c	Mon Apr 13 16:11:15 2009 -0400
+++ b/src/lib-index/mail-transaction-log-file.c	Mon Apr 13 17:21:32 2009 -0400
@@ -1564,6 +1564,7 @@
 		/* 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,
--- a/src/lib-index/mail-transaction-log.c	Mon Apr 13 16:11:15 2009 -0400
+++ b/src/lib-index/mail-transaction-log.c	Mon Apr 13 17:21:32 2009 -0400
@@ -160,6 +160,13 @@
 {
 	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 {