Mercurial > dovecot > original-hg > dovecot-1.2
changeset 4237:20e6d554d3fe HEAD
mmap_disable: When syncing in-memory index from transaction log, we didn't
skip external transactions which were already been in our in-memory
mapping, causing "Append with UID n, but next_uid = m" errors.
author | Timo Sirainen <timo.sirainen@movial.fi> |
---|---|
date | Tue, 02 May 2006 14:04:30 +0300 |
parents | 789b586d9015 |
children | 3c8b191b0019 |
files | src/lib-index/mail-index-private.h src/lib-index/mail-index-sync-update.c src/lib-index/mail-index.c |
diffstat | 3 files changed, 26 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-private.h Tue May 02 11:56:58 2006 +0300 +++ b/src/lib-index/mail-index-private.h Tue May 02 14:04:30 2006 +0300 @@ -8,6 +8,7 @@ #include "mail-index.h" struct mail_transaction_header; +struct mail_transaction_log_view; struct mail_index_sync_map_ctx; /* How many seconds to wait a lock for index file. */ @@ -251,6 +252,8 @@ int mail_index_fix_header(struct mail_index *index, struct mail_index_map *map, struct mail_index_header *hdr, const char **error_r); +bool mail_index_is_ext_synced(struct mail_transaction_log_view *log_view, + struct mail_index_map *map); void mail_index_view_transaction_ref(struct mail_index_view *view); void mail_index_view_transaction_unref(struct mail_index_view *view);
--- a/src/lib-index/mail-index-sync-update.c Tue May 02 11:56:58 2006 +0300 +++ b/src/lib-index/mail-index-sync-update.c Tue May 02 14:04:30 2006 +0300 @@ -657,19 +657,8 @@ continue; } } else if (check_ext_offsets) { - uint32_t prev_seq; - uoff_t prev_offset; - - mail_transaction_log_view_get_prev_pos(view->log_view, - &prev_seq, - &prev_offset); - if (prev_seq < view->map->hdr.log_file_seq || - (prev_seq == view->map->hdr.log_file_seq && - prev_offset < - view->map->hdr.log_file_ext_offset)) { - /* we have already synced this change */ + if (mail_index_is_ext_synced(view->log_view, view->map)) continue; - } check_ext_offsets = FALSE; }
--- a/src/lib-index/mail-index.c Tue May 02 11:56:58 2006 +0300 +++ b/src/lib-index/mail-index.c Tue May 02 14:04:30 2006 +0300 @@ -781,6 +781,19 @@ return 1; } +bool mail_index_is_ext_synced(struct mail_transaction_log_view *log_view, + struct mail_index_map *map) +{ + uint32_t prev_seq; + uoff_t prev_offset; + + mail_transaction_log_view_get_prev_pos(log_view, &prev_seq, + &prev_offset); + return prev_seq < map->hdr.log_file_seq || + (prev_seq == map->hdr.log_file_seq && + prev_offset < map->hdr.log_file_ext_offset); +} + static int mail_index_sync_from_transactions(struct mail_index *index, struct mail_index_map **map, bool sync_to_index) @@ -796,7 +809,7 @@ uoff_t prev_offset, max_offset; size_t pos; int ret; - bool skipped; + bool skipped, check_ext_offsets; if (sync_to_index) { /* read the real log position where we are supposed to be @@ -852,8 +865,16 @@ mail_index_sync_map_init(&sync_map_ctx, view, MAIL_INDEX_SYNC_HANDLER_VIEW); + check_ext_offsets = TRUE; while ((ret = mail_transaction_log_view_next(log_view, &thdr, &tdata, &skipped)) > 0) { + if ((thdr->type & MAIL_TRANSACTION_EXTERNAL) != 0 && + check_ext_offsets) { + if (mail_index_is_ext_synced(log_view, index->map)) + continue; + check_ext_offsets = FALSE; + } + if (mail_index_sync_record(&sync_map_ctx, thdr, tdata) < 0) { ret = -1; break;