]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Make sure to stop running commands requiring synced ring when ring is no...
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 7 Sep 2018 17:04:48 +0000 (20:04 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Mon, 24 Sep 2018 11:30:00 +0000 (14:30 +0300)
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
src/director/doveadm-connection.h
src/director/main.c

index 3a52109fb8d4ed4988fed0faeef30310bdede1cf..947a3af266b4305ce685ccf8f3b9eda71ac792f0 100644 (file)
@@ -1166,9 +1166,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 =
@@ -1180,5 +1181,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();
 }
index 0b55d85612ec5198c7622a536ab4ab057e73e9ab..04904b617c12708fb67d75a3d48d387d80684445 100644 (file)
@@ -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
index 527351002e5f11fd677c59342299748fb7363a80..eff0a124184e69e7ed4b5414a4796c9c9c403f7b 100644 (file)
@@ -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)