[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