From owner-svn-src-all@FreeBSD.ORG Fri Aug 27 21:28:02 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5F82D1065695; Fri, 27 Aug 2010 21:28:02 +0000 (UTC) (envelope-from pjd@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4F5BA8FC22; Fri, 27 Aug 2010 21:28:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7RLS2Lh008099; Fri, 27 Aug 2010 21:28:02 GMT (envelope-from pjd@svn.freebsd.org) Received: (from pjd@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7RLS2bn008097; Fri, 27 Aug 2010 21:28:02 GMT (envelope-from pjd@svn.freebsd.org) Message-Id: <201008272128.o7RLS2bn008097@svn.freebsd.org> From: Pawel Jakub Dawidek Date: Fri, 27 Aug 2010 21:28:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211899 - head/sbin/hastd X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Aug 2010 21:28:02 -0000 Author: pjd Date: Fri Aug 27 21:28:02 2010 New Revision: 211899 URL: http://svn.freebsd.org/changeset/base/211899 Log: When SIGTERM or SIGINT is received, terminate worker processes. MFC after: 2 weeks Obtained from: Wheel Systems Sp. z o.o. http://www.wheelsystems.com Modified: head/sbin/hastd/hastd.c Modified: head/sbin/hastd/hastd.c ============================================================================== --- head/sbin/hastd/hastd.c Fri Aug 27 21:26:55 2010 (r211898) +++ head/sbin/hastd/hastd.c Fri Aug 27 21:28:02 2010 (r211899) @@ -82,6 +82,10 @@ sighandler(int sig) { switch (sig) { + case SIGINT: + case SIGTERM: + sigexit_received = true; + break; case SIGCHLD: sigchld_received = true; break; @@ -374,6 +378,25 @@ failed: } static void +terminate_workers(void) +{ + struct hast_resource *res; + + pjdlog_info("Termination signal received, exiting."); + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (res->hr_workerpid == 0) + continue; + pjdlog_info("Terminating worker process (resource=%s, role=%s, pid=%u).", + res->hr_name, role2str(res->hr_role), res->hr_workerpid); + if (kill(res->hr_workerpid, SIGTERM) == 0) + continue; + pjdlog_errno(LOG_WARNING, + "Unable to send signal to worker process (resource=%s, role=%s, pid=%u).", + res->hr_name, role2str(res->hr_role), res->hr_workerpid); + } +} + +static void listen_accept(void) { struct hast_resource *res; @@ -599,6 +622,11 @@ main_loop(void) int cfd, lfd, maxfd, ret; for (;;) { + if (sigexit_received) { + sigexit_received = false; + terminate_workers(); + exit(EX_OK); + } if (sigchld_received) { sigchld_received = false; child_exit(); @@ -692,6 +720,8 @@ main(int argc, char *argv[]) cfg = yy_config_parse(cfgpath, true); assert(cfg != NULL); + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); signal(SIGHUP, sighandler); signal(SIGCHLD, sighandler);