From: Timo Sirainen Date: Tue, 15 Nov 2016 10:42:47 +0000 (+0100) Subject: lib-http: Use io_wait_timer for tracking wait times. X-Git-Tag: 2.2.27~160 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ba72c69be5da6b703940dd53d63204dd0222194b;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index 64358ac14c..3c2aae1455 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -225,7 +225,8 @@ http_client_connection_get_timing_info(struct http_client_connection *conn) (*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 @@ http_client_connection_create(struct http_client_peer *peer) 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 @@ bool http_client_connection_unref(struct http_client_connection **_conn) 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 @@ void http_client_connection_switch_ioloop(struct http_client_connection *conn) 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); } diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index 60f4f6f363..26fb206233 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -109,6 +109,7 @@ struct http_client_request { 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 http_client_connection { 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; diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 414246d006..acac8e30df 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -1053,6 +1053,8 @@ static int http_client_request_send_real(struct http_client_request *req, 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",