[Sheepdog] [PATCH] fix a bug in rx() when read() returns 0 but connection is not marked as closed.

Huxinwei huxinwei at huawei.com
Wed Apr 25 03:05:28 CEST 2012


> -----Original Message-----
> From: MORITA Kazutaka [mailto:morita.kazutaka at gmail.com]
> Sent: Tuesday, April 24, 2012 5:21 PM
> To: Huxinwei
> Cc: Li Wenpeng; sheepdog at lists.wpkg.org
> Subject: Re: [Sheepdog] [PATCH] fix a bug in rx() when read() returns 0 but
> connection is not marked as closed.
> 
> On Tue, Apr 24, 2012 at 5:40 PM, Huxinwei <huxinwei at huawei.com> wrote:
> > 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.
> 
> Is there any case that read() returns zero but the connection is not closed?

What if reading is interrupted by a signal ?
Read() returns 0 while errno is EINTR then ?

> Thanks,
> 
> Kazutaka
> 
> >
> > +               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
> > --
> > sheepdog mailing list
> > sheepdog at lists.wpkg.org
> > http://lists.wpkg.org/mailman/listinfo/sheepdog


More information about the sheepdog mailing list