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