mirror of
http://git.haproxy.org/git/haproxy.git
synced 2026-02-19 11:48:45 +02:00
[BUG] stream_sock: disable I/O on fds reporting an error
Upon read or write error, we cannot immediately close the FD because we want to first report the error to the upper layer which will do it itself. However, we want to prevent any further I/O from being performed on the FD. This is especially important in case of speculative I/O where nothing else could stop the FD from still being polled until the upper layer takes care of the condition.
This commit is contained in:
@@ -495,6 +495,7 @@ int stream_sock_read(int fd) {
|
||||
|
||||
fdtab[fd].state = FD_STERROR;
|
||||
fdtab[fd].ev &= ~FD_POLL_STICKY;
|
||||
EV_FD_REM(fd);
|
||||
si->flags |= SI_FL_ERR;
|
||||
retval = 1;
|
||||
goto out_wakeup;
|
||||
@@ -756,6 +757,7 @@ int stream_sock_write(int fd)
|
||||
|
||||
fdtab[fd].state = FD_STERROR;
|
||||
fdtab[fd].ev &= ~FD_POLL_STICKY;
|
||||
EV_FD_REM(fd);
|
||||
si->flags |= SI_FL_ERR;
|
||||
task_wakeup(si->owner, TASK_WOKEN_IO);
|
||||
return 1;
|
||||
@@ -972,6 +974,7 @@ void stream_sock_chk_snd(struct stream_interface *si)
|
||||
*/
|
||||
fdtab[si->fd].state = FD_STERROR;
|
||||
fdtab[si->fd].ev &= ~FD_POLL_STICKY;
|
||||
EV_FD_REM(si->fd);
|
||||
si->flags |= SI_FL_ERR;
|
||||
goto out_wakeup;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user