Mercurial > dovecot > core-2.2
changeset 4246:524a584f2302 HEAD
When removing recent-flags with mmap_disable, the flags weren't actually
removed which caused broken recent counter errors. Also added more checks
not to update counters if they're already known to be broken.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 03 May 2006 22:43:25 +0300 |
parents | be915546ce49 |
children | 9c3f19110538 |
files | src/lib-index/mail-index-sync-update.c |
diffstat | 1 files changed, 26 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-sync-update.c Wed May 03 21:59:38 2006 +0300 +++ b/src/lib-index/mail-index-sync-update.c Wed May 03 22:43:25 2006 +0300 @@ -172,7 +172,7 @@ expunge_handlers_count = 0; } - if (ctx->unreliable_flags) + if (ctx->unreliable_flags || view->broken_counters) view->broken_counters = TRUE; else { for (seq = seq1; seq <= seq2; seq++) { @@ -210,6 +210,16 @@ return 1; } +static void write_seq_update(struct mail_index_map *map, + uint32_t seq1, uint32_t seq2) +{ + if (map->write_seq_first == 0 || + map->write_seq_first > seq1) + map->write_seq_first = seq1; + if (map->write_seq_last < seq2) + map->write_seq_last = seq2; +} + static int sync_append(const struct mail_index_record *rec, struct mail_index_sync_map_ctx *ctx) { @@ -244,15 +254,16 @@ map->records_count++; view->hdr.messages_count++; - if (map->write_seq_first == 0) - map->write_seq_first = map->hdr.messages_count; - map->write_seq_last = map->hdr.messages_count; + write_seq_update(map, map->hdr.messages_count, map->hdr.messages_count); if ((rec->flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY; - mail_index_header_update_counts(view->index, &map->hdr, 0, rec->flags); - mail_index_header_update_lowwaters(&map->hdr, rec); + if (!view->broken_counters) { + mail_index_header_update_counts(view->index, &map->hdr, + 0, rec->flags); + mail_index_header_update_lowwaters(&map->hdr, rec); + } return 1; } @@ -279,11 +290,7 @@ if (seq1 == 0) return 1; - if (view->map->write_seq_first == 0 || - view->map->write_seq_first > seq1) - view->map->write_seq_first = seq1; - if (view->map->write_seq_last < seq2) - view->map->write_seq_last = seq2; + write_seq_update(view->map, seq1, seq2); hdr = &view->map->hdr; if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) @@ -291,9 +298,10 @@ flag_mask = ~u->remove_flags; - if (ctx->unreliable_flags && - ((u->add_flags | u->remove_flags) & - (MAIL_SEEN | MAIL_DELETED | MAIL_RECENT)) != 0) { + if (view->broken_counters || + (ctx->unreliable_flags && + ((u->add_flags | u->remove_flags) & + (MAIL_SEEN | MAIL_DELETED | MAIL_RECENT)) != 0)) { view->broken_counters = TRUE; for (idx = seq1-1; idx < seq2; idx++) { rec = MAIL_INDEX_MAP_IDX(view->map, idx); @@ -621,8 +629,11 @@ for (i = 0; i < map->records_count; i++) { rec = MAIL_INDEX_MAP_IDX(map, i); - if ((rec->flags & MAIL_RECENT) != 0) + if ((rec->flags & MAIL_RECENT) != 0) { rec->flags &= ~MAIL_RECENT; + + write_seq_update(map, i + 1, i + 1); + } } map->hdr.recent_messages_count = 0;