changeset 33:148cdb150e64 HEAD

A bit better index file truncating: Truncate it also when first hole reaches to end of file, even if all messages weren't deleted.
author Timo Sirainen <tss@iki.fi>
date Mon, 26 Aug 2002 23:15:09 +0300
parents b7d7474cbcb2
children a3d77e73f99b
files src/lib-index/mail-index.c
diffstat 1 files changed, 24 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index.c	Mon Aug 26 23:13:57 2002 +0300
+++ b/src/lib-index/mail-index.c	Mon Aug 26 23:15:09 2002 +0300
@@ -1018,7 +1018,10 @@
 		} else if (rec->uid < index->header->first_unseen_uid_lowwater)
 			index->header->first_unseen_uid_lowwater = rec->uid;
 
-		index->header->seen_messages_count--;
+		if (index->header->seen_messages_count == 0)
+			index->header->flags |= MAIL_INDEX_FLAG_FSCK;
+		else
+			index->header->seen_messages_count--;
 	} else if ((old_flags & MAIL_DELETED) == 0 &&
 		   (new_flags & MAIL_DELETED)) {
 		/* undeleted -> deleted */
@@ -1032,22 +1035,34 @@
 	} else if ((old_flags & MAIL_DELETED) &&
 		   (new_flags & MAIL_DELETED) == 0) {
 		/* deleted -> undeleted */
-		index->header->deleted_messages_count--;
+		if (index->header->deleted_messages_count == 0)
+			index->header->flags |= MAIL_INDEX_FLAG_FSCK;
+		else
+			index->header->deleted_messages_count--;
 	}
 }
 
 static int mail_index_truncate(MailIndex *index)
 {
+	/* truncate index file */
+	if (ftruncate(index->fd, index->header->first_hole_position) < 0)
+		return FALSE;
+
 	/* update header */
 	index->header->first_hole_position = 0;
 	index->header->first_hole_records = 0;
 
-	/* truncate index file */
-	if (ftruncate(index->fd, sizeof(MailIndexHeader)) < 0)
+	if (index->header->messages_count == 0) {
+		/* all mail was deleted, truncate data file */
+		if (!mail_index_data_reset(index->data))
+			return FALSE;
+	}
+
+	index->dirty_mmap = TRUE;
+	if (!mmap_update(index))
 		return FALSE;
 
-	/* truncate data file */
-	return mail_index_data_reset(index->data);
+	return TRUE;
 }
 
 int mail_index_expunge(MailIndex *index, MailIndexRecord *rec,
@@ -1115,8 +1130,9 @@
 	hdr->messages_count--;
 	index_mark_flag_changes(index, rec, rec->msg_flags, 0);
 
-	if (hdr->messages_count == 0) {
-		/* all messages are deleted, truncate the index files */
+	if ((hdr->first_hole_position - sizeof(MailIndexHeader)) /
+	    sizeof(MailIndexRecord) == hdr->messages_count) {
+		/* the hole reaches end of file, truncate it */
 		(void)mail_index_truncate(index);
 	} else {
 		/* update deleted_space in data file */