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.
}
}
-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 =
io_set_pending(conn->io);
callback(conn);
}
- doveadm_connections_continue_reset_cmds();
+ if (dir->ring_synced)
+ doveadm_connections_continue_reset_cmds();
}
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
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)