Move calculation $upstream_response_time before send header to client

From: Kirill A. Korinskiy [email protected]

Now calculation $upstream_response_time happen after send header to
client and we have a 0 ms response to not error (last) upstream.

src/http/ngx_http_upstream.c | 23 ++++++++++±-----------
1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 7ae15cb…0771388 100644
— a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -1843,10 +1843,21 @@
ngx_http_upstream_send_response(ngx_http_request_t *r,
ngx_http_upstream_t *u)
int tcp_nodelay;
ssize_t n;
ngx_int_t rc;

  • ngx_time_t *tp;
    ngx_event_pipe_t *p;
    ngx_connection_t *c;
    ngx_http_core_loc_conf_t *clcf;

  • if (u->state && u->state->response_sec) {

  •    tp = ngx_timeofday();
    
  •    u->state->response_sec = tp->sec - u->state->response_sec;
    
  •    u->state->response_msec = tp->msec - u->state->response_msec;
    
  •    if (u->pipe) {
    
  •        u->state->response_length = u->pipe->read_length;
    
  •    }
    
  • }

  • rc = ngx_http_send_header(r);

    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {
    @@ -2735,8 +2746,6 @@ static void
    ngx_http_upstream_finalize_request(ngx_http_request_t *r,
    ngx_http_upstream_t *u, ngx_int_t rc)
    {

  • ngx_time_t *tp;
  • ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
    “finalize http upstream request: %i”, rc);

@@ -2744,16 +2753,6 @@
ngx_http_upstream_finalize_request(ngx_http_request_t *r,
*u->cleanup = NULL;
}

  • if (u->state && u->state->response_sec) {

  •    tp = ngx_timeofday();
    
  •    u->state->response_sec = tp->sec - u->state->response_sec;
    
  •    u->state->response_msec = tp->msec - u->state->response_msec;
    
  •    if (u->pipe) {
    
  •        u->state->response_length = u->pipe->read_length;
    
  •    }
    
  • }

  • u->finalize_request(r, rc);

    if (u->peer.free) {

Hello!

On Tue, Apr 21, 2009 at 09:59:21PM +0400, [email protected] wrote:

From: Kirill A. Korinskiy [email protected]

Now calculation $upstream_response_time happen after send header to
client and we have a 0 ms response to not error (last) upstream.

The patch itself is clearly wrong. But could you please repeat
once again (in russian if you prefer to) what problem you are
trying to solve?

From our IRC discussion yesterday it looks like you are trying to
get $upstream_response_time in reply header. No, this not work as
$upstream_response_time is time taken for the whole upstream
request processing (not only headers), and it’s usually known only
after sending response headers.

Probably we may introduce something like $upstream_header_time
with the meaning you assumed, but I’m not really sure we need to.

Maxim D.