# HG changeset patch # User Timo Sirainen # Date 1479206567 -3600 # Node ID 1a1310a5f7a8819b013bb5aca25b2f089da960da # Parent 8fe5614ccc3cc07a9d9d858180d9bead13461088 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 -r 8fe5614ccc3c -r 1a1310a5f7a8 src/lib-http/http-client-connection.c --- 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); } diff -r 8fe5614ccc3c -r 1a1310a5f7a8 src/lib-http/http-client-private.h --- 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; diff -r 8fe5614ccc3c -r 1a1310a5f7a8 src/lib-http/http-client-request.c --- 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",