mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
[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.
This commit is contained in:
parent
816fc22a4a
commit
fe8903cc76
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user