From: Timo Sirainen Date: Tue, 9 Feb 2010 00:04:00 +0000 (+0200) Subject: lib-index: Index deletion is now a request that gets finalized by index sync. X-Git-Tag: 2.0.beta3~125 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d041ddb437ee7000174161405581ab85c0ba314a;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Index deletion is now a request that gets finalized by index sync. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index b659fa522d..5f742e62f1 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -226,6 +226,7 @@ struct mail_index { unsigned int index_lock_timeout:1; unsigned int opened:1; + unsigned int index_delete_requested:1; /* next sync sets it deleted */ unsigned int index_deleted:1; /* no changes allowed anymore */ unsigned int log_locked:1; unsigned int readonly:1; diff --git a/src/lib-index/mail-index-sync-update.c b/src/lib-index/mail-index-sync-update.c index ff81205bd1..6cd4680e16 100644 --- a/src/lib-index/mail-index-sync-update.c +++ b/src/lib-index/mail-index-sync-update.c @@ -815,10 +815,14 @@ int mail_index_sync_record(struct mail_index_sync_map_ctx *ctx, break; } case MAIL_TRANSACTION_INDEX_DELETED: - if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) - break; - /* transaction log syncing should have already set this */ - i_assert(ctx->view->index->index_deleted); + if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) { + /* next sync finishes the deletion */ + ctx->view->index->index_delete_requested = TRUE; + } else { + /* transaction log syncing should have already + set this */ + i_assert(ctx->view->index->index_deleted); + } break; default: mail_index_sync_set_corrupted(ctx, diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index bfd1dab606..75a4bac100 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -482,6 +482,11 @@ int mail_index_sync_begin_to(struct mail_index *index, index->syncing = TRUE; + if (index->index_delete_requested) { + /* finish this sync by marking the index deleted */ + mail_index_set_deleted(ctx->ext_trans); + } + *ctx_r = ctx; *view_r = ctx->view; *trans_r = ctx->ext_trans; diff --git a/src/lib-index/mail-index-transaction-update.c b/src/lib-index/mail-index-transaction-update.c index 88e4f5f494..0abede6273 100644 --- a/src/lib-index/mail-index-transaction-update.c +++ b/src/lib-index/mail-index-transaction-update.c @@ -1172,8 +1172,6 @@ void mail_index_reset(struct mail_index_transaction *t) void mail_index_set_deleted(struct mail_index_transaction *t) { - i_assert((t->flags & MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL) != 0); - t->index_deleted = TRUE; }