From: Timo Sirainen Date: Tue, 6 Jun 2017 12:31:01 +0000 (+0300) Subject: lib-index: Don't ignore mail_transaction_log_move_to_memory() failure X-Git-Tag: 2.3.0.rc1~1449 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5b809b97673fb0a73aa5b9d82122612d699f6c5b;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Don't ignore mail_transaction_log_move_to_memory() failure --- diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 537a998114..6665c293de 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -806,6 +806,14 @@ bool mail_index_is_in_memory(struct mail_index *index) return MAIL_INDEX_IS_IN_MEMORY(index); } +static void mail_index_set_as_in_memory(struct mail_index *index) +{ + i_free_and_null(index->dir); + + i_free(index->filepath); + index->filepath = i_strdup("(in-memory index)"); +} + int mail_index_move_to_memory(struct mail_index *index) { struct mail_index_map *map; @@ -816,16 +824,11 @@ int mail_index_move_to_memory(struct mail_index *index) if ((index->flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0) return -1; - /* set the index as being into memory */ - i_free_and_null(index->dir); - - i_free(index->filepath); - index->filepath = i_strdup("(in-memory index)"); - if (index->map == NULL) { /* index was never even opened. just mark it as being in memory and let the caller re-open the index. */ i_assert(index->fd == -1); + mail_index_set_as_in_memory(index); return -1; } @@ -838,7 +841,8 @@ int mail_index_move_to_memory(struct mail_index *index) if (index->log != NULL) { /* move transaction log to memory */ - mail_transaction_log_move_to_memory(index->log); + if (mail_transaction_log_move_to_memory(index->log) < 0) + return -1; } if (index->fd != -1) { @@ -846,6 +850,7 @@ int mail_index_move_to_memory(struct mail_index *index) mail_index_set_syscall_error(index, "close()"); index->fd = -1; } + mail_index_set_as_in_memory(index); return 0; } diff --git a/src/lib-index/mail-transaction-log-file.c b/src/lib-index/mail-transaction-log-file.c index cdb44eb89c..176b54f0e1 100644 --- a/src/lib-index/mail-transaction-log-file.c +++ b/src/lib-index/mail-transaction-log-file.c @@ -1890,14 +1890,14 @@ int mail_transaction_log_file_map(struct mail_transaction_log_file *file, reason_r) ? 1 : 0; } -void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file - *file) +int mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file *file) { const char *error; buffer_t *buf; + int ret = 0; if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) - return; + return 0; if (file->mmap_base != NULL) { /* just copy to memory */ @@ -1914,7 +1914,11 @@ void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file 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, FALSE, &error); + ret = mail_transaction_log_file_read(file, 0, FALSE, &error); + if (ret <= 0) { + mail_index_set_error(file->log->index, + "%s: Failed to read into memory: %s", file->filepath, error); + } } file->last_size = 0; @@ -1924,4 +1928,5 @@ void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file i_free(file->filepath); file->filepath = i_strdup(file->log->filepath); + return ret < 0 ? -1 : 0; } diff --git a/src/lib-index/mail-transaction-log-private.h b/src/lib-index/mail-transaction-log-private.h index f94b59bb52..8591b35665 100644 --- a/src/lib-index/mail-transaction-log-private.h +++ b/src/lib-index/mail-transaction-log-private.h @@ -136,8 +136,7 @@ int mail_transaction_log_find_file(struct mail_transaction_log *log, int mail_transaction_log_file_map(struct mail_transaction_log_file *file, uoff_t start_offset, uoff_t end_offset, const char **reason_r); -void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file - *file); +int mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file *file); void mail_transaction_logs_clean(struct mail_transaction_log *log); diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 40d09952c0..354b6f1e99 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -144,7 +144,7 @@ void mail_transaction_log_free(struct mail_transaction_log **_log) i_free(log); } -void mail_transaction_log_move_to_memory(struct mail_transaction_log *log) +int mail_transaction_log_move_to_memory(struct mail_transaction_log *log) { struct mail_transaction_log_file *file; @@ -162,10 +162,11 @@ void mail_transaction_log_move_to_memory(struct mail_transaction_log *log) log->filepath2 = i_strconcat(log->filepath, ".2", NULL); if (log->head != NULL) - mail_transaction_log_file_move_to_memory(log->head); + return mail_transaction_log_file_move_to_memory(log->head); else { file = mail_transaction_log_file_alloc_in_memory(log); mail_transaction_log_set_head(log, file); + return 0; } } diff --git a/src/lib-index/mail-transaction-log.h b/src/lib-index/mail-transaction-log.h index 794f7c8df3..18281695f1 100644 --- a/src/lib-index/mail-transaction-log.h +++ b/src/lib-index/mail-transaction-log.h @@ -306,7 +306,7 @@ bool mail_transaction_log_is_head_prev(struct mail_transaction_log *log, /* Move currently opened log head file to memory (called by mail_index_move_to_memory()) */ -void mail_transaction_log_move_to_memory(struct mail_transaction_log *log); +int mail_transaction_log_move_to_memory(struct mail_transaction_log *log); /* Returns mtime of the transaction log head file. If it doesn't exist, mtime_r is set to 0. */ int mail_transaction_log_get_mtime(struct mail_transaction_log *log,