Mercurial > dovecot > core-2.2
changeset 22948:e48f732f0f39
mdbox: Assume that empty uid maps found during sync are harmless
Instead of failing the sync and causing index rebuild, just skip over
the empty uid maps. Chances are that they these records came from
various plugins that create fake mails.
author | Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi> |
---|---|
date | Mon, 23 Apr 2018 18:15:51 -0400 |
parents | d5b44ec763b0 |
children | ca4a2b85b6f6 |
files | src/lib-storage/index/dbox-multi/mdbox-sync.c |
diffstat | 1 files changed, 14 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-sync.c Tue Dec 12 21:36:07 2017 +0200 +++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c Mon Apr 23 18:15:51 2018 -0400 @@ -23,6 +23,7 @@ #include "mdbox-sync.h" +/* returns -1 on error, 1 on success, 0 if guid is empty/missing */ static int dbox_sync_verify_expunge_guid(struct mdbox_sync_context *ctx, uint32_t seq, const guid_128_t guid_128) @@ -33,9 +34,13 @@ mail_index_lookup_uid(ctx->sync_view, seq, &uid); mail_index_lookup_ext(ctx->sync_view, seq, ctx->mbox->guid_ext_id, &data, NULL); + + if ((data == NULL) || guid_128_is_empty(data)) + return 0; + if (guid_128_is_empty(guid_128) || memcmp(data, guid_128, GUID_128_SIZE) == 0) - return 0; + return 1; mail_storage_set_critical(&ctx->mbox->storage->storage.storage, "Mailbox %s: Expunged GUID mismatch for UID %u: %s vs %s", @@ -49,14 +54,16 @@ const guid_128_t guid_128) { uint32_t map_uid; + int ret; if (seq_range_array_add(&ctx->expunged_seqs, seq)) { /* already marked as expunged in this sync */ return 0; } - if (dbox_sync_verify_expunge_guid(ctx, seq, guid_128) < 0) - return -1; + ret = dbox_sync_verify_expunge_guid(ctx, seq, guid_128); + if (ret <= 0) + return ret; if (mdbox_mail_lookup(ctx->mbox, ctx->sync_view, seq, &map_uid) < 0) return -1; if (mdbox_map_update_refcount(ctx->map_trans, map_uid, -1) < 0) @@ -107,7 +114,10 @@ mail_index_lookup_uid(ctx->sync_view, seq, &uid); mail_index_lookup_ext(ctx->sync_view, seq, ctx->mbox->guid_ext_id, &data, NULL); - mail_index_expunge_guid(trans, seq, data); + if ((data == NULL) || guid_128_is_empty(data)) + mail_index_expunge(trans, seq); + else + mail_index_expunge_guid(trans, seq, data); } if (mail_index_transaction_commit(&trans) < 0) return -1;