]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[BUG] don't refresh timeouts late after detected activity
authorWilly Tarreau <w@1wt.eu>
Sun, 4 Oct 2009 08:56:08 +0000 (10:56 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 4 Oct 2009 09:00:41 +0000 (11:00 +0200)
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.
(cherry picked from commit fe8903cc76184ef20109d9ec9729a88368b2ccd7)

src/stream_sock.c

index b7a64efcb6a3f70d1ee86441d2114cec215155d8..1181812a80e19728fa01827e07d26fbb42af7107 100644 (file)
@@ -879,12 +879,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);
                }
        }
@@ -904,11 +904,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