changeset 20575:bceac5d8ae3b

director: Added more debug information to "Ping timed out" error
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 02 Aug 2016 22:31:50 +0300
parents 79fa3bdcfc95
children 6e584af6f758
files src/director/director-connection.c
diffstat 1 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/director/director-connection.c	Thu Aug 04 12:57:58 2016 +0300
+++ b/src/director/director-connection.c	Tue Aug 02 22:31:50 2016 +0300
@@ -36,6 +36,7 @@
 #include "ostream.h"
 #include "str.h"
 #include "strescape.h"
+#include "time-util.h"
 #include "master-service.h"
 #include "mail-host.h"
 #include "director.h"
@@ -99,6 +100,8 @@
 	time_t created;
 	unsigned int minor_version;
 
+	struct timeval last_input, last_output;
+
 	/* for incoming connections the director host isn't known until
 	   ME-line is received */
 	struct director_host *host;
@@ -1692,6 +1695,7 @@
 		i_stream_skip(conn->input, i_stream_get_data_size(conn->input));
 		return;
 	}
+	conn->last_input = ioloop_timeval;
 
 	director_sync_freeze(dir);
 	prev_offset = conn->input->v_offset;
@@ -1826,6 +1830,7 @@
 {
 	int ret;
 
+	conn->last_output = ioloop_timeval;
 	if (conn->user_iter != NULL) {
 		/* still handshaking USER list */
 		o_stream_cork(conn->output);
@@ -2068,7 +2073,20 @@
 static void
 director_connection_ping_idle_timeout(struct director_connection *conn)
 {
-	i_error("director(%s): Ping timed out, disconnecting", conn->name);
+	int input_diff = timeval_diff_msecs(&ioloop_timeval, &conn->last_input);
+	int output_diff = timeval_diff_msecs(&ioloop_timeval, &conn->last_output);
+	string_t *str = t_str_new(128);
+
+	str_printfa(str, "Ping timed out, disconnecting "
+		    "(last input %u.%03u s ago, last output %u.%03u s ago",
+		    input_diff/1000, input_diff%1000,
+		    output_diff/1000, output_diff%1000);
+	if (conn->handshake_received)
+		str_append(str, ", handshaked");
+	if (conn->synced)
+		str_append(str, ", synced");
+	str_append_c(str, ')');
+	i_error("director(%s): %s", conn->name, str_c(str));
 	director_connection_disconnected(&conn, "Ping timeout");
 }