changeset 21108:1a1310a5f7a8

lib-http: Use io_wait_timer for tracking wait times. The previous code was completely incorrect, since it wasn't even tracking the HTTP request's start usecs.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 15 Nov 2016 11:42:47 +0100
parents 8fe5614ccc3c
children 9b40053e2b98
files src/lib-http/http-client-connection.c src/lib-http/http-client-private.h src/lib-http/http-client-request.c
diffstat 3 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/http-client-connection.c	Tue Nov 15 11:41:53 2016 +0100
+++ b/src/lib-http/http-client-connection.c	Tue Nov 15 11:42:47 2016 +0100
@@ -225,7 +225,8 @@
 			(*requestp)->sent_global_ioloop_usecs + 999) / 1000;
 		if (conn->client->ioloop != NULL) {
 			int http_ioloop_msecs =
-				(io_loop_get_wait_usecs(conn->client->ioloop) + 999) / 1000;
+				(io_wait_timer_get_usecs(conn->io_wait_timer) -
+				 (*requestp)->sent_http_ioloop_usecs + 999) / 1000;
 			other_ioloop_msecs -= http_ioloop_msecs;
 			str_printfa(str, ", %d.%03d in http ioloop",
 				    http_ioloop_msecs/1000, http_ioloop_msecs%1000);
@@ -1440,6 +1441,7 @@
 	conn->peer = peer;
 	if (peer->addr.type != HTTP_CLIENT_PEER_ADDR_RAW)
 		i_array_init(&conn->request_wait_list, 16);
+	conn->io_wait_timer = io_wait_timer_add();
 
 	conn->label = i_strdup_printf("%s [%d]",
 		http_client_peer_label(peer), conn->id);
@@ -1566,6 +1568,7 @@
 		ssl_iostream_unref(&conn->ssl_iostream);
 	if (conn->connect_initialized)
 		connection_deinit(&conn->conn);
+	io_wait_timer_remove(&conn->io_wait_timer);
 	
 	i_free(conn);
 	return FALSE;
@@ -1609,5 +1612,6 @@
 		conn->to_response = io_loop_move_timeout(&conn->to_response);
 	if (conn->incoming_payload != NULL)
 		i_stream_switch_ioloop(conn->incoming_payload);
+	conn->io_wait_timer = io_wait_timer_move(&conn->io_wait_timer);
 	connection_switch_ioloop(&conn->conn);
 }
--- a/src/lib-http/http-client-private.h	Tue Nov 15 11:41:53 2016 +0100
+++ b/src/lib-http/http-client-private.h	Tue Nov 15 11:42:47 2016 +0100
@@ -109,6 +109,7 @@
 	unsigned int attempts;
 	unsigned int redirects;
 	uint64_t sent_global_ioloop_usecs;
+	uint64_t sent_http_ioloop_usecs;
 	uint64_t sent_lock_usecs;
 
 	unsigned int delayed_error_status;
@@ -166,6 +167,7 @@
 	struct istream *incoming_payload;
 	struct io *io_req_payload;
 	struct ioloop *last_ioloop;
+	struct io_wait_timer *io_wait_timer;
 
 	/* requests that have been sent, waiting for response */
 	ARRAY_TYPE(http_client_request) request_wait_list;
--- a/src/lib-http/http-client-request.c	Tue Nov 15 11:41:53 2016 +0100
+++ b/src/lib-http/http-client-request.c	Tue Nov 15 11:42:47 2016 +0100
@@ -1053,6 +1053,8 @@
 	req->sent_time = ioloop_timeval;
 	req->sent_lock_usecs = file_lock_wait_get_total_usecs();
 	req->sent_global_ioloop_usecs = ioloop_global_wait_usecs;
+	req->sent_http_ioloop_usecs =
+		io_wait_timer_get_usecs(req->conn->io_wait_timer);
 	o_stream_cork(output);
 	if (o_stream_sendv(output, iov, N_ELEMENTS(iov)) < 0) {
 		*error_r = t_strdup_printf("write(%s) failed: %s",