From 65d75c85a42622b5e17428dfe695e9b1cecf4ab8 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 7 Sep 2018 20:04:48 +0300 Subject: [PATCH] doveadm: Make sure to stop running commands requiring synced ring when ring is no longer synced A command could desync the ring, and no more commands should be run afterwards. This also fixes a bug where a command that desyncs the ring is supposed to wait for the ring being synced before returning OK, but returns it immediately instead. --- src/director/doveadm-connection.c | 8 +++++--- src/director/doveadm-connection.h | 2 +- src/director/main.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/director/doveadm-connection.c b/src/director/doveadm-connection.c index be2c03f2f0..03418725fb 100644 --- a/src/director/doveadm-connection.c +++ b/src/director/doveadm-connection.c @@ -1169,9 +1169,10 @@ static void doveadm_connections_continue_reset_cmds(void) } } -void doveadm_connections_ring_synced(void) +void doveadm_connections_ring_synced(struct director *dir) { - while (doveadm_ring_sync_pending_connections != NULL) { + while (doveadm_ring_sync_pending_connections != NULL && + dir->ring_synced) { struct doveadm_connection *conn = doveadm_ring_sync_pending_connections; doveadm_connection_ring_sync_callback_t *callback = @@ -1183,5 +1184,6 @@ void doveadm_connections_ring_synced(void) io_set_pending(conn->io); callback(conn); } - doveadm_connections_continue_reset_cmds(); + if (dir->ring_synced) + doveadm_connections_continue_reset_cmds(); } diff --git a/src/director/doveadm-connection.h b/src/director/doveadm-connection.h index 0b55d85612..04904b617c 100644 --- a/src/director/doveadm-connection.h +++ b/src/director/doveadm-connection.h @@ -8,6 +8,6 @@ doveadm_connection_init(struct director *dir, int fd); void doveadm_connections_deinit(void); void doveadm_connections_kick_callback(struct director *dir); -void doveadm_connections_ring_synced(void); +void doveadm_connections_ring_synced(struct director *dir); #endif diff --git a/src/director/main.c b/src/director/main.c index 96cea27864..36f05bae3f 100644 --- a/src/director/main.c +++ b/src/director/main.c @@ -253,7 +253,7 @@ static void director_state_changed(struct director *dir) if (dir->to_request != NULL && array_count(&new_requests) == 0) timeout_remove(&dir->to_request); - doveadm_connections_ring_synced(); + doveadm_connections_ring_synced(dir); } static void main_preinit(void) -- 2.47.3