# HG changeset patch # User Timo Sirainen # Date 1313522826 -10800 # Node ID ee151b7e0d5afcafab8a9af6f46f88add85dfa72 # Parent 2d4175c9ff520a2121cf1225a1debe8314ded1c6 lib-index: Optimized handling MAIL_TRANSACTION_EXPUNGE_GUID records in large index. diff -r 2d4175c9ff52 -r ee151b7e0d5a src/lib-index/mail-index-sync-update.c --- a/src/lib-index/mail-index-sync-update.c Tue Aug 16 22:26:12 2011 +0300 +++ b/src/lib-index/mail-index-sync-update.c Tue Aug 16 22:27:06 2011 +0300 @@ -552,11 +552,15 @@ case MAIL_TRANSACTION_EXPUNGE_GUID: case MAIL_TRANSACTION_EXPUNGE_GUID|MAIL_TRANSACTION_EXPUNGE_PROT: { const struct mail_transaction_expunge_guid *rec = data, *end; + ARRAY_TYPE(seq_range) uids; + const struct seq_range *range; + unsigned int i, count; if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) { /* this is simply a request for expunge */ break; } + t_array_init(&uids, 64); end = CONST_PTR_OFFSET(data, hdr->size); for (; rec != end; rec++) { if (rec->uid == 0) { @@ -565,8 +569,13 @@ rec->uid); break; } - sync_expunge(ctx, rec->uid, rec->uid); + seq_range_array_add(&uids, 0, rec->uid); } + + /* do this in reverse so the memmove()s are smaller */ + range = array_get(&uids, &count); + for (i = count; i > 0; i--) + sync_expunge(ctx, range[i-1].seq1, range[i-1].seq2); break; } case MAIL_TRANSACTION_FLAG_UPDATE: {