]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Make sure director restart notifications go to everyone in the ring.
authorTimo Sirainen <tss@iki.fi>
Fri, 20 Sep 2013 07:35:34 +0000 (10:35 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 20 Sep 2013 07:35:34 +0000 (10:35 +0300)
src/director/director-connection.c

index 36e2b41e25c90769b6bf3af5f547afd3a2d7d6bb..228a9121133417ef4d6c3375f08d01af58e1b56a 100644 (file)
@@ -625,7 +625,6 @@ static bool director_cmd_director(struct director_connection *conn,
        struct director_host *host;
        struct ip_addr ip;
        unsigned int port;
-       bool forward = FALSE;
 
        if (!director_args_parse_ip_port(conn, args, &ip, &port))
                return FALSE;
@@ -644,20 +643,18 @@ static bool director_cmd_director(struct director_connection *conn,
                /* already have this. just reset its last_network_failure
                   timestamp, since it might be up now. */
                host->last_network_failure = 0;
-               if (host->last_seq != 0 || host->last_sync_seq != 0) {
-                       /* it also may have been restarted, reset its state */
-                       director_host_restarted(host);
-                       forward = TRUE;
-               }
+               /* it also may have been restarted, reset its state */
+               director_host_restarted(host);
        } else {
                /* save the director and forward it */
                host = director_host_add(conn->dir, &ip, port);
-               forward = TRUE;
-       }
-       if (forward) {
-               director_notify_ring_added(host,
-                       director_connection_get_host(conn));
        }
+       /* just forward this to the entire ring until it reaches back to
+          itself. some hosts may see this twice, but that's the only way to
+          guarantee that it gets seen by everyone. reseting the host multiple
+          times may cause us to handle its commands multiple times, but the
+          commands can handle that. */
+       director_notify_ring_added(host, director_connection_get_host(conn));
        return TRUE;
 }