]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Move calling mail_index_sync_map_want_index_reopen() to mail_index_map()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 10 Aug 2020 14:31:27 +0000 (17:31 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Mon, 23 Nov 2020 13:19:55 +0000 (13:19 +0000)
src/lib-index/mail-index-map-read.c
src/lib-index/mail-index-sync-private.h
src/lib-index/mail-index-sync-update.c

index 1053f6ad03cd85a3d0e2e88eb2bf9ec8cd831d47..e05305e6ea24b1df10f001a9a5a139570ff6a8d1 100644 (file)
@@ -419,12 +419,16 @@ int mail_index_map(struct mail_index *index,
                index->map = mail_index_map_alloc(index);
 
        /* first try updating the existing mapping from transaction log. */
-       if (index->initial_mapped && !index->reopen_main_index) {
-               /* we're not creating/opening the index.
-                  sync this as a view from transaction log. */
-               ret = mail_index_sync_map(&index->map, type, FALSE, "initial mapping");
-       } else {
+       if (!index->initial_mapped || index->reopen_main_index) {
+               /* index is being created/opened for the first time */
+               ret = 0;
+       } else if (mail_index_sync_map_want_index_reopen(index->map, type)) {
+               /* it's likely more efficient to reopen the index file than
+                  sync from the transaction log. */
                ret = 0;
+       } else {
+               /* sync the map from the transaction log. */
+               ret = mail_index_sync_map(&index->map, type, FALSE, "initial mapping");
        }
 
        if (ret == 0) {
index 022ed218d8fbc93d714d6e93429340798a3bb5dc..f5061c2ec622cd083bef246cd63d7640d1ea6942 100644 (file)
@@ -52,6 +52,8 @@ void mail_index_sync_map_init(struct mail_index_sync_map_ctx *sync_map_ctx,
                              struct mail_index_view *view,
                              enum mail_index_sync_handler_type type);
 void mail_index_sync_map_deinit(struct mail_index_sync_map_ctx *sync_map_ctx);
+bool mail_index_sync_map_want_index_reopen(struct mail_index_map *map,
+                                          enum mail_index_sync_handler_type type);
 int mail_index_sync_map(struct mail_index_map **map,
                        enum mail_index_sync_handler_type type, bool force,
                        const char *sync_reason);
index 06923b0dfe78a5c60125d65909a9b07a89dbb500..494e2c9b397d4e3ae82910b45c2675a874265faa 100644 (file)
@@ -893,9 +893,8 @@ void mail_index_map_check(struct mail_index_map *map)
 }
 #endif
 
-static bool
-mail_index_sync_map_want_index_reopen(struct mail_index_map *map,
-                                     enum mail_index_sync_handler_type type)
+bool mail_index_sync_map_want_index_reopen(struct mail_index_map *map,
+                                          enum mail_index_sync_handler_type type)
 {
        struct mail_index *index = map->index;
 
@@ -946,13 +945,10 @@ int mail_index_sync_map(struct mail_index_map **_map,
        int ret;
        bool had_dirty, reset;
 
+       i_assert(index->log->head != NULL);
        i_assert(index->map == map || type == MAIL_INDEX_SYNC_HANDLER_VIEW);
        i_assert(!force || index->log->head != NULL);
 
-       if (mail_index_sync_map_want_index_reopen(map, type))
-               return 0;
-
-       i_assert(index->log->head != NULL);
        start_offset = type == MAIL_INDEX_SYNC_HANDLER_FILE ?
                map->hdr.log_file_tail_offset : map->hdr.log_file_head_offset;