From: Timo Sirainen Date: Wed, 21 Jan 2009 23:29:44 +0000 (-0500) Subject: mail_index_transaction_get_next_uid() shouldn't sort appends. They may still be modified! X-Git-Tag: 1.2.beta1~71 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cf93189100a9136f2fd508c26e1573410bc8c1aa;p=thirdparty%2Fdovecot%2Fcore.git mail_index_transaction_get_next_uid() shouldn't sort appends. They may still be modified! Fixes a dbox rebuild bug. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index 99bc50589c..7b1e07000e 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -37,6 +37,7 @@ struct mail_index_transaction { mail_index_transaction_reset() to reset it. */ ARRAY_DEFINE(appends, struct mail_index_record); uint32_t first_new_seq, last_new_seq; + uint32_t highest_append_uid; /* lowest/highest sequence that updates flags/keywords */ uint32_t min_flagupdate_seq, max_flagupdate_seq; diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index 20bc88e69b..0a167c4ae1 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -537,8 +537,7 @@ void mail_index_transaction_sort_appends(struct mail_index_transaction *t) uint32_t mail_index_transaction_get_next_uid(struct mail_index_transaction *t) { const struct mail_index_header *head_hdr, *hdr; - const struct mail_index_record *recs; - unsigned int count, offset; + unsigned int offset; uint32_t next_uid; head_hdr = &t->view->index->map->hdr; @@ -547,13 +546,8 @@ uint32_t mail_index_transaction_get_next_uid(struct mail_index_transaction *t) 1 : hdr->next_uid; if (array_is_created(&t->appends)) { /* get next_uid from appends if they have UIDs */ - mail_index_transaction_sort_appends(t); - - recs = array_get(&t->appends, &count); - if (count > 0 && recs[count-1].uid != 0) { - i_assert(recs[count-1].uid >= next_uid); - next_uid = recs[count-1].uid + 1; - } + i_assert(next_uid <= t->highest_append_uid); + next_uid = t->highest_append_uid; } /* see if it's been updated in pre/post header changes */ @@ -677,6 +671,8 @@ void mail_index_append(struct mail_index_transaction *t, uint32_t uid, else if (rec->uid == uid) i_panic("Duplicate UIDs added in transaction"); } + if (t->highest_append_uid < uid) + t->highest_append_uid = uid; } }