[sheepdog] [PATCH 1/3] sheep: add helper function and clear connection directly when it is dead

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Jul 5 18:57:19 CEST 2012


At Thu,  5 Jul 2012 18:34:10 +0800,
Yunkai Zhang wrote:
> 
> From: Yunkai Zhang <qiushu.zyk at taobao.com>
> 
> When connection is dead, we should:
>  1) do some clear actions about this connection.
>  2) unregister it's fd from epoll.
>  3) destroy this connection directly, since it's fd has been unregistered,
>     sheep couldn't receive any new events of this fd.
>     *Note*: If we use client_decref() instread of destroy_client(), this fd
>     may not be destroyed when ci->refcnt is larger than 1, than this fd could
>     not be closed in the future.
> 
> Now I add a helper named clear_client() to do these works.
> 
> Signed-off-by: Yunkai Zhang <qiushu.zyk at taobao.com>
> ---
>  sheep/sdnet.c |   20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/sheep/sdnet.c b/sheep/sdnet.c
> index c13cdb0..b493428 100644
> --- a/sheep/sdnet.c
> +++ b/sheep/sdnet.c
> @@ -370,6 +370,7 @@ static void requeue_request(struct request *req)
>  
>  static void client_incref(struct client_info *ci);
>  static void client_decref(struct client_info *ci);
> +static void clear_client(struct client_info *ci);
>  
>  static struct request *alloc_local_request(void *data, int data_length)
>  {
> @@ -473,11 +474,10 @@ void put_request(struct request *req)
>  		if (conn_tx_on(&ci->conn)) {
>  			dprintf("connection seems to be dead\n");
>  			free_request(req);
> +			clear_client(ci);

We cannot free the client_info here because there may be other
inflight requests which use it, no?

Thanks,

Kazutaka



More information about the sheepdog mailing list