On Thu, Jul 31, 2014 at 11:29:02AM +0800, Ruoyu wrote:
> This patch fixes fd leak in sheep process such as below in lsof command.
> 
> sheep 15276 liangry 95u sock 0,7 0t0 465109 can't identify protocol
> sheep 15276 liangry 96u sock 0,7 0t0 464282 can't identify protocol
> sheep 15276 liangry 97u sock 0,7 0t0 464284 can't identify protocol
> 
> Signed-off-by: Ruoyu <lian...@ucweb.com>
> ---
>  sheep/request.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/sheep/request.c b/sheep/request.c
> index 2a24b93..a4d8ed0 100644
> --- a/sheep/request.c
> +++ b/sheep/request.c
> @@ -729,8 +729,14 @@ main_fn void put_request(struct request *req)
>               eventfd_xwrite(req->local_req_efd, 1);
>       else {
>               if (ci->conn.dead) {
> -                     clear_client_info(ci);
> +                     /*
> +                      * free_request should be called prior to
> +                      * clear_client_info because refcnt of ci will
> +                      * be decreased in free_request. Otherwise, ci
> +                      * cannot be freed in clear_client_info.
> +                      */
>                       free_request(req);
> +                     clear_client_info(ci);
>               } else {
>                       list_add_tail(&req->request_list, &ci->done_reqs);
>  
> @@ -966,7 +972,14 @@ static void client_handler(int fd, int events, void 
> *data)
>  
>       sd_debug("%x, %d", events, ci->conn.dead);
>  
> -     if (events & (EPOLLERR | EPOLLHUP) || ci->conn.dead)
> +     if (events & (EPOLLERR | EPOLLHUP))
> +             ci->conn.dead = true;
> +     /*
> +      * Although dead is true, ci might not be freed immediately
> +      * because of refcnt. Never mind, we will complete it later
> +      * as long as dead is true.
> +      */
> +     if (ci->conn.dead)
>               return clear_client_info(ci);
>  
>       if (events & EPOLLIN) {
> -- 
> 1.8.3.2
> 
> 
> -- 
> sheepdog mailing list
> sheepdog@lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog

Applied thanks

Yuan
-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to