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