changeset 5714:dcf5dbb6a76a HEAD

mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to -log-file.c.
author Timo Sirainen <tss@iki.fi>
date Wed, 13 Jun 2007 19:45:29 +0300
parents e07a4c8ad2d5
children 11d39b7f07ff
files src/lib-index/mail-index.c src/lib-index/mail-transaction-log-file.c src/lib-index/mail-transaction-log-private.h src/lib-index/mail-transaction-log.c src/lib-index/mail-transaction-log.h
diffstat 5 files changed, 48 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index.c	Wed Jun 13 03:48:32 2007 +0300
+++ b/src/lib-index/mail-index.c	Wed Jun 13 19:45:29 2007 +0300
@@ -639,7 +639,6 @@
 int mail_index_move_to_memory(struct mail_index *index)
 {
 	struct mail_index_map *map;
-	int ret = 0;
 
 	if (MAIL_INDEX_IS_IN_MEMORY(index))
 		return index->map == NULL ? -1 : 0;
@@ -667,8 +666,7 @@
 
 	if (index->log != NULL) {
 		/* move transaction log to memory */
-		if (mail_transaction_log_move_to_memory(index->log) < 0)
-			ret = -1;
+		mail_transaction_log_move_to_memory(index->log);
 	}
 
 	if (index->file_lock != NULL)
@@ -678,8 +676,7 @@
 	if (close(index->fd) < 0)
 		mail_index_set_syscall_error(index, "close()");
 	index->fd = -1;
-
-	return ret;
+	return 0;
 }
 
 void mail_index_mark_corrupted(struct mail_index *index)
--- a/src/lib-index/mail-transaction-log-file.c	Wed Jun 13 03:48:32 2007 +0300
+++ b/src/lib-index/mail-transaction-log-file.c	Wed Jun 13 19:45:29 2007 +0300
@@ -742,8 +742,9 @@
 	return 0;
 }
 
-int mail_transaction_log_file_read(struct mail_transaction_log_file *file,
-				   uoff_t offset)
+static int
+mail_transaction_log_file_read(struct mail_transaction_log_file *file,
+			       uoff_t offset)
 {
 	void *data;
 	size_t size;
@@ -953,3 +954,39 @@
 
 	return 1;
 }
+
+void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file
+					      *file)
+{
+	buffer_t *buf;
+
+	if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file))
+		return;
+
+	if (file->mmap_base != NULL) {
+		/* just copy to memory */
+		i_assert(file->buffer_offset == 0);
+
+		buf = buffer_create_dynamic(default_pool, file->mmap_size);
+		buffer_append(buf, file->mmap_base, file->mmap_size);
+		buffer_free(file->buffer);
+		file->buffer = buf;
+
+		/* and lose the mmap */
+		if (munmap(file->mmap_base, file->mmap_size) < 0) {
+			mail_index_file_set_syscall_error(file->log->index,
+							  file->filepath,
+							  "munmap()");
+		}
+		file->mmap_base = NULL;
+	} else if (file->buffer_offset != 0) {
+		/* we don't have the full log in the memory. read it. */
+		(void)mail_transaction_log_file_read(file, 0);
+	}
+
+	if (close(file->fd) < 0) {
+		mail_index_file_set_syscall_error(file->log->index,
+						  file->filepath, "close()");
+	}
+	file->fd = -1;
+}
--- a/src/lib-index/mail-transaction-log-private.h	Wed Jun 13 03:48:32 2007 +0300
+++ b/src/lib-index/mail-transaction-log-private.h	Wed Jun 13 19:45:29 2007 +0300
@@ -90,8 +90,6 @@
 int mail_transaction_log_file_open(struct mail_transaction_log_file *file,
 				   bool check_existing);
 int mail_transaction_log_file_create(struct mail_transaction_log_file *file);
-int mail_transaction_log_file_read(struct mail_transaction_log_file *file,
-				   uoff_t offset);
 int mail_transaction_log_file_lock(struct mail_transaction_log_file *file);
 
 int mail_transaction_log_find_file(struct mail_transaction_log *log,
@@ -100,6 +98,8 @@
 
 int mail_transaction_log_file_map(struct mail_transaction_log_file *file,
 				  uoff_t start_offset, uoff_t end_offset);
+void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file
+					      *file);
 
 void mail_transaction_logs_clean(struct mail_transaction_log *log);
 
--- a/src/lib-index/mail-transaction-log.c	Wed Jun 13 03:48:32 2007 +0300
+++ b/src/lib-index/mail-transaction-log.c	Wed Jun 13 19:45:29 2007 +0300
@@ -131,42 +131,10 @@
 	i_free(log);
 }
 
-int mail_transaction_log_move_to_memory(struct mail_transaction_log *log)
+void mail_transaction_log_move_to_memory(struct mail_transaction_log *log)
 {
-	struct mail_transaction_log_file *file = log->head;
-
-	if (file == NULL || MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file))
-		return 0;
-
-	/* read the whole file to memory. we might currently be appending
-	   data into it, so we want to read it up to end of file */
-        file->buffer_offset = 0;
-
-	if (file->buffer != NULL) {
-		buffer_free(file->buffer);
-		file->buffer = NULL;
-	}
-
-	if (file->mmap_base != NULL) {
-		if (munmap(file->mmap_base, file->mmap_size) < 0) {
-			mail_index_file_set_syscall_error(file->log->index,
-							  file->filepath,
-							  "munmap()");
-		}
-		file->mmap_base = NULL;
-	}
-
-	if (mail_transaction_log_file_read(file, 0) <= 0)
-		return -1;
-
-	/* after we've read the file into memory, make it into in-memory
-	   log file */
-	if (close(file->fd) < 0) {
-		mail_index_file_set_syscall_error(file->log->index,
-						  file->filepath, "close()");
-	}
-	file->fd = -1;
-	return 0;
+	if (log->head != NULL)
+		mail_transaction_log_file_move_to_memory(log->head);
 }
 
 void mail_transaction_logs_clean(struct mail_transaction_log *log)
--- a/src/lib-index/mail-transaction-log.h	Wed Jun 13 03:48:32 2007 +0300
+++ b/src/lib-index/mail-transaction-log.h	Wed Jun 13 19:45:29 2007 +0300
@@ -191,8 +191,8 @@
 bool mail_transaction_log_is_head_prev(struct mail_transaction_log *log,
 				       uint32_t file_seq, uoff_t file_offset);
 
-/* Move currently opened log files to memory (called by
+/* Move currently opened log head file to memory (called by
    mail_index_move_to_memory()) */
-int mail_transaction_log_move_to_memory(struct mail_transaction_log *log);
+void mail_transaction_log_move_to_memory(struct mail_transaction_log *log);
 
 #endif