From: Willy Tarreau Date: Mon, 11 Aug 2008 09:20:03 +0000 (+0200) Subject: [BUG] client timeout incorrectly rearmed while waiting for server X-Git-Tag: v1.3.16-rc1~211 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f1f24bb7fb8ebd6b43b5fee1bda0afbdbcb768e;p=thirdparty%2Fhaproxy.git [BUG] client timeout incorrectly rearmed while waiting for server Client timeout could be refreshed in stream_sock_*, but this is undesired when the timeout is already set to eternity. The effect is that a session could still be aborted if client timeout was smaller than server timeout. A second effect is that sessions expired on the server side would expire with "cD" flags. The fix consists in not updating it if it was not previously set. A cleaner method might consist in updating the buffer timeout. This is probably what will be done later when the state machines only deal with the buffers. --- diff --git a/src/proto_http.c b/src/proto_http.c index 9ddec24ac0..59d0479c82 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2695,7 +2695,7 @@ int process_srv(struct session *t) int conn_err; DPRINTF(stderr,"process_srv: c=%s s=%s set(r,w)=%d,%d exp(r,w)=%u,%u\n", - cli_stnames[c], srv_stnames[s], + cli_stnames[t->cli_state], srv_stnames[t->srv_state], EV_FD_ISSET(t->srv_fd, DIR_RD), EV_FD_ISSET(t->srv_fd, DIR_WR), rep->rex, req->wex); diff --git a/src/stream_sock.c b/src/stream_sock.c index 84bc2dbf50..10688e940b 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -217,7 +217,7 @@ int stream_sock_read(int fd) { * have at least read something. */ - if (b->flags & BF_PARTIAL_READ) + if (b->rex && b->flags & BF_PARTIAL_READ) b->rex = tick_add_ifset(now_ms, b->rto); out_wakeup: @@ -373,14 +373,14 @@ int stream_sock_write(int fd) { * written something. */ - if (b->flags & BF_PARTIAL_WRITE) { + if (b->wex && b->flags & BF_PARTIAL_WRITE) { b->wex = tick_add_ifset(now_ms, b->wto); if (b->wex) { /* FIXME: to prevent the client from expiring read timeouts during writes, * we refresh it. A solution would be to merge read+write timeouts into a * unique one, although that needs some study particularly on full-duplex * TCP connections. */ - if (!(b->flags & BF_SHUTR_STATUS)) + if (b->rex && !(b->flags & BF_SHUTR_STATUS)) b->rex = b->wex; } }