[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.
This commit is contained in:
Willy Tarreau 2008-08-11 11:20:03 +02:00
parent ce09c52187
commit 9f1f24bb7f
2 changed files with 4 additions and 4 deletions

View File

@ -2695,7 +2695,7 @@ int process_srv(struct session *t)
int conn_err; int conn_err;
DPRINTF(stderr,"process_srv: c=%s s=%s set(r,w)=%d,%d exp(r,w)=%u,%u\n", 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), EV_FD_ISSET(t->srv_fd, DIR_RD), EV_FD_ISSET(t->srv_fd, DIR_WR),
rep->rex, req->wex); rep->rex, req->wex);

View File

@ -217,7 +217,7 @@ int stream_sock_read(int fd) {
* have at least read something. * 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); b->rex = tick_add_ifset(now_ms, b->rto);
out_wakeup: out_wakeup:
@ -373,14 +373,14 @@ int stream_sock_write(int fd) {
* written something. * 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); b->wex = tick_add_ifset(now_ms, b->wto);
if (b->wex) { if (b->wex) {
/* FIXME: to prevent the client from expiring read timeouts during writes, /* 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 * 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 * unique one, although that needs some study particularly on full-duplex
* TCP connections. */ * TCP connections. */
if (!(b->flags & BF_SHUTR_STATUS)) if (b->rex && !(b->flags & BF_SHUTR_STATUS))
b->rex = b->wex; b->rex = b->wex;
} }
} }