I proposed something similar a while ago. The connection is actually staying in CLOSE_WAIT status while this happens. I'd suggest you consider something more reliable. + else if (!ret) { //FIXME: is this the best place to check? + int r; + struct tcp_info ti; + socklen_t l = sizeof(struct tcp_info); + r = getsockopt(conn->fd, SOL_TCP, TCP_INFO, (void*)&ti, &l); + if (r < 0) panic("this is really wired"); + if (ti.tcpi_state == TCP_CLOSE_WAIT) { + conn->c_rx_state = C_IO_CLOSED; + conn->c_tx_state = C_IO_CLOSED; + } + } FYI. > -----Original Message----- > From: sheepdog-bounces at lists.wpkg.org > [mailto:sheepdog-bounces at lists.wpkg.org] On Behalf Of Li Wenpeng > Sent: Tuesday, April 24, 2012 4:00 PM > To: sheepdog at lists.wpkg.org > Subject: [Sheepdog] [PATCH] fix a bug in rx() when read() returns 0 but > connection is not marked as closed. > > From: levin li <xingke.lwp at taobao.com> > > if read() returns 0,it means connection closed, but previous > read() may set errno to EAGAIN, in which case rx() would just > return 0 without set connection state as C_IO_CLOSED > > Signed-off-by: levin li <xingke.lwp at taobao.com> > --- > lib/net.c | 7 ++++++- > 1 files changed, 6 insertions(+), 1 deletions(-) > > diff --git a/lib/net.c b/lib/net.c > index 260ae38..8ac7c9e 100644 > --- a/lib/net.c > +++ b/lib/net.c > @@ -70,7 +70,12 @@ int rx(struct connection *conn, enum conn_state > next_state) > int ret; > > ret = read(conn->fd, conn->rx_buf, conn->rx_length); > - if (!ret || ret < 0) { > + if (!ret) { > + conn->c_rx_state = C_IO_CLOSED; > + return 0; > + } > + > + if (ret < 0) { > if (errno != EAGAIN) > conn->c_rx_state = C_IO_CLOSED; > return 0; > -- > 1.7.1 > > -- > sheepdog mailing list > sheepdog at lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog |