From a4663ce76645f28d521c7461abecb44537207cb2 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 5 Mar 2003 03:41:36 +0200 Subject: [PATCH] Added index->append_abort() to abort append cleanly. --HG-- branch : HEAD --- src/lib-index/mail-index.c | 70 ++++++++++++++++++--------- src/lib-index/mail-index.h | 4 ++ src/lib-index/maildir/maildir-build.c | 4 +- src/lib-index/maildir/maildir-index.c | 1 + src/lib-index/mbox/mbox-append.c | 5 +- src/lib-index/mbox/mbox-index.c | 1 + 6 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 849b867ce6..d800db86a8 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -817,31 +817,12 @@ static int mail_index_truncate_hole(struct mail_index *index) return TRUE; } -#define INDEX_NEED_COMPRESS(records, hdr) \ - ((records) > INDEX_MIN_RECORDS_COUNT && \ - (records) * (100-INDEX_COMPRESS_PERCENTAGE) / 100 > \ - (hdr)->messages_count) - -int mail_index_expunge(struct mail_index *index, struct mail_index_record *rec, - unsigned int seq, int external_change) +static void update_first_hole(struct mail_index *index, + struct mail_index_record *rec) { - struct mail_index_header *hdr; - unsigned int records, uid, idx; - - i_assert(index->lock_type == MAIL_LOCK_EXCLUSIVE); - i_assert(seq != 0); - i_assert(rec->uid != 0); - - if (!mail_index_verify_hole_range(index)) - return FALSE; - - hdr = index->header; - - /* setting UID to 0 is enough for deleting the mail from index */ - uid = rec->uid; - rec->uid = 0; + struct mail_index_header *hdr = index->header; + unsigned int idx; - /* update first hole */ idx = INDEX_RECORD_INDEX(index, rec); if (hdr->first_hole_records == 0) { /* first deleted message in index */ @@ -863,6 +844,33 @@ int mail_index_expunge(struct mail_index *index, struct mail_index_record *rec, hdr->first_hole_records = 1; } } +} + +#define INDEX_NEED_COMPRESS(records, hdr) \ + ((records) > INDEX_MIN_RECORDS_COUNT && \ + (records) * (100-INDEX_COMPRESS_PERCENTAGE) / 100 > \ + (hdr)->messages_count) + +int mail_index_expunge(struct mail_index *index, struct mail_index_record *rec, + unsigned int seq, int external_change) +{ + struct mail_index_header *hdr; + unsigned int records, uid; + + i_assert(index->lock_type == MAIL_LOCK_EXCLUSIVE); + i_assert(seq != 0); + i_assert(rec->uid != 0); + + if (!mail_index_verify_hole_range(index)) + return FALSE; + + hdr = index->header; + + /* setting UID to 0 is enough for deleting the mail from index */ + uid = rec->uid; + rec->uid = 0; + + update_first_hole(index, rec); /* update message counts */ if (hdr->messages_count == 0) { @@ -1012,6 +1020,22 @@ int mail_index_append_end(struct mail_index *index, return TRUE; } +void mail_index_append_abort(struct mail_index *index, + struct mail_index_record *rec) +{ + i_assert(rec->uid == 0); + + if (INDEX_FILE_POSITION(index, rec) == + index->header->used_file_size - sizeof(*rec)) { + /* we can just rollback */ + index->header->used_file_size -= sizeof(*rec); + index->mmap_used_length += sizeof(*rec); + } else { + /* mark it deleted */ + update_first_hole(index, rec); + } +} + enum mail_index_error mail_index_get_last_error(struct mail_index *index) { if (index->inconsistent) diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index f7b6d91ea5..a4140e9913 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -323,6 +323,8 @@ struct mail_index { struct mail_index_record *(*append_begin)(struct mail_index *index); int (*append_end)(struct mail_index *index, struct mail_index_record *rec); + void (*append_abort)(struct mail_index *index, + struct mail_index_record *rec); /* Updating fields happens by calling update_begin(), one or more update_field()s and finally update_end() which does the actual @@ -473,6 +475,8 @@ int mail_index_update_flags(struct mail_index *index, struct mail_index_record *mail_index_append_begin(struct mail_index *index); int mail_index_append_end(struct mail_index *index, struct mail_index_record *rec); +void mail_index_append_abort(struct mail_index *index, + struct mail_index_record *rec); struct mail_index_update * mail_index_update_begin(struct mail_index *index, struct mail_index_record *rec); diff --git a/src/lib-index/maildir/maildir-build.c b/src/lib-index/maildir/maildir-build.c index 0469705fbe..04323f3bb8 100644 --- a/src/lib-index/maildir/maildir-build.c +++ b/src/lib-index/maildir/maildir-build.c @@ -66,8 +66,10 @@ static int maildir_index_append_fd(struct mail_index *index, /* parse the header and update record's fields */ failed = fd == -1 ? FALSE : !maildir_record_update(index, update, fd); - if (!index->update_end(update) || failed) + if (!index->update_end(update) || failed) { + index->append_abort(index, rec); return FALSE; + } return index->append_end(index, rec); } diff --git a/src/lib-index/maildir/maildir-index.c b/src/lib-index/maildir/maildir-index.c index 7ca058872c..ca1112f946 100644 --- a/src/lib-index/maildir/maildir-index.c +++ b/src/lib-index/maildir/maildir-index.c @@ -263,6 +263,7 @@ struct mail_index maildir_index = { maildir_index_update_flags, mail_index_append_begin, mail_index_append_end, + mail_index_append_abort, mail_index_update_begin, mail_index_update_end, mail_index_update_field, diff --git a/src/lib-index/mbox/mbox-append.c b/src/lib-index/mbox/mbox-append.c index 7c4b492d42..281db75753 100644 --- a/src/lib-index/mbox/mbox-append.c +++ b/src/lib-index/mbox/mbox-append.c @@ -94,9 +94,10 @@ static int mbox_index_append_next(struct mail_index *index, index->update_field_raw(update, DATA_FIELD_MD5, md5_digest, sizeof(md5_digest)); - if (!index->update_end(update)) + if (!index->update_end(update)) { + index->append_abort(index, rec); failed = TRUE; - else { + } else { /* save message flags */ rec->msg_flags = ctx.flags; mail_index_mark_flag_changes(index, rec, 0, rec->msg_flags); diff --git a/src/lib-index/mbox/mbox-index.c b/src/lib-index/mbox/mbox-index.c index 848a713b02..f7b5a1d944 100644 --- a/src/lib-index/mbox/mbox-index.c +++ b/src/lib-index/mbox/mbox-index.c @@ -821,6 +821,7 @@ struct mail_index mbox_index = { mbox_index_update_flags, mail_index_append_begin, mail_index_append_end, + mail_index_append_abort, mail_index_update_begin, mail_index_update_end, mail_index_update_field, -- 2.47.3