]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Added more asserts to dsync_worker_finish() handling
authorTimo Sirainen <tss@iki.fi>
Fri, 16 Jul 2010 12:57:41 +0000 (13:57 +0100)
committerTimo Sirainen <tss@iki.fi>
Fri, 16 Jul 2010 12:57:41 +0000 (13:57 +0100)
src/dsync/dsync-proxy-client.c
src/dsync/dsync-worker-local.c

index 92d55ece259a628040bd2e1a92dfbfdb89acdb47..6aad2ac93961ec11804a5d3d74f5a256225f7024 100644 (file)
@@ -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");
index e9a916c962734223ada81ef197345bda35dc031b..4458677ceb7a0f5dcb8021c2c2e08f6743e4073b 100644 (file)
@@ -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;