]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Use io_wait_timer for tracking wait times.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 15 Nov 2016 10:42:47 +0000 (11:42 +0100)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 15 Nov 2016 20:38:18 +0000 (22:38 +0200)
The previous code was completely incorrect, since it wasn't even tracking
the HTTP request's start usecs.

src/lib-http/http-client-connection.c
src/lib-http/http-client-private.h
src/lib-http/http-client-request.c

index 64358ac14cfa0e1e0a5ff8a13788863baa0becf3..3c2aae1455550c5e47b1be142da008f41c530737 100644 (file)
@@ -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);
 }
index 60f4f6f3635c743ccf443eac5594bbea2ccb103d..26fb2062331a1ec2efe949553ad0a31538d2547e 100644 (file)
@@ -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;
index 414246d006a2fbc630d141b59fc67f83cce7a43c..acac8e30df387f4fd7169ffe6843bf973c35a67f 100644 (file)
@@ -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",