changeset 22564:17b1e65e6d70

director: Log info line for every incoming/outgoing connection This can help with debugging problems.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 14 Sep 2017 17:35:02 +0300
parents ef58e0487991
children ad4d877d655b
files src/director/director-connection.c src/director/director.c src/director/director.h src/director/main.c
diffstat 4 files changed, 36 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/director/director-connection.c	Thu Sep 14 17:33:19 2017 +0300
+++ b/src/director/director-connection.c	Thu Sep 14 17:35:02 2017 +0300
@@ -515,7 +515,7 @@
 		   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);
@@ -1595,6 +1595,7 @@
 	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)) {
@@ -1620,16 +1621,16 @@
 	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 @@
 	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 @@
 
 	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 @@
 
 	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,
--- a/src/director/director.c	Thu Sep 14 17:33:19 2017 +0300
+++ b/src/director/director.c	Thu Sep 14 17:35:02 2017 +0300
@@ -129,7 +129,8 @@
 }
 
 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);
 
@@ -141,12 +142,13 @@
 		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;
@@ -154,8 +156,7 @@
 	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) {
@@ -193,6 +194,11 @@
 	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;
@@ -213,11 +219,11 @@
 	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;
@@ -245,7 +251,7 @@
 			continue;
 		}
 
-		if (director_connect_host(dir, hosts[idx]) == 0) {
+		if (director_connect_host(dir, hosts[idx], reason) == 0) {
 			/* success */
 			return;
 		}
@@ -301,9 +307,10 @@
 
 	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. */
 	}
@@ -555,7 +562,7 @@
 		}
 	}
 	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),
--- a/src/director/director.h	Thu Sep 14 17:33:19 2017 +0300
+++ b/src/director/director.h	Thu Sep 14 17:35:02 2017 +0300
@@ -169,7 +169,7 @@
 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);
@@ -238,7 +238,8 @@
 				  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);
 
 unsigned int
 director_get_username_hash(struct director *dir, const char *username);
--- a/src/director/main.c	Thu Sep 14 17:33:19 2017 +0300
+++ b/src/director/main.c	Thu Sep 14 17:35:02 2017 +0300
@@ -343,7 +343,7 @@
 	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.