changeset 22627:bcb064465b54

director: Add director_connection_get_status() Can be used to access connection-specific status information.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 26 Oct 2017 13:07:30 +0300
parents 989dcf906522
children 8623737c0129
files src/director/director-connection.c src/director/director-connection.h
diffstat 2 files changed, 25 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/director/director-connection.c	Thu Oct 26 13:02:32 2017 +0300
+++ b/src/director/director-connection.c	Thu Oct 26 13:07:30 2017 +0300
@@ -104,6 +104,7 @@
 	unsigned int minor_version;
 
 	struct timeval last_input, last_output;
+	size_t peak_bytes_buffered;
 
 	/* for incoming connections the director host isn't known until
 	   ME-line is received */
@@ -2300,6 +2301,9 @@
 	} else {
 		conn->dir->ring_traffic_output += len;
 		conn->last_output = ioloop_timeval;
+		conn->peak_bytes_buffered =
+			I_MAX(conn->peak_bytes_buffered,
+			      o_stream_get_buffer_used_size(conn->output));
 	}
 }
 
@@ -2396,3 +2400,15 @@
 
 	director_connection_set_ping_timeout(conn);
 }
+
+void director_connection_get_status(struct director_connection *conn,
+				    struct director_connection_status *status_r)
+{
+	i_zero(status_r);
+	status_r->bytes_read = conn->input->v_offset;
+	status_r->bytes_sent = conn->output->offset;
+	status_r->bytes_buffered = o_stream_get_buffer_used_size(conn->output);
+	status_r->peak_bytes_buffered = conn->peak_bytes_buffered;
+	status_r->last_input = conn->last_input;
+	status_r->last_output = conn->last_output;
+}
--- a/src/director/director-connection.h	Thu Oct 26 13:02:32 2017 +0300
+++ b/src/director/director-connection.h	Thu Oct 26 13:07:30 2017 +0300
@@ -1,6 +1,12 @@
 #ifndef DIRECTOR_CONNECTION_H
 #define DIRECTOR_CONNECTION_H
 
+struct director_connection_status {
+	uoff_t bytes_read, bytes_sent;
+	size_t bytes_buffered, peak_bytes_buffered;
+	struct timeval last_input, last_output;
+};
+
 struct director_host;
 struct director;
 
@@ -31,4 +37,7 @@
 void director_connection_cork(struct director_connection *conn);
 void director_connection_uncork(struct director_connection *conn);
 
+void director_connection_get_status(struct director_connection *conn,
+				    struct director_connection_status *status_r);
+
 #endif