[sheepdog] [PATCH v2 1/2] sheep: shutdown gracefully when we receive SIGTERM

Liu Yuan namei.unix at gmail.com
Tue Jul 24 04:03:43 CEST 2012


On 07/24/2012 09:33 AM, Liu Yuan wrote:
> From: Liu Yuan <tailai.ly at taobao.com>
> 
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
>  sheep/sheep.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 51 insertions(+), 5 deletions(-)
> 
> diff --git a/sheep/sheep.c b/sheep/sheep.c
> index 3ae1ec9..df28a94 100644
> --- a/sheep/sheep.c
> +++ b/sheep/sheep.c
> @@ -21,6 +21,7 @@
>  #include <sys/syslog.h>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> +#include <sys/signalfd.h>
>  #include <fcntl.h>
>  #include <errno.h>
>  
> @@ -122,9 +123,54 @@ static int create_pidfile(const char *filename)
>  	return 0;
>  }
>  
> +static int sigfd;
> +
> +static void signal_handler(int listen_fd, int events, void *data)
> +{
> +	struct signalfd_siginfo siginfo;
> +	int ret;
> +
> +	ret = read(sigfd, &siginfo, sizeof(siginfo));
> +	assert(ret == sizeof(siginfo));
> +	dprintf("signal %d\n", siginfo.ssi_signo);
> +	switch (siginfo.ssi_signo) {
> +	case SIGTERM:
> +		sys->status= SD_STATUS_KILLED;
> +		break;
> +	default:
> +		eprintf("signal %d unhandled \n", siginfo.ssi_signo);
> +		break;
> +	}
> +}
> +
>  static int init_signal(void)
>  {
> -	return trace_init_signal();
> +	sigset_t mask;
> +	int ret;
> +
> +	ret = trace_init_signal();
> +	if (ret)
> +		return ret;
> +
> +	sigemptyset(&mask);
> +	sigaddset(&mask, SIGTERM);
> +	sigprocmask(SIG_BLOCK, &mask, NULL);
> +
> +	sigfd = signalfd(-1, &mask, SFD_NONBLOCK);
> +	if (sigfd < 0) {
> +		eprintf("failed to create a signal fd: %m\n");
> +		return -1;
> +	}
> +
> +	ret = register_event(sigfd, signal_handler, NULL);
> +	if (ret) {
> +		eprintf("failed to register signal handler (%d)\n", ret);
> +		return -1;
> +	}
> +
> +	dprintf("register signal_handler for %d\n", sigfd);
> +
> +	return 0;
>  }
>  
>  static struct cluster_info __sys;
> @@ -289,6 +335,10 @@ int main(int argc, char **argv)
>  
>  	local_req_init();
>  
> +	ret = init_signal();
> +	if (ret)
> +		exit(1);
> +
>  	sys->gateway_wqueue = init_work_queue("gateway", false);
>  	sys->io_wqueue = init_work_queue("io", false);
>  	sys->recovery_wqueue = init_work_queue("recovery", true);
> @@ -298,10 +348,6 @@ int main(int argc, char **argv)
>  	    !sys->deletion_wqueue || !sys->block_wqueue)
>  		exit(1);
>  
> -	ret = init_signal();
> -	if (ret)
> -		exit(1);
> -
>  	ret = trace_init();
>  	if (ret)
>  		exit(1);
> 

Applied

Yuan



More information about the sheepdog mailing list