From fe8903cc76184ef20109d9ec9729a88368b2ccd7 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 4 Oct 2009 10:56:08 +0200 Subject: [PATCH] [BUG] don't refresh timeouts late after detected activity In old versions, before 1.3.16, we had to refresh the timeouts after each call to process_session() because the stream socket handler did not do it. Now that the sockets can exchange data for a long period without calling process_session(), we can detect an old activity and refresh a timeout long after the last activity, causing too late a detection of some timeouts. The fix simply consists in not checking for activity anymore in stream_sock_data_finish() but only set a timeout if it was not previously set. --- src/stream_sock.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/stream_sock.c b/src/stream_sock.c index c09c8a266..2846b3604 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -916,12 +916,12 @@ void stream_sock_data_finish(struct stream_interface *si) else { /* (re)start reading and update timeout. Note: we don't recompute the timeout * everytime we get here, otherwise it would risk never to expire. We only - * update it if is was not yet set, or if we already got some read status. + * update it if is was not yet set. The stream socket handler will already + * have updated it if there has been a completed I/O. */ si->flags &= ~SI_FL_WAIT_ROOM; EV_FD_COND_S(fd, DIR_RD); - if (!(ib->flags & BF_READ_NOEXP) && - (!tick_isset(ib->rex) || ib->flags & BF_READ_ACTIVITY)) + if (!(ib->flags & BF_READ_NOEXP) && !tick_isset(ib->rex)) ib->rex = tick_add_ifset(now_ms, ib->rto); } } @@ -939,11 +939,12 @@ void stream_sock_data_finish(struct stream_interface *si) else { /* (re)start writing and update timeout. Note: we don't recompute the timeout * everytime we get here, otherwise it would risk never to expire. We only - * update it if is was not yet set, or if we already got some write status. + * update it if is was not yet set. The stream socket handler will already + * have updated it if there has been a completed I/O. */ si->flags &= ~SI_FL_WAIT_DATA; EV_FD_COND_S(fd, DIR_WR); - if (!tick_isset(ob->wex) || ob->flags & BF_WRITE_ACTIVITY) { + if (!tick_isset(ob->wex)) { ob->wex = tick_add_ifset(now_ms, ob->wto); if (tick_isset(ib->rex) && !(si->flags & SI_FL_INDEP_STR)) { /* Note: depending on the protocol, we don't know if we're waiting