dovecot-2.2: director: If we disconnect a director, pass the rea...

dovecot at dovecot.org dovecot at dovecot.org
Wed May 13 01:13:34 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/27baf04f2b18
changeset: 18662:27baf04f2b18
user:      Timo Sirainen <tss at iki.fi>
date:      Wed May 13 04:10:18 2015 +0300
description:
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.

diffstat:

 src/director/director-connection.c |  42 +++++++++++++++++++++++--------------
 1 files changed, 26 insertions(+), 16 deletions(-)

diffs (132 lines):

diff -r f43adca71e15 -r 27baf04f2b18 src/director/director-connection.c
--- a/src/director/director-connection.c	Wed May 13 04:07:46 2015 +0300
+++ b/src/director/director-connection.c	Wed May 13 04:10:18 2015 +0300
@@ -131,11 +131,13 @@
 	unsigned int done_pending:1;
 };
 
-static void director_connection_disconnected(struct director_connection **conn);
+static void director_connection_disconnected(struct director_connection **conn,
+					     const char *reason);
 static void director_connection_reconnect(struct director_connection **conn,
 					  const char *reason);
 static void
-director_connection_log_disconnect(struct director_connection *conn, int err);
+director_connection_log_disconnect(struct director_connection *conn, int err,
+				   const char *errstr);
 static int director_connection_send_done(struct director_connection *conn);
 
 static void ATTR_FORMAT(2, 3)
@@ -169,7 +171,7 @@
 		i_error("director(%s): Handshaking DONE timed out (%u secs)",
 			conn->name, secs);
 	}
-	director_connection_disconnected(&conn);
+	director_connection_disconnected(&conn, "Handshake timeout");
 }
 
 static void
@@ -187,7 +189,7 @@
 
 static void director_connection_wait_timeout(struct director_connection *conn)
 {
-	director_connection_log_disconnect(conn, ETIMEDOUT);
+	director_connection_log_disconnect(conn, ETIMEDOUT, "");
 	director_connection_deinit(&conn,
 		"Timeout waiting for disconnect after CONNECT");
 }
@@ -1453,7 +1455,8 @@
 }
 
 static void
-director_connection_log_disconnect(struct director_connection *conn, int err)
+director_connection_log_disconnect(struct director_connection *conn, int err,
+				   const char *errstr)
 {
 	unsigned int secs = ioloop_time - conn->created;
 	string_t *str = t_str_new(128);
@@ -1471,7 +1474,10 @@
 	str_append(str, "Connection closed");
 	if (err != 0 && err != EPIPE) {
 		errno = err;
-		str_printfa(str, ": %m");
+		if (errstr[0] == '\0')
+			str_printfa(str, ": %m");
+		else
+			str_printfa(str, ": %s", errstr);
 	}
 
 	str_printfa(str, " (connected %u secs, "
@@ -1496,8 +1502,9 @@
 		return;
 	case -1:
 		/* disconnected */
-		director_connection_log_disconnect(conn, conn->input->stream_errno);
-		director_connection_disconnected(&conn);
+		director_connection_log_disconnect(conn, conn->input->stream_errno,
+						   i_stream_get_error(conn->input));
+		director_connection_disconnected(&conn, i_stream_get_error(conn->input));
 		return;
 	case -2:
 		/* buffer full */
@@ -1637,10 +1644,12 @@
 		o_stream_cork(conn->output);
 		ret = director_connection_send_users(conn);
 		o_stream_uncork(conn->output);
-		if (ret < 0)
-			director_connection_disconnected(&conn);
-		else
+		if (ret < 0) {
+			director_connection_disconnected(&conn,
+				o_stream_get_error(conn->output));
+		} else {
 			o_stream_set_flush_pending(conn->output, TRUE);
+		}
 		return ret;
 	}
 	return o_stream_flush(conn->output);
@@ -1698,7 +1707,7 @@
 	if ((err = net_geterror(conn->fd)) != 0) {
 		i_error("director(%s): connect() failed: %s", conn->name,
 			strerror(err));
-		director_connection_disconnected(&conn);
+		director_connection_disconnected(&conn, strerror(err));
 		return;
 	}
 	conn->connected = TRUE;
@@ -1810,7 +1819,8 @@
 	}
 }
 
-void director_connection_disconnected(struct director_connection **_conn)
+void director_connection_disconnected(struct director_connection **_conn,
+				      const char *reason)
 {
 	struct director_connection *conn = *_conn;
 	struct director *dir = conn->dir;
@@ -1822,7 +1832,7 @@
 		conn->host->last_network_failure = ioloop_time;
 	}
 
-	director_connection_deinit(_conn, "");
+	director_connection_deinit(_conn, reason);
 	if (dir->right == NULL)
 		director_connect(dir);
 }
@@ -1868,14 +1878,14 @@
 director_connection_ping_idle_timeout(struct director_connection *conn)
 {
 	i_error("director(%s): Ping timed out, disconnecting", conn->name);
-	director_connection_disconnected(&conn);
+	director_connection_disconnected(&conn, "Ping timeout");
 }
 
 static void director_connection_pong_timeout(struct director_connection *conn)
 {
 	i_error("director(%s): PONG reply not received although other "
 		"input keeps coming, disconnecting", conn->name);
-	director_connection_disconnected(&conn);
+	director_connection_disconnected(&conn, "Pong timeout");
 }
 
 void director_connection_ping(struct director_connection *conn)


More information about the dovecot-cvs mailing list