]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Added more debug information to "Ping timed out" error
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 2 Aug 2016 19:31:50 +0000 (22:31 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 4 Aug 2016 17:25:25 +0000 (20:25 +0300)
src/director/director-connection.c

index 5bc65386e6e9fecc24163fb5de02d91a14090620..5797f9cdcbdc24d4c861a0814c1dcdc1c26a729c 100644 (file)
@@ -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 @@ struct director_connection {
        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 @@ static void director_connection_input(struct director_connection *conn)
                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;
@@ -1828,6 +1832,7 @@ static int director_connection_output(struct director_connection *conn)
 {
        int ret;
 
+       conn->last_output = ioloop_timeval;
        if (conn->user_iter != NULL) {
                /* still handshaking USER list */
                ret = director_connection_send_users(conn);
@@ -2068,7 +2073,20 @@ void director_connection_send(struct director_connection *conn,
 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");
 }