[Sheepdog] [PATCH] fix a bug in rx() when read() returns 0 but connection is not marked as closed.
Huxinwei
huxinwei at huawei.com
Tue Apr 24 10:40:15 CEST 2012
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
More information about the sheepdog
mailing list