]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
layout=index: Allow mailbox create/delete/rename during mailbox list iteration.
authorTimo Sirainen <tss@iki.fi>
Thu, 30 May 2013 18:45:13 +0000 (21:45 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 30 May 2013 18:45:13 +0000 (21:45 +0300)
src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-index.c
src/lib-storage/list/mailbox-list-index.h

index 659f7ff990fb234eb97d8bfd503818153b02f7ec..2f691634b3fc1dfcd4ddf843ac3fe6739081c768 100644 (file)
@@ -59,7 +59,8 @@ mailbox_list_index_iter_init(struct mailbox_list *list,
                ctx->info.ns = list->ns;
                ctx->path = str_new(pool, 128);
                ctx->next_node = ilist->mailbox_tree;
-               ilist->iter_refcount++;
+               ctx->mailbox_pool = ilist->mailbox_pool;
+               pool_ref(ctx->mailbox_pool);
        }
        return &ctx->ctx;
 }
@@ -188,10 +189,8 @@ int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 
        if (ctx->backend_ctx != NULL)
                ret = ilist->module_ctx.super.iter_deinit(ctx->backend_ctx);
-       else {
-               i_assert(ilist->iter_refcount > 0);
-               ilist->iter_refcount--;
-       }
+       else
+               pool_unref(&ctx->mailbox_pool);
 
        pool_unref(&ctx->info_pool);
        pool_unref(&_ctx->pool);
index 61391ea1c668082989594ac7c84807de829c0cd1..7fb1b099ea8dde2eb6844ec694c1f80b1e4640db 100644 (file)
@@ -23,17 +23,25 @@ void mailbox_list_index_set_index_error(struct mailbox_list *list)
        mail_index_reset_error(ilist->index);
 }
 
+static void mailbox_list_index_init_pool(struct mailbox_list_index *ilist)
+{
+       ilist->mailbox_pool = pool_alloconly_create("mailbox list index", 4096);
+       hash_table_create_direct(&ilist->mailbox_names, ilist->mailbox_pool, 0);
+       hash_table_create_direct(&ilist->mailbox_hash, ilist->mailbox_pool, 0);
+}
+
 void mailbox_list_index_reset(struct mailbox_list_index *ilist)
 {
-       i_assert(ilist->iter_refcount == 0);
+       hash_table_destroy(&ilist->mailbox_names);
+       hash_table_destroy(&ilist->mailbox_hash);
+       pool_unref(&ilist->mailbox_pool);
 
-       hash_table_clear(ilist->mailbox_names, TRUE);
-       hash_table_clear(ilist->mailbox_hash, TRUE);
-       p_clear(ilist->mailbox_pool);
        ilist->mailbox_tree = NULL;
        ilist->highest_name_id = 0;
        ilist->sync_log_file_seq = 0;
        ilist->sync_log_file_offset = 0;
+
+       mailbox_list_index_init_pool(ilist);
 }
 
 static int mailbox_list_index_index_open(struct mailbox_list *list)
@@ -300,8 +308,6 @@ int mailbox_list_index_parse(struct mailbox_list *list,
        const struct mail_index_header *hdr;
        const char *error;
 
-       i_assert(ilist->iter_refcount == 0);
-
        hdr = mail_index_get_header(view);
        if (!force &&
            hdr->log_file_seq == ilist->sync_log_file_seq &&
@@ -357,11 +363,6 @@ int mailbox_list_index_refresh(struct mailbox_list *list)
        struct mail_index_view *view;
        int ret;
 
-       if (ilist->iter_refcount > 0) {
-               /* someone's already iterating. don't break them. */
-               return 0;
-       }
-
        if (mailbox_list_index_index_open(list) < 0)
                return -1;
        if (mail_index_refresh(ilist->index) < 0) {
@@ -608,10 +609,7 @@ static void mailbox_list_index_init_finish(struct mailbox_list *list)
        ilist->subs_hdr_ext_id = mail_index_ext_register(ilist->index, "subs",
                                                         sizeof(uint32_t), 0,
                                                         sizeof(uint32_t));
-
-       ilist->mailbox_pool = pool_alloconly_create("mailbox list index", 4096);
-       hash_table_create_direct(&ilist->mailbox_names, ilist->mailbox_pool, 0);
-       hash_table_create_direct(&ilist->mailbox_hash, ilist->mailbox_pool, 0);
+       mailbox_list_index_init_pool(ilist);
 
        mailbox_list_index_status_init_finish(list);
 }
index 6b350aac1504eb55a69279600b97721f479bbbcf..7bf99c22fed5b5f3ea9b184b355072022efbd14c 100644 (file)
@@ -87,10 +87,6 @@ struct mailbox_list_index {
        struct mail_index *index;
        uint32_t ext_id, msgs_ext_id, hmodseq_ext_id, subs_hdr_ext_id;
 
-       /* Number of iterations going on. Don't refresh mailbox list while
-          any iterations are going on. */
-       int iter_refcount;
-
        pool_t mailbox_pool;
        /* uin32_t id => name */
        HASH_TABLE(void *, char *) mailbox_names;
@@ -115,6 +111,7 @@ struct mailbox_list_index {
 struct mailbox_list_index_iterate_context {
        struct mailbox_list_iterate_context ctx;
        struct mailbox_list_iterate_context *backend_ctx;
+       pool_t mailbox_pool;
 
        struct mailbox_info info;
        pool_t info_pool;