From: Timo Sirainen Date: Fri, 16 Jul 2010 12:57:41 +0000 (+0100) Subject: dsync: Added more asserts to dsync_worker_finish() handling X-Git-Tag: 2.0.rc3~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=52c5ac72c9e1a4c6f316952f08a764654c08229b;p=thirdparty%2Fdovecot%2Fcore.git dsync: Added more asserts to dsync_worker_finish() handling --- diff --git a/src/dsync/dsync-proxy-client.c b/src/dsync/dsync-proxy-client.c index 92d55ece25..6aad2ac939 100644 --- a/src/dsync/dsync-proxy-client.c +++ b/src/dsync/dsync-proxy-client.c @@ -68,6 +68,7 @@ struct proxy_client_dsync_worker { struct aqueue *request_queue; unsigned int handshake_received:1; + unsigned int finishing:1; unsigned int finished:1; }; @@ -247,6 +248,12 @@ proxy_client_worker_next_finish(struct proxy_client_dsync_worker *worker, { bool success = TRUE; + i_assert(worker->finishing); + i_assert(!worker->finished); + + worker->finishing = FALSE; + worker->finished = TRUE; + if (strcmp(line, "changes") == 0) worker->worker.unexpected_changes = TRUE; else if (strcmp(line, "fail") == 0) @@ -285,8 +292,6 @@ proxy_client_worker_next_reply(struct proxy_client_dsync_worker *worker, ret = proxy_client_worker_next_msg_get(worker, &request, line); break; case PROXY_CLIENT_REQUEST_TYPE_FINISH: - i_assert(!worker->finished); - worker->finished = TRUE; proxy_client_worker_next_finish(worker, &request, line); break; } @@ -1062,7 +1067,9 @@ proxy_client_worker_finish(struct dsync_worker *_worker, struct proxy_client_request request; i_assert(worker->save_input == NULL); + i_assert(!worker->finishing); + worker->finishing = TRUE; worker->finished = FALSE; o_stream_send_str(worker->output, "FINISH\n"); diff --git a/src/dsync/dsync-worker-local.c b/src/dsync/dsync-worker-local.c index e9a916c962..4458677ceb 100644 --- a/src/dsync/dsync-worker-local.c +++ b/src/dsync/dsync-worker-local.c @@ -102,6 +102,7 @@ struct local_dsync_worker { void *finish_context; unsigned int reading_mail:1; + unsigned int finishing:1; unsigned int finished:1; }; @@ -1510,7 +1511,9 @@ static void dsync_worker_try_finish(struct local_dsync_worker *worker) if (worker->save_io != NULL || worker->reading_mail) return; + i_assert(worker->finishing); i_assert(!worker->finished); + worker->finishing = FALSE; worker->finished = TRUE; worker->finish_callback(!worker->worker.failed, worker->finish_context); } @@ -1700,6 +1703,9 @@ local_worker_finish(struct dsync_worker *_worker, struct local_dsync_worker *worker = (struct local_dsync_worker *)_worker; + i_assert(!worker->finishing); + + worker->finishing = TRUE; worker->finished = FALSE; worker->finish_callback = callback; worker->finish_context = context;