changeset 21445:be855523d700

lib-storage: Clear virtual size from index if size is corrupted
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Thu, 26 Jan 2017 09:42:26 +0200
parents ae33f73964e8
children d6ca4c4c7202
files src/lib-storage/index/index-mail.c
diffstat 1 files changed, 15 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-mail.c	Sat Jan 14 18:34:11 2017 +0200
+++ b/src/lib-storage/index/index-mail.c	Thu Jan 26 09:42:26 2017 +0200
@@ -2204,6 +2204,19 @@
 		(void)mail_get_special(mail, MAIL_FETCH_GUID, &str);
 }
 
+static void
+index_mail_reset_vsize_ext(struct mail *mail, struct index_mail *imail)
+{
+	unsigned int idx;
+	uint32_t vsize = 0;
+	struct mail_index_view *view = mail->transaction->view;
+	if (mail_index_map_get_ext_idx(view->map, imail->vsize_ext_id,
+				       &idx)) {
+		mail_index_update_ext(mail->transaction->itrans, mail->seq,
+				      imail->vsize_ext_id, &vsize, NULL);
+	}
+}
+
 void index_mail_set_cache_corrupted(struct mail *mail,
 				    enum mail_fetch_field field)
 {
@@ -2226,12 +2239,14 @@
 		imail->data.physical_size = (uoff_t)-1;
 		imail->data.virtual_size = (uoff_t)-1;
 		imail->data.parts = NULL;
+		index_mail_reset_vsize_ext(mail, imail);
 		break;
 	case MAIL_FETCH_VIRTUAL_SIZE:
 		field_name = "virtual size";
 		imail->data.physical_size = (uoff_t)-1;
 		imail->data.virtual_size = (uoff_t)-1;
 		imail->data.parts = NULL;
+		index_mail_reset_vsize_ext(mail, imail);
 		break;
 	case MAIL_FETCH_MESSAGE_PARTS:
 		field_name = "MIME parts";