]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Log info line for every incoming/outgoing connection
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 14 Sep 2017 14:35:02 +0000 (17:35 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 15 Sep 2017 09:00:26 +0000 (12:00 +0300)
This can help with debugging problems.

src/director/director-connection.c
src/director/director.c
src/director/director.h
src/director/main.c

index 0c0a36d9107c0a260020ac6220ce059defaa53d0..dc0b898374536c80ba87dfa9478c695b0954d270 100644 (file)
@@ -515,7 +515,7 @@ static bool director_cmd_me(struct director_connection *conn,
                   its failed state, so we can connect to it */
                conn->host->last_network_failure = 0;
                if (!director_has_outgoing_connections(dir))
-                       director_connect(dir);
+                       director_connect(dir, "Connecting to left");
        } else if (dir->left->host == conn->host) {
                /* b) */
                i_assert(dir->left != conn);
@@ -1597,6 +1597,7 @@ static bool director_cmd_connect(struct director_connection *conn,
        struct director_host *host;
        struct ip_addr ip;
        in_port_t port;
+       const char *right_state;
 
        if (str_array_length(args) != 2 ||
            !director_args_parse_ip_port(conn, args, &ip, &port)) {
@@ -1622,16 +1623,16 @@ static bool director_cmd_connect(struct director_connection *conn,
        host->removed = FALSE;
 
        if (dir->right == NULL) {
-               dir_debug("Received CONNECT request to %s, "
-                         "initializing right", host->name);
+               right_state = "initializing right";
        } else {
-               dir_debug("Received CONNECT request to %s, "
-                         "replacing current right %s",
-                         host->name, dir->right->name);
+               right_state = t_strdup_printf("replacing current right %s",
+                                             dir->right->name);
        }
 
        /* connect here */
-       (void)director_connect_host(dir, host);
+       (void)director_connect_host(dir, host, t_strdup_printf(
+               "Received CONNECT request from %s - %s",
+               conn->name, right_state));
        return TRUE;
 }
 
@@ -2022,6 +2023,7 @@ director_connection_init_in(struct director *dir, int fd,
        conn->to_ping = timeout_add(DIRECTOR_CONNECTION_ME_TIMEOUT_MSECS,
                                    director_connection_init_timeout, conn);
 
+       i_info("Incoming connection from director %s", conn->name);
        director_connection_send_handshake(conn);
        return conn;
 }
@@ -2179,7 +2181,7 @@ static void director_connection_disconnected(struct director_connection **_conn,
 
        director_connection_deinit(_conn, reason);
        if (dir->right == NULL)
-               director_connect(dir);
+               director_connect(dir, "Reconnecting after disconnection");
 }
 
 static void director_connection_reconnect(struct director_connection **_conn,
@@ -2190,7 +2192,7 @@ static void director_connection_reconnect(struct director_connection **_conn,
 
        director_connection_deinit(_conn, reason);
        if (dir->right == NULL)
-               director_connect(dir);
+               director_connect(dir, "Reconnecting after error");
 }
 
 void director_connection_send(struct director_connection *conn,
index bcddbb6547631c80a11b185aad897895f975a1dc..95b79826ff12b70b4311b5e7913c63646f53ea55 100644 (file)
@@ -126,7 +126,8 @@ director_has_outgoing_connection(struct director *dir,
 }
 
 static void
-director_log_connect(struct director *dir, struct director_host *host)
+director_log_connect(struct director *dir, struct director_host *host,
+                    const char *reason)
 {
        string_t *str = t_str_new(128);
 
@@ -138,12 +139,13 @@ director_log_connect(struct director *dir, struct director_host *host)
                str_printfa(str, ", last protocol failure %ds ago",
                            (int)(ioloop_time - host->last_protocol_failure));
        }
-       dir_debug("Connecting to %s:%u (as %s%s)",
-                 net_ip2addr(&host->ip), host->port,
-                 net_ip2addr(&dir->self_ip), str_c(str));
+       i_info("Connecting to %s:%u (as %s%s): %s",
+              net_ip2addr(&host->ip), host->port,
+              net_ip2addr(&dir->self_ip), str_c(str), reason);
 }
 
-int director_connect_host(struct director *dir, struct director_host *host)
+int director_connect_host(struct director *dir, struct director_host *host,
+                         const char *reason)
 {
        in_port_t port;
        int fd;
@@ -151,8 +153,7 @@ int director_connect_host(struct director *dir, struct director_host *host)
        if (director_has_outgoing_connection(dir, host))
                return 0;
 
-       if (director_debug)
-               director_log_connect(dir, host);
+       director_log_connect(dir, host, reason);
        port = dir->test_port != 0 ? dir->test_port : host->port;
        fd = net_connect_ip(&host->ip, port, &dir->self_ip);
        if (fd == -1) {
@@ -190,6 +191,11 @@ director_get_preferred_right_host(struct director *dir)
        return NULL;
 }
 
+static void director_quick_reconnect_retry(struct director *dir)
+{
+       director_connect(dir, "Alone in director ring - trying to connect to others");
+}
+
 static bool director_wait_for_others(struct director *dir)
 {
        struct director_host *const *hostp;
@@ -210,11 +216,11 @@ static bool director_wait_for_others(struct director *dir)
        if (dir->to_reconnect != NULL)
                timeout_remove(&dir->to_reconnect);
        dir->to_reconnect = timeout_add(DIRECTOR_QUICK_RECONNECT_TIMEOUT_MSECS,
-                                       director_connect, dir);
+                                       director_quick_reconnect_retry, dir);
        return TRUE;
 }
 
-void director_connect(struct director *dir)
+void director_connect(struct director *dir, const char *reason)
 {
        struct director_host *const *hosts;
        unsigned int i, count, self_idx;
@@ -242,7 +248,7 @@ void director_connect(struct director *dir)
                        continue;
                }
 
-               if (director_connect_host(dir, hosts[idx]) == 0) {
+               if (director_connect_host(dir, hosts[idx], reason) == 0) {
                        /* success */
                        return;
                }
@@ -298,9 +304,10 @@ static void director_reconnect_timeout(struct director *dir)
 
        if (preferred_host == NULL) {
                /* all directors have been removed, try again later */
-       } else if (cur_host != preferred_host)
-               (void)director_connect_host(dir, preferred_host);
-       else {
+       } else if (cur_host != preferred_host) {
+               (void)director_connect_host(dir, preferred_host,
+                       "Reconnect attempt to preferred director");
+       } else {
                /* the connection hasn't finished sync yet.
                   keep this timeout for now. */
        }
@@ -552,7 +559,7 @@ void director_ring_remove(struct director_host *removed_host,
                }
        }
        if (dir->right == NULL)
-               director_connect(dir);
+               director_connect(dir, "Reconnecting after director was removed");
 
        cmd = t_strdup_printf("DIRECTOR-REMOVE\t%s\t%u\n",
                              net_ip2addr(&removed_host->ip),
index eb8df42472b3ed969c94db2ef9bd1f29f7518a67..ceef55aab4a4887fab6c0fa515d33e3ae3b5e220 100644 (file)
@@ -169,7 +169,7 @@ void director_deinit(struct director **dir);
 void director_find_self(struct director *dir);
 
 /* Start connecting to other directors */
-void director_connect(struct director *dir);
+void director_connect(struct director *dir, const char *reason);
 
 void director_set_ring_handshaked(struct director *dir);
 void director_set_ring_synced(struct director *dir);
@@ -235,7 +235,8 @@ void director_update_send_version(struct director *dir,
                                  struct director_host *src,
                                  unsigned int min_version, const char *cmd);
 
-int director_connect_host(struct director *dir, struct director_host *host);
+int director_connect_host(struct director *dir, struct director_host *host,
+                         const char *reason);
 
 bool
 director_get_username_hash(struct director *dir, const char *username,
index fbd0634620301009272c4cccfb702d7a39a9cc53..b8c983405f87912b2ec846d2583612ca41a29fdb 100644 (file)
@@ -338,7 +338,7 @@ int main(int argc, char *argv[])
        main_preinit();
        director->test_port = test_port;
        director_debug = debug;
-       director_connect(director);
+       director_connect(director, "Initial connection");
 
        if (director->test_port != 0) {
                /* we're testing, possibly writing to same log file.