]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Index deletion is now a request that gets finalized by index sync.
authorTimo Sirainen <tss@iki.fi>
Tue, 9 Feb 2010 00:04:00 +0000 (02:04 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 9 Feb 2010 00:04:00 +0000 (02:04 +0200)
--HG--
branch : HEAD

src/lib-index/mail-index-private.h
src/lib-index/mail-index-sync-update.c
src/lib-index/mail-index-sync.c
src/lib-index/mail-index-transaction-update.c

index b659fa522d48943842818f04de74d4f81d3bb0df..5f742e62f1af19405f2d57b17562a712c54a5e9f 100644 (file)
@@ -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;
index ff81205bd198a06fe44517a7114ed063ecf46211..6cd4680e1625dc2e96cec74d9fe21f904f488009 100644 (file)
@@ -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,
index bfd1dab606eaccfd2c954fd3d684bb186db7f144..75a4bac10069fd2a24e55ed27effe413c2ff4165 100644 (file)
@@ -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;
index 88e4f5f4946f20a0965de3437aeac6f2498424d6..0abede6273a65decc001a050ffc279faca7a30b6 100644 (file)
@@ -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;
 }