dovecot: Treat non-external expunges as requests for expunging m...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jun 15 18:09:12 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/1fa32e040ea5
changeset: 5743:1fa32e040ea5
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jun 15 18:09:09 2007 +0300
description:
Treat non-external expunges as requests for expunging messages. If it's
actually possible, mailbox syncing will then commit external expunges.

diffstat:

7 files changed, 34 insertions(+), 34 deletions(-)
src/lib-index/mail-index-sync-update.c         |   27 +++++-------------------
src/lib-index/mail-index-view-sync.c           |   10 ++++++++
src/lib-storage/index/cydir/cydir-sync.c       |    1 
src/lib-storage/index/dbox/dbox-sync-expunge.c |   14 +++++++-----
src/lib-storage/index/dbox/dbox-sync.c         |    4 ++-
src/lib-storage/index/maildir/maildir-sync.c   |   11 ++++-----
src/lib-storage/index/mbox/mbox-sync.c         |    1 

diffs (205 lines):

diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-index/mail-index-sync-update.c
--- a/src/lib-index/mail-index-sync-update.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-index/mail-index-sync-update.c	Fri Jun 15 18:09:09 2007 +0300
@@ -502,6 +502,10 @@ int mail_index_sync_record(struct mail_i
 	case MAIL_TRANSACTION_EXPUNGE|MAIL_TRANSACTION_EXPUNGE_PROT: {
 		const struct mail_transaction_expunge *rec = data, *end;
 
+		if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
+			/* this is simply a request for expunge */
+			break;
+		}
 		end = CONST_PTR_OFFSET(data, hdr->size);
 		ret = sync_expunge(rec, end - rec, ctx);
 		break;
@@ -735,8 +739,8 @@ int mail_index_sync_map(struct mail_inde
 	struct mail_index_sync_map_ctx sync_map_ctx;
 	const struct mail_transaction_header *thdr;
 	const void *tdata;
-	uint32_t prev_seq, mailbox_sync_seq, expunge_seq;
-	uoff_t prev_offset, mailbox_sync_offset, expunge_offset;
+	uint32_t prev_seq, mailbox_sync_seq;
+	uoff_t prev_offset, mailbox_sync_offset;
 	int ret;
 	bool had_dirty;
 
@@ -807,7 +811,6 @@ int mail_index_sync_map(struct mail_inde
 	   synced ([synced transactions][new transaction][ext transaction]).
 	   this means int_offset contains [synced] and ext_offset contains
 	   all */
-	expunge_seq = expunge_offset = 0;
 	while ((ret = mail_transaction_log_view_next(view->log_view, &thdr,
 						     &tdata)) > 0) {
 		mail_transaction_log_view_get_prev_pos(view->log_view,
@@ -820,19 +823,6 @@ int mail_index_sync_map(struct mail_inde
 			     prev_offset <
 			     view->map->hdr.log_file_index_ext_offset))
 				continue;
-		} else if ((thdr->type & MAIL_TRANSACTION_TYPE_MASK) ==
-			   MAIL_TRANSACTION_EXPUNGE) {
-			/* if the message hasn't yet been expunged from the
-			   mailbox, skip this expunge */
-			if (prev_seq > mailbox_sync_seq ||
-			    (prev_seq == mailbox_sync_seq &&
-			     prev_offset >= mailbox_sync_offset)) {
-				if (expunge_seq == 0) {
-					expunge_seq = prev_seq;
-					expunge_offset = prev_offset;
-				}
-				continue;
-			}
 		}
 
 		/* we'll just skip over broken entries */
@@ -849,11 +839,6 @@ int mail_index_sync_map(struct mail_inde
 	/* update sync position */
 	// FIXME: eol=TRUE gives intro errors
 	mail_index_sync_update_log_offset(&sync_map_ctx, map, FALSE);
-	if (expunge_seq != 0) {
-		i_assert(expunge_seq == map->hdr.log_file_seq);
-		map->hdr.log_file_index_int_offset = expunge_offset;
-		map->write_base_header = TRUE;
-	}
 
 	/* although mailbox_sync_update gets updated by the header update
 	   records, transaction log syncing can internally also update
diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-index/mail-index-view-sync.c
--- a/src/lib-index/mail-index-view-sync.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-index/mail-index-view-sync.c	Fri Jun 15 18:09:09 2007 +0300
@@ -132,6 +132,10 @@ view_sync_get_expunges(struct mail_index
 						     &hdr, &data)) > 0) {
 		if ((hdr->type & MAIL_TRANSACTION_EXPUNGE) == 0)
 			continue;
+		if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
+			/* this is simply a request for expunge */
+			continue;
+		}
 
 		if (mail_transaction_log_sort_expunges(expunges_r, data,
 						       hdr->size) < 0) {
@@ -519,6 +523,12 @@ mail_index_view_sync_get_rec(struct mail
 	case MAIL_TRANSACTION_EXPUNGE: {
 		const struct mail_transaction_expunge *exp =
 			CONST_PTR_OFFSET(data, ctx->data_offset);
+
+		if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
+			/* this is simply a request for expunge */
+			ctx->data_offset = ctx->hdr->size;
+			return 0;
+		}
 
 		/* data contains mail_transaction_expunge[] */
 		rec->type = MAIL_INDEX_SYNC_TYPE_EXPUNGE;
diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-storage/index/cydir/cydir-sync.c
--- a/src/lib-storage/index/cydir/cydir-sync.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-storage/index/cydir/cydir-sync.c	Fri Jun 15 18:09:09 2007 +0300
@@ -53,6 +53,7 @@ cydir_sync_expunge(struct cydir_sync_con
 				box->v.sync_notify(box, uid,
 						   MAILBOX_SYNC_TYPE_EXPUNGE);
 			}
+			mail_index_expunge(ctx->trans, seq1);
 		} else if (errno != ENOENT) {
 			mail_storage_set_critical(&ctx->mbox->storage->storage,
 				"unlink(%s) failed: %m", str_c(ctx->path));
diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-storage/index/dbox/dbox-sync-expunge.c
--- a/src/lib-storage/index/dbox/dbox-sync-expunge.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-storage/index/dbox/dbox-sync-expunge.c	Fri Jun 15 18:09:09 2007 +0300
@@ -36,20 +36,20 @@ dbox_next_expunge(struct dbox_sync_conte
 		  unsigned int *sync_idx, uint32_t *uid1_r, uint32_t *uid2_r)
 {
 	struct mailbox *box = &ctx->mbox->ibox.box;
-	const struct dbox_sync_rec *sync_recs;
+	const struct dbox_sync_rec *sync_recs, *sync_rec;
 	unsigned int count;
-	uint32_t uid;
+	uint32_t uid, seq;
 
 	sync_recs = array_get(&sync_entry->sync_recs, &count);
 
 	while (*sync_idx < count) {
 		*sync_idx += 1;
-
-		if (sync_recs[*sync_idx].type != MAIL_INDEX_SYNC_TYPE_EXPUNGE)
+		sync_rec = &sync_recs[*sync_idx];
+
+		if (sync_rec->type != MAIL_INDEX_SYNC_TYPE_EXPUNGE)
 			continue;
 
-		if (dbox_sync_rec_get_uids(ctx, &sync_recs[*sync_idx],
-					   uid1_r, uid2_r) < 0)
+		if (dbox_sync_rec_get_uids(ctx, sync_rec, uid1_r, uid2_r) < 0)
 			return -1;
 
 		if (box->v.sync_notify != NULL) {
@@ -59,6 +59,8 @@ dbox_next_expunge(struct dbox_sync_conte
 						   MAILBOX_SYNC_TYPE_EXPUNGE);
 			}
 		}
+		for (seq = sync_rec->seq1; seq != sync_rec->seq2; seq++)
+			mail_index_expunge(ctx->trans, seq);
 
 		return 1;
 	}
diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-storage/index/dbox/dbox-sync.c
--- a/src/lib-storage/index/dbox/dbox-sync.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-storage/index/dbox/dbox-sync.c	Fri Jun 15 18:09:09 2007 +0300
@@ -157,7 +157,7 @@ dbox_sync_write_mask(struct dbox_sync_co
 	struct dbox_mailbox *mbox = ctx->mbox;
 	struct mailbox *box = &mbox->ibox.box;
 	enum mailbox_sync_type sync_type;
-	uint32_t file_seq, uid2;
+	uint32_t file_seq, uid2, seq;
 	uoff_t offset;
 	unsigned int i, start;
 	int ret;
@@ -177,6 +177,8 @@ dbox_sync_write_mask(struct dbox_sync_co
 	switch (sync_rec->type) {
 	case MAIL_INDEX_SYNC_TYPE_EXPUNGE:
 		sync_type = MAILBOX_SYNC_TYPE_EXPUNGE;
+		for (seq = sync_rec->seq1; seq != sync_rec->seq2; seq++)
+			mail_index_expunge(ctx->trans, seq);
 		break;
 	case MAIL_INDEX_SYNC_TYPE_FLAGS:
 		sync_type = MAILBOX_SYNC_TYPE_FLAGS;
diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-storage/index/maildir/maildir-sync.c
--- a/src/lib-storage/index/maildir/maildir-sync.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Fri Jun 15 18:09:09 2007 +0300
@@ -416,6 +416,7 @@ static int maildir_expunge(struct maildi
 			box->v.sync_notify(box, ctx->uid,
 					   MAILBOX_SYNC_TYPE_EXPUNGE);
 		}
+		mail_index_expunge(ctx->trans, ctx->seq);
 		mbox->dirty_cur_time = ioloop_time;
 		return 1;
 	}
@@ -583,15 +584,13 @@ maildir_sync_record_commit_until(struct 
 		if (expunged) {
 			maildir_sync_check_timeouts(ctx->maildir_sync_ctx,
 						    TRUE);
-			if (maildir_file_do(ctx->mbox, uid,
-					    maildir_expunge, ctx) < 0)
-				return -1;
+			(void)maildir_file_do(ctx->mbox, uid,
+					      maildir_expunge, ctx);
 		} else if (flag_changed) {
 			maildir_sync_check_timeouts(ctx->maildir_sync_ctx,
 						    TRUE);
-			if (maildir_file_do(ctx->mbox, uid,
-					    maildir_sync_flags, ctx) < 0)
-				return -1;
+			(void)maildir_file_do(ctx->mbox, uid,
+					      maildir_sync_flags, ctx);
 		}
 
 		for (i = count; i > 0; i--) {
diff -r 7d9edc094ec7 -r 1fa32e040ea5 src/lib-storage/index/mbox/mbox-sync.c
--- a/src/lib-storage/index/mbox/mbox-sync.c	Thu Jun 14 21:52:08 2007 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync.c	Fri Jun 15 18:09:09 2007 +0300
@@ -731,6 +731,7 @@ static void mbox_sync_handle_expunge(str
 		box->v.sync_notify(box, mail_ctx->mail.uid,
 				   MAILBOX_SYNC_TYPE_EXPUNGE);
 	}
+	mail_index_expunge(sync_ctx->t, mail_ctx->mail.idx_seq);
 
 	mail_ctx->mail.expunged = TRUE;
 	mail_ctx->mail.offset = mail_ctx->mail.from_offset;


More information about the dovecot-cvs mailing list