[BUG] shutw must imply close during a connect

The sessions which were remaining stuck were being connecting to the
server while they received a shutw which caused them to partially
stop. A shutw() during a connect() must imply a close().
This commit is contained in:
Willy Tarreau 2008-11-23 21:33:29 +01:00
parent f54f8bdd8d
commit b38903cf3c

View File

@ -113,6 +113,10 @@ int stream_sock_read(int fd) {
b->r += ret; b->r += ret;
b->l += ret; b->l += ret;
cur_read += ret; cur_read += ret;
if (fdtab[fd].state == FD_STCONN)
fdtab[fd].state = FD_STREADY;
b->flags |= BF_READ_PARTIAL; b->flags |= BF_READ_PARTIAL;
b->flags &= ~BF_EMPTY; b->flags &= ~BF_EMPTY;
@ -371,6 +375,9 @@ int stream_sock_write(int fd) {
b->l -= ret; b->l -= ret;
b->w += ret; b->w += ret;
if (fdtab[fd].state == FD_STCONN)
fdtab[fd].state = FD_STREADY;
b->flags |= BF_WRITE_PARTIAL; b->flags |= BF_WRITE_PARTIAL;
if (b->l < b->rlim - b->data) if (b->l < b->rlim - b->data)
@ -478,20 +485,22 @@ int stream_sock_write(int fd) {
*/ */
void stream_sock_shutw(struct stream_interface *si) void stream_sock_shutw(struct stream_interface *si)
{ {
if (si->state != SI_ST_EST && si->state != SI_ST_CON) { switch (si->state) {
if (likely(si->state == SI_ST_INI)) case SI_ST_INI:
si->state = SI_ST_CLO; si->state = SI_ST_CLO;
return; return;
} case SI_ST_EST:
if (!(si->ib->flags & BF_SHUTR)) {
if (si->ib->flags & BF_SHUTR) { EV_FD_CLR(si->fd, DIR_WR);
shutdown(si->fd, SHUT_WR);
return;
}
/* fall through */
case SI_ST_CON:
fd_delete(si->fd); fd_delete(si->fd);
si->state = SI_ST_DIS; si->state = SI_ST_DIS;
return; return;
} }
EV_FD_CLR(si->fd, DIR_WR);
shutdown(si->fd, SHUT_WR);
return;
} }
/* /*