From: Timo Sirainen Date: Mon, 10 Aug 2020 14:31:27 +0000 (+0300) Subject: lib-index: Move calling mail_index_sync_map_want_index_reopen() to mail_index_map() X-Git-Tag: 2.3.14.rc1~316 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=050668ef37294bc3d6cf1364da19a05506da084e;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Move calling mail_index_sync_map_want_index_reopen() to mail_index_map() --- diff --git a/src/lib-index/mail-index-map-read.c b/src/lib-index/mail-index-map-read.c index 1053f6ad03..e05305e6ea 100644 --- a/src/lib-index/mail-index-map-read.c +++ b/src/lib-index/mail-index-map-read.c @@ -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) { diff --git a/src/lib-index/mail-index-sync-private.h b/src/lib-index/mail-index-sync-private.h index 022ed218d8..f5061c2ec6 100644 --- a/src/lib-index/mail-index-sync-private.h +++ b/src/lib-index/mail-index-sync-private.h @@ -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); diff --git a/src/lib-index/mail-index-sync-update.c b/src/lib-index/mail-index-sync-update.c index 06923b0dfe..494e2c9b39 100644 --- a/src/lib-index/mail-index-sync-update.c +++ b/src/lib-index/mail-index-sync-update.c @@ -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;