From: Timo Sirainen Date: Thu, 26 Oct 2017 11:07:56 +0000 (+0300) Subject: director: Track connections' last ping time X-Git-Tag: 2.3.0.rc1~619 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1551f4a50a471f0adecd92dd1f94702beeed72d;p=thirdparty%2Fdovecot%2Fcore.git director: Track connections' last ping time --- diff --git a/src/director/director-connection.c b/src/director/director-connection.c index fc90d45225..8903e0a3a9 100644 --- a/src/director/director-connection.c +++ b/src/director/director-connection.c @@ -102,6 +102,9 @@ struct director_connection { struct timeval last_input, last_output; size_t peak_bytes_buffered; + struct timeval ping_sent_time; + unsigned int last_ping_msecs; + /* for incoming connections the director host isn't known until ME-line is received */ struct director_host *host; @@ -1701,6 +1704,10 @@ static bool director_cmd_pong(struct director_connection *conn) conn->ping_waiting = FALSE; timeout_remove(&conn->to_pong); + int ping_msecs = timeval_diff_msecs(&ioloop_timeval, &conn->ping_sent_time); + if (ping_msecs >= 0) + conn->last_ping_msecs = ping_msecs; + if (conn->verifying_left) { conn->verifying_left = FALSE; if (conn == conn->dir->left) { @@ -2335,6 +2342,7 @@ void director_connection_ping(struct director_connection *conn) director_connection_pong_timeout, conn); director_connection_send(conn, "PING\n"); conn->ping_waiting = TRUE; + conn->ping_sent_time = ioloop_timeval; } const char *director_connection_get_name(struct director_connection *conn) @@ -2403,4 +2411,5 @@ void director_connection_get_status(struct director_connection *conn, status_r->peak_bytes_buffered = conn->peak_bytes_buffered; status_r->last_input = conn->last_input; status_r->last_output = conn->last_output; + status_r->last_ping_msecs = conn->last_ping_msecs; } diff --git a/src/director/director-connection.h b/src/director/director-connection.h index b76a2e1bdc..35a14b5543 100644 --- a/src/director/director-connection.h +++ b/src/director/director-connection.h @@ -5,6 +5,7 @@ struct director_connection_status { uoff_t bytes_read, bytes_sent; size_t bytes_buffered, peak_bytes_buffered; struct timeval last_input, last_output; + unsigned int last_ping_msecs; }; struct director_host;