dovecot-2.0: virtual: If non-matching messages weren't expunged ...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jul 8 17:51:39 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/00a7d6624657
changeset: 11760:00a7d6624657
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jul 08 15:51:15 2010 +0100
description:
virtual: If non-matching messages weren't expunged within same session, they never got expunged.

diffstat:

 src/plugins/virtual/virtual-storage.h |   3 +++
 src/plugins/virtual/virtual-sync.c    |  19 ++++++++++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)

diffs (80 lines):

diff -r 065c414a5c07 -r 00a7d6624657 src/plugins/virtual/virtual-storage.h
--- a/src/plugins/virtual/virtual-storage.h	Thu Jul 08 15:14:16 2010 +0100
+++ b/src/plugins/virtual/virtual-storage.h	Thu Jul 08 15:51:15 2010 +0100
@@ -69,6 +69,9 @@
 	uint32_t sync_uid_validity;
 	uint32_t sync_next_uid;
 	uint64_t sync_highest_modseq;
+	/* this value is either 0 or same as sync_highest_modseq. it's kept 0
+	   when there are pending removes that have yet to be expunged */
+	uint64_t ondisk_highest_modseq;
 
 	struct mail_search_args *search_args;
 	struct mail_search_result *search_result;
diff -r 065c414a5c07 -r 00a7d6624657 src/plugins/virtual/virtual-sync.c
--- a/src/plugins/virtual/virtual-sync.c	Thu Jul 08 15:14:16 2010 +0100
+++ b/src/plugins/virtual/virtual-sync.c	Thu Jul 08 15:51:15 2010 +0100
@@ -167,7 +167,7 @@
 	    ext_size >= sizeof(*ext_hdr) &&
 	    ctx->mbox->prev_change_counter == ext_hdr->change_counter) {
 		/* fully refreshed */
-		return TRUE;
+		return 1;
 	}
 
 	ctx->mbox->prev_uid_validity = hdr->uid_validity;
@@ -231,7 +231,9 @@
 		} else {
 			bbox->mailbox_id = mailboxes[i].id;
 			bbox->sync_uid_validity = mailboxes[i].uid_validity;
-			bbox->sync_highest_modseq = mailboxes[i].highest_modseq;
+			bbox->ondisk_highest_modseq =
+				bbox->sync_highest_modseq =
+				mailboxes[i].highest_modseq;
 			bbox->sync_next_uid = mailboxes[i].next_uid;
 			bbox->sync_mailbox_idx = i;
 		}
@@ -292,7 +294,7 @@
 		mailbox.id = bboxes[i]->mailbox_id;
 		mailbox.name_len = strlen(bboxes[i]->name);
 		mailbox.uid_validity = bboxes[i]->sync_uid_validity;
-		mailbox.highest_modseq = bboxes[i]->sync_highest_modseq;
+		mailbox.highest_modseq = bboxes[i]->ondisk_highest_modseq;
 		mailbox.next_uid = bboxes[i]->sync_next_uid;
 		buffer_write(buf, mailbox_pos, &mailbox, sizeof(mailbox));
 		buffer_write(buf, name_pos, bboxes[i]->name, mailbox.name_len);
@@ -981,17 +983,24 @@
 	struct mailbox_status status;
 	struct virtual_mail_index_mailbox_record mailbox;
 	unsigned int mailbox_offset;
+	uint64_t wanted_ondisk_highest_modseq;
 
 	mailbox_get_status(bbox->box, STATUS_UIDVALIDITY |
 			   STATUS_HIGHESTMODSEQ, &status);
+	wanted_ondisk_highest_modseq =
+		array_count(&bbox->sync_pending_removes) > 0 ? 0 :
+		status.highest_modseq;
+
 	if (bbox->sync_uid_validity == status.uidvalidity &&
 	    bbox->sync_next_uid == status.uidnext &&
-	    bbox->sync_highest_modseq == status.highest_modseq)
+	    bbox->sync_highest_modseq == status.highest_modseq &&
+	    bbox->ondisk_highest_modseq == wanted_ondisk_highest_modseq)
 		return;
 
 	/* mailbox changed - update extension header */
 	bbox->sync_uid_validity = status.uidvalidity;
 	bbox->sync_highest_modseq = status.highest_modseq;
+	bbox->ondisk_highest_modseq = wanted_ondisk_highest_modseq;
 	bbox->sync_next_uid = status.uidnext;
 
 	if (ctx->ext_header_rewrite) {
@@ -1001,7 +1010,7 @@
 
 	memset(&mailbox, 0, sizeof(mailbox));
 	mailbox.uid_validity = bbox->sync_uid_validity;
-	mailbox.highest_modseq = bbox->sync_highest_modseq;
+	mailbox.highest_modseq = bbox->ondisk_highest_modseq;
 	mailbox.next_uid = bbox->sync_next_uid;
 
 	mailbox_offset = sizeof(struct virtual_mail_index_header) +


More information about the dovecot-cvs mailing list