[sheepdog] [PATCH RFC 5/5] sheep: retry when connect() or accept() fails with EMFILE

Liu Yuan namei.unix at gmail.com
Wed Jul 17 10:56:10 CEST 2013


On Fri, Jul 12, 2013 at 10:54:26AM +0900, Hitoshi Mitake wrote:
> This patch adds calling of shrink_sockfd() after connect() and
> accept() when they return EMFILE.
> 
> These retries can be invoked twice at a maximum. This policy must be
> improved in the future.
> 
> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> ---
>  sheep/request.c      |    7 +++++++
>  sheep/sockfd_cache.c |    6 ++++++
>  2 files changed, 13 insertions(+)
> 
> diff --git a/sheep/request.c b/sheep/request.c
> index 3b43c76..8f3f840 100644
> --- a/sheep/request.c
> +++ b/sheep/request.c
> @@ -828,8 +828,15 @@ static void listen_handler(int listen_fd, int events, void *data)
>  	}
>  
>  	namesize = sizeof(from);
> +
> +	int retry = 2;
> +retry_accept:
>  	fd = accept(listen_fd, (struct sockaddr *)&from, &namesize);
>  	if (fd < 0) {
> +		if (errno == EMFILE && retry--) {
> +			if (shrink_sockfd())
> +				goto retry_accept;
> +		}
>  		sd_eprintf("failed to accept a new connection: %m");
>  		return;

Better use xaccept() to handle retry accept internally and document why 2.

Thanks
Yuan



More information about the sheepdog mailing list