From: mar Date: Tue, 27 Jun 1989 16:31:44 +0000 (+0000) Subject: added support for server going dormant X-Git-Tag: PATCH5~39 X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/commitdiff_plain/589993be6cf81b27ba9016a25d7f11d40eb19b2f added support for server going dormant --- diff --git a/server/mr_main.c b/server/mr_main.c index 351f3850..9e589be3 100644 --- a/server/mr_main.c +++ b/server/mr_main.c @@ -20,9 +20,11 @@ static char *rcsid_sms_main_c = "$Header$"; #include #include +#include #include #include #include +#include #include "sms_server.h" #include @@ -54,7 +56,7 @@ extern void do_client(); extern int sigshut(); void clist_append(); void oplist_append(); -void reapchild(); +void reapchild(), godormant(), gowakeup(); extern time_t now; @@ -73,6 +75,7 @@ main(argc, argv) { int status; time_t tardy; + struct stat stbuf; whoami = argv[0]; /* @@ -126,13 +129,17 @@ main(argc, argv) /* * Signal handlers - * There should probably be a few more of these. + * There should probably be a few more of these. This is + * duplicated on the next page, be sure to also add any + * additional handlers there. */ if ((((int)signal (SIGTERM, sigshut)) < 0) || (((int)signal (SIGCHLD, reapchild)) < 0) || + (((int)signal (SIGUSR1, godormant)) < 0) || + (((int)signal (SIGUSR2, gowakeup)) < 0) || (((int)signal (SIGHUP, sigshut)) < 0)) { - com_err(whoami, errno, " Unable to establish signal handler."); + com_err(whoami, errno, " Unable to establish signal handlers."); exit(1); } @@ -168,13 +175,34 @@ main(argc, argv) #ifdef notdef com_err(whoami, 0, "tick"); #endif notdef + if (dormant == SLEEPY) { + sms_close_database(); + com_err(whoami, 0, "database closed"); + send_zgram("SMS", "database closed"); + dormant = ASLEEP; + } else if (dormant == GROGGY) { + sms_open_database(); + com_err(whoami, 0, "database open"); + if ((((int)signal (SIGTERM, sigshut)) < 0) || + (((int)signal (SIGCHLD, reapchild)) < 0) || + (((int)signal (SIGUSR1, godormant)) < 0) || + (((int)signal (SIGUSR2, gowakeup)) < 0) || + (((int)signal (SIGHUP, sigshut)) < 0)) { + com_err(whoami, errno, + " Unable to reestablish signal handlers."); + exit(1); + } + send_zgram("SMS", "database open again"); + dormant = AWAKE; + } + errno = 0; status = op_select_any(op_list, 0, (fd_set *)NULL, (fd_set *)NULL, (fd_set *)NULL, (struct timeval *)NULL); if (status == -1) { - com_err(whoami, errno, " error from op_select"); + com_err(whoami, errno, " error from op_select"); continue; } else if (status != -2) { com_err(whoami, 0, " wrong return from op_select_any"); @@ -205,6 +233,25 @@ main(argc, argv) * Sleep here to prevent hosing? */ } + /* if the new connection is our only connection, + * and the server is supposed to be down, then go + * down now. + */ + if ((dormant == AWAKE) && (nclients == 1) && + (stat(SMS_MOTD_FILE, &stbuf) == 0)) { + com_err(whoami, 0, "motd file exists, slumbertime"); + dormant = SLEEPY; + } + /* on new connection, if we are no longer supposed + * to be down, then wake up. + */ + if ((dormant == ASLEEP) && + (stat(SMS_MOTD_FILE, &stbuf) == -1) && + (errno == ENOENT)) { + com_err(whoami, 0, "motd file no longer exists, waking up"); + dormant = GROGGY; + } + } /* * Handle any existing connections. @@ -442,13 +489,47 @@ void reapchild() union wait status; int pid; - if (takedown) + if (takedown || dormant == ASLEEP) return; while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) { if (status.w_termsig == 0 && status.w_retcode == 0) - com_err(whoami, 0, "dcm started successfully"); + com_err(whoami, 0, "child exited successfully"); else - com_err(whoami, 0, "%d: startdcm exits with signal %d status %d", + com_err(whoami, 0, "%d: child exits with signal %d status %d", pid, status.w_termsig, status.w_retcode); } } + + +void godormant() +{ + switch (dormant) { + case AWAKE: + case GROGGY: + com_err(whoami, 0, "requested to go dormant"); + break; + case ASLEEP: + com_err(whoami, 0, "already asleep"); + break; + case SLEEPY: + break; + } + dormant = SLEEPY; +} + + +void gowakeup() +{ + switch (dormant) { + case ASLEEP: + case SLEEPY: + com_err(whoami, 0, "Good morning"); + break; + case AWAKE: + com_err(whoami, 0, "already awake"); + break; + case GROGGY: + break; + } + dormant = GROGGY; +}