changeset 5743:1fa32e040ea5 HEAD

Treat non-external expunges as requests for expunging messages. If it's actually possible, mailbox syncing will then commit external expunges.
author Timo Sirainen <tss@iki.fi>
date Fri, 15 Jun 2007 18:09:09 +0300
parents 7d9edc094ec7
children bf9f97c09250
files src/lib-index/mail-index-sync-update.c src/lib-index/mail-index-view-sync.c src/lib-storage/index/cydir/cydir-sync.c src/lib-storage/index/dbox/dbox-sync-expunge.c src/lib-storage/index/dbox/dbox-sync.c src/lib-storage/index/maildir/maildir-sync.c src/lib-storage/index/mbox/mbox-sync.c
diffstat 7 files changed, 33 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	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 @@
 	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 @@
 	   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 @@
 			     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 @@
 	/* 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
--- 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 @@
 						     &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) {
@@ -520,6 +524,12 @@
 		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;
 		rec->uid1 = exp->uid1;
--- 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 @@
 				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));
--- 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 @@
 		  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;
+		sync_rec = &sync_recs[*sync_idx];
 
-		if (sync_recs[*sync_idx].type != MAIL_INDEX_SYNC_TYPE_EXPUNGE)
+		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 @@
 						   MAILBOX_SYNC_TYPE_EXPUNGE);
 			}
 		}
+		for (seq = sync_rec->seq1; seq != sync_rec->seq2; seq++)
+			mail_index_expunge(ctx->trans, seq);
 
 		return 1;
 	}
--- 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 @@
 	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 @@
 	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;
--- 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 @@
 			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 @@
 		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--) {
--- 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 @@
 		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;