]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Don't ignore mail_transaction_log_move_to_memory() failure
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 6 Jun 2017 12:31:01 +0000 (15:31 +0300)
committerGitLab <gitlab@git.dovecot.net>
Mon, 12 Jun 2017 07:55:15 +0000 (10:55 +0300)
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

index 537a998114fd63448c508e1df4b28ed1430d9198..6665c293dec75bea923b5f0234bf666d44a06b94 100644 (file)
@@ -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;
 }
 
index cdb44eb89c2106bbd6480c652344ffbf7ee719ec..176b54f0e170d16ebddd236ab8ca293b6533f593 100644 (file)
@@ -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;
 }
index f94b59bb5296c91b4c9d0fe8e0f33b71a42e8c4d..8591b35665ba55db475cf55249c1c816a1ea6dc8 100644 (file)
@@ -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);
 
index 40d09952c08f7481b1a5331c3ad761c1a732daff..354b6f1e993736f79e5150eea776cc6450567aa4 100644 (file)
@@ -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;
        }
 }
 
index 794f7c8df38d5e26460ad27c570f353d002765fe..18281695f18a7655e731e2ab32b8119fb8190c03 100644 (file)
@@ -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,