From: Timo Sirainen Date: Sat, 10 Jul 2010 17:11:55 +0000 (+0100) Subject: dsync: Fixed flushing asserts X-Git-Tag: 2.0.rc3~97 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4febc88426564defb95d7ba8dd65b6a4aa7ffc72;p=thirdparty%2Fdovecot%2Fcore.git dsync: Fixed flushing asserts --HG-- branch : HEAD --- diff --git a/src/dsync/dsync-brain-msgs-new.c b/src/dsync/dsync-brain-msgs-new.c index 3ac0d1477a..22a7332db1 100644 --- a/src/dsync/dsync-brain-msgs-new.c +++ b/src/dsync/dsync-brain-msgs-new.c @@ -52,6 +52,7 @@ static void msg_save_callback(void *context) { struct dsync_brain_msg_save_context *ctx = context; + i_warning("save done"); if (--ctx->iter->save_results_left == 0 && !ctx->iter->adding_msgs) dsync_brain_msg_sync_add_new_msgs(ctx->iter); i_free(ctx); @@ -67,7 +68,7 @@ static void msg_get_callback(enum dsync_msg_get_result result, i_assert(ctx->iter->save_results_left > 0); - mailbox = array_idx(&ctx->iter->sync->mailboxes, ctx->mailbox_idx); + mailbox = array_idx(&->iter->sync->mailboxes, ctx->mailbox_idx); switch (result) { case DSYNC_MSG_GET_RESULT_SUCCESS: /* the mailbox may have changed, make sure we've the @@ -175,6 +176,7 @@ dsync_brain_msg_sync_add_new_msg(struct dsync_brain_msg_iter *dest_iter, save_ctx->msg = msg->msg; save_ctx->mailbox_idx = dest_iter->mailbox_idx; + i_warning("retr %d", save_ctx->msg->uid); dest_iter->save_results_left++; dest_iter->adding_msgs = TRUE; dsync_worker_msg_get(src_iter->worker, src_mailbox, diff --git a/src/dsync/dsync-brain-private.h b/src/dsync/dsync-brain-private.h index 893c5bca35..3d655a974a 100644 --- a/src/dsync/dsync-brain-private.h +++ b/src/dsync/dsync-brain-private.h @@ -122,6 +122,7 @@ struct dsync_brain { struct dsync_brain_subs_list *dest_subs_list; struct dsync_brain_mailbox_sync *mailbox_sync; + struct timeout *to; unsigned int failed:1; unsigned int verbose:1; diff --git a/src/dsync/dsync-brain.c b/src/dsync/dsync-brain.c index 710efd4e6e..cb6339baf9 100644 --- a/src/dsync/dsync-brain.c +++ b/src/dsync/dsync-brain.c @@ -55,6 +55,8 @@ int dsync_brain_deinit(struct dsync_brain **_brain) if (brain->state != DSYNC_STATE_SYNC_END) ret = -1; + if (brain->to != NULL) + timeout_remove(&brain->to); if (ret < 0) { /* make sure we unreference save input streams before workers @@ -783,11 +785,14 @@ static void dsync_brain_worker_finished(bool success, void *context) dsync_brain_fail(brain); brain->state++; - dsync_brain_sync(brain); + if (brain->to == NULL) + brain->to = timeout_add(0, dsync_brain_sync, brain); } void dsync_brain_sync(struct dsync_brain *brain) { + if (brain->to != NULL) + timeout_remove(&brain->to); switch (brain->state) { case DSYNC_STATE_GET_MAILBOXES: i_assert(brain->src_mailbox_list == NULL); diff --git a/src/dsync/dsync-worker-local.c b/src/dsync/dsync-worker-local.c index 0e24d54616..79e655171a 100644 --- a/src/dsync/dsync-worker-local.c +++ b/src/dsync/dsync-worker-local.c @@ -1562,8 +1562,8 @@ local_worker_save_msg_continue(struct local_dsync_worker *worker) worker->save_callback = NULL; i_stream_unref(&worker->save_input); - callback(worker->save_context); dsync_worker_try_finish(worker); + callback(worker->save_context); } static void