Skip to content

Commit

Permalink
mdbox: Assume that empty uid maps found during sync are harmless
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Josef 'Jeff' Sipek committed Apr 26, 2018
1 parent aa2eb41 commit c336bb0
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions src/lib-storage/index/dbox-multi/mdbox-sync.c
Expand Up @@ -24,6 +24,7 @@
#include "mailbox-recent-flags.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)
Expand All @@ -34,9 +35,13 @@ dbox_sync_verify_expunge_guid(struct mdbox_sync_context *ctx, uint32_t seq,
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;

mailbox_set_critical(&ctx->mbox->box,
"Expunged GUID mismatch for UID %u: %s vs %s",
Expand All @@ -49,14 +54,16 @@ static int mdbox_sync_expunge(struct mdbox_sync_context *ctx, uint32_t seq,
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)
Expand Down Expand Up @@ -107,7 +114,10 @@ static int dbox_sync_mark_expunges(struct mdbox_sync_context *ctx)
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;
Expand Down

0 comments on commit c336bb0

Please sign in to comment.