Mercurial > dovecot > original-hg > dovecot-1.2
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;