]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: mail_transaction_log_file_get_highest_modseq_at() - Separate I/O errors...
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 10 Aug 2020 14:06:05 +0000 (17:06 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Mon, 23 Nov 2020 13:19:54 +0000 (13:19 +0000)
src/lib-index/mail-transaction-log-file.c
src/lib-index/mail-transaction-log-private.h
src/lib-index/mail-transaction-log-view.c
src/lib-index/test-mail-transaction-log-file.c
src/lib-index/test-mail-transaction-log-view.c

index 9a18cb89f058be33570f76d04932a17f69cb87b2..8111dc9a15fa00ae20ea284f889f272ee2ceb7a2 100644 (file)
@@ -1208,7 +1208,7 @@ int mail_transaction_log_file_get_highest_modseq_at(
 
        if (offset == file->sync_offset) {
                *highest_modseq_r = file->sync_highest_modseq;
-               return 0;
+               return 1;
        }
 
        cache = modseq_cache_get_offset(file, offset);
@@ -1219,7 +1219,7 @@ int mail_transaction_log_file_get_highest_modseq_at(
        } else if (cache->offset == offset) {
                /* exact cache hit */
                *highest_modseq_r = cache->highest_modseq;
-               return 0;
+               return 1;
        } else {
                /* use cache to skip over some records */
                cur_offset = cache->offset;
@@ -1232,14 +1232,14 @@ int mail_transaction_log_file_get_highest_modseq_at(
                        "Failed to map transaction log %s for getting modseq "
                        "at offset=%"PRIuUOFF_T" with start_offset=%"PRIuUOFF_T": %s",
                        file->filepath, offset, cur_offset, reason);
-               return -1;
+               return ret;
        }
 
        i_assert(cur_offset >= file->buffer_offset);
        i_assert(cur_offset + file->buffer->used >= offset);
        while (cur_offset < offset) {
                if (log_get_synced_record(file, &cur_offset, &hdr, error_r) < 0)
-                       return- 1;
+                       return 0;
                mail_transaction_update_modseq(hdr, hdr + 1, &cur_modseq,
                        MAIL_TRANSACTION_LOG_HDR_VERSION(&file->hdr));
        }
@@ -1252,7 +1252,7 @@ int mail_transaction_log_file_get_highest_modseq_at(
        file->modseq_cache[0].highest_modseq = cur_modseq;
 
        *highest_modseq_r = cur_modseq;
-       return 0;
+       return 1;
 }
 
 static int
index 23ea51d32023defb6d8326247eeb5e4ff2a0e440..4fa5892dd9f60af48be95ce8039bb874d576046f 100644 (file)
@@ -142,6 +142,8 @@ void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file,
 void mail_transaction_update_modseq(const struct mail_transaction_header *hdr,
                                    const void *data, uint64_t *cur_modseq,
                                    unsigned int version);
+/* Returns 1 if ok, 0 if file is corrupted or offset range is invalid,
+   -1 if I/O error */
 int mail_transaction_log_file_get_highest_modseq_at(
                struct mail_transaction_log_file *file,
                uoff_t offset, uint64_t *highest_modseq_r,
index 1b0fb68feff5b9f3ecbe13d41176d76b213cba1d..6efd18e1d6390ec3db64c445330d54a9aa248742 100644 (file)
@@ -336,7 +336,7 @@ int mail_transaction_log_view_set(struct mail_transaction_log_view *view,
        view->broken = FALSE;
 
        if (mail_transaction_log_file_get_highest_modseq_at(view->cur,
-                               view->cur_offset, &view->prev_modseq, reason_r) < 0)
+                               view->cur_offset, &view->prev_modseq, reason_r) <= 0)
                return -1;
 
        i_assert(view->cur_offset <= view->cur->sync_offset);
@@ -399,7 +399,7 @@ int mail_transaction_log_view_set_all(struct mail_transaction_log_view *view)
        view->broken = FALSE;
 
        if (mail_transaction_log_file_get_highest_modseq_at(view->cur,
-                       view->cur_offset, &view->prev_modseq, &reason) < 0) {
+                       view->cur_offset, &view->prev_modseq, &reason) <= 0) {
                mail_index_set_error(view->log->index,
                        "Failed to get modseq in %s for all-view: %s",
                        view->log->filepath, reason);
index b89b4ecc4f9b598f13780fcbb999dd726ba5d6c3..6f591cef6944fc603902940276bf552f5f286513 100644 (file)
@@ -344,23 +344,28 @@ static void test_mail_transaction_log_file_modseq_offsets(void)
        uint64_t modseq_at;
        const char *error;
        /* initial_offset */
-       test_assert(mail_transaction_log_file_get_highest_modseq_at(file, modseq_next_offset[1], &modseq, &error) == 0);
+       test_assert(mail_transaction_log_file_get_highest_modseq_at(
+               file, modseq_next_offset[1], &modseq, &error) == 1);
        test_assert(modseq == 1);
        /* sync_offset fast path */
-       test_assert(mail_transaction_log_file_get_highest_modseq_at(file, file->sync_offset, &modseq, &error) == 0);
+       test_assert(mail_transaction_log_file_get_highest_modseq_at(
+               file, file->sync_offset, &modseq, &error) == 1);
        test_assert(modseq == max_modseq);
        /* do some random testing with cache */
        for (unsigned int i = 0; i < LOG_FILE_MODSEQ_CACHE_SIZE*10; i++) {
                modseq = i_rand_minmax(1, max_modseq);
-               test_assert(mail_transaction_log_file_get_highest_modseq_at(file, modseq_next_offset[modseq], &modseq_at, &error) == 0);
+               test_assert(mail_transaction_log_file_get_highest_modseq_at(
+                       file, modseq_next_offset[modseq], &modseq_at, &error) == 1);
                test_assert(modseq_at == modseq);
-               test_assert(mail_transaction_log_file_get_highest_modseq_at(file, modseq_alt_next_offset[modseq], &modseq_at, &error) == 0);
+               test_assert(mail_transaction_log_file_get_highest_modseq_at(
+                       file, modseq_alt_next_offset[modseq], &modseq_at, &error) == 1);
                test_assert(modseq_at == modseq);
        }
        /* go through all modseqs - do this after randomness testing or
           modseq_alt_next_offset[] matching isn't triggered */
        for (modseq = 1; modseq <= max_modseq; modseq++) {
-               test_assert(mail_transaction_log_file_get_highest_modseq_at(file, modseq_next_offset[modseq], &modseq_at, &error) == 0);
+               test_assert(mail_transaction_log_file_get_highest_modseq_at(
+                       file, modseq_next_offset[modseq], &modseq_at, &error) == 1);
                test_assert(modseq_at == modseq);
        }
 
index 202d7de82be27eb219319ec647edb56287257fdc..e7f480a85eb80267655454532e8b40b23265b02c 100644 (file)
@@ -53,7 +53,7 @@ int mail_transaction_log_file_get_highest_modseq_at(
                const char **error_r ATTR_UNUSED)
 {
        *highest_modseq_r = 0;
-       return 0;
+       return 1;
 }
 
 void mail_transaction_update_modseq(const struct mail_transaction_header *hdr ATTR_UNUSED,