Changeset: 70eacab62cb9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70eacab62cb9 Modified Files: tools/merovingian/daemon/controlrunner.c tools/merovingian/daemon/forkmserver.c tools/merovingian/daemon/merovingian.c tools/merovingian/daemon/merovingian.h Branch: Oct2020 Log Message:
Merge with Jun2020 branch. diffs (196 lines): diff --git a/tools/merovingian/daemon/controlrunner.c b/tools/merovingian/daemon/controlrunner.c --- a/tools/merovingian/daemon/controlrunner.c +++ b/tools/merovingian/daemon/controlrunner.c @@ -351,6 +351,7 @@ static void ctl_handle_client( { mtype mtype = 0; pid_t pid = 0; + bool terminated = false; // First look for something started by ourself. pthread_mutex_lock(&_mero_topdp_lock); @@ -408,18 +409,27 @@ static void ctl_handle_client( /* then kill it */ if (dp) pthread_mutex_lock(&dp->fork_lock); - terminateProcess(q, pid, mtype); + terminated = terminateProcess(q, pid, mtype); if (dp) pthread_mutex_unlock(&dp->fork_lock); Mfprintf(_mero_ctlout, "%s: stopped " "database '%s'\n", origin, q); } else { - kill(pid, SIGKILL); + terminated = kill(pid, SIGKILL) == 0; Mfprintf(_mero_ctlout, "%s: killed " "database '%s'\n", origin, q); } - len = snprintf(buf2, sizeof(buf2), "OK\n"); - send_client("="); + if (terminated) { + len = snprintf(buf2, sizeof(buf2), "OK\n"); + send_client("="); + } else { + Mfprintf(_mero_ctlerr, "%s: received stop signal for " + "non running database: %s\n", origin, q); + len = snprintf(buf2, sizeof(buf2), + "database is not running: %s\n", q); + send_client("!"); + break; + } } else if (strcmp(p, "create") == 0 || strncmp(p, "create password=", strlen("create password=")) == 0) { err e; diff --git a/tools/merovingian/daemon/forkmserver.c b/tools/merovingian/daemon/forkmserver.c --- a/tools/merovingian/daemon/forkmserver.c +++ b/tools/merovingian/daemon/forkmserver.c @@ -35,7 +35,7 @@ * shut down gracefully within a given time-out. If that fails, it * sends the deadly SIGKILL signal to the mserver process and returns. */ -void +bool terminateProcess(char *dbname, pid_t pid, mtype type) { sabdb *stats; @@ -48,13 +48,13 @@ terminateProcess(char *dbname, pid_t pid Mfprintf(stderr, "cannot terminate process %lld: %s\n", (long long int)pid, er); free(er); - return; + return false; } if (stats == NULL) { Mfprintf(stderr, "strange, process %lld serves database '%s' " "which does not exist\n", (long long int)pid, dbname); - return; + return false; } if (stats->pid != pid) { @@ -65,7 +65,7 @@ terminateProcess(char *dbname, pid_t pid dbname, (long long int)pid ); - return; + return false; } assert(stats->pid == pid); @@ -78,13 +78,13 @@ terminateProcess(char *dbname, pid_t pid "(pid %lld) has crashed\n", dbname, (long long int)pid); msab_freeStatus(&stats); - return; + return false; case SABdbInactive: Mfprintf(stdout, "database '%s' appears to have shut down already\n", dbname); fflush(stdout); msab_freeStatus(&stats); - return; + return false; case SABdbStarting: Mfprintf(stderr, "database '%s' appears to be starting up\n", dbname); @@ -93,25 +93,31 @@ terminateProcess(char *dbname, pid_t pid default: Mfprintf(stderr, "unknown state: %d\n", (int)stats->state); msab_freeStatus(&stats); - return; + return false; } if (type == MEROFUN) { multiplexDestroy(dbname); msab_freeStatus(&stats); - return; + return true; } else if (type != MERODB) { /* barf */ Mfprintf(stderr, "cannot stop merovingian process role: %s\n", dbname); msab_freeStatus(&stats); - return; + return false; } /* ok, once we get here, we'll be shutting down the server */ Mfprintf(stdout, "sending process %lld (database '%s') the " "TERM signal\n", (long long int)pid, dbname); - kill(pid, SIGTERM); + if (kill(pid, SIGTERM) < 0) { + /* barf */ + Mfprintf(stderr, "cannot send TERM signal to process (database '%s')\n", + dbname); + msab_freeStatus(&stats); + return false; + } kv = findConfKey(_mero_props, "exittimeout"); for (i = 0; i < atoi(kv->val) * 2; i++) { if (stats != NULL) @@ -135,12 +141,12 @@ terminateProcess(char *dbname, pid_t pid Mfprintf (stderr, "database '%s' crashed after SIGTERM\n", dbname); msab_freeStatus(&stats); - return; + return true; case SABdbInactive: Mfprintf(stdout, "database '%s' has shut down\n", dbname); fflush(stdout); msab_freeStatus(&stats); - return; + return true; default: Mfprintf(stderr, "unknown state: %d\n", (int)stats->state); break; @@ -152,6 +158,7 @@ terminateProcess(char *dbname, pid_t pid kv->val, (long long int)pid, dbname); kill(pid, SIGKILL); msab_freeStatus(&stats); + return true; } /** @@ -769,14 +776,14 @@ forkMserver(const char *database, sabdb* if (scen == NULL) { /* we don't know what it's doing, but we don't like it * any case, so kill it */ - terminateProcess(dp->dbname, dp->pid, MERODB); + (void) terminateProcess(dp->dbname, dp->pid, MERODB); msab_freeStatus(stats); pthread_mutex_unlock(&dp->fork_lock); return(newErr("database '%s' did not initialise the sql " "scenario", database)); } } else if (dp->pid != -1) { - terminateProcess(dp->dbname, dp->pid, MERODB); + (void) terminateProcess(dp->dbname, dp->pid, MERODB); msab_freeStatus(stats); pthread_mutex_unlock(&dp->fork_lock); return(newErr( diff --git a/tools/merovingian/daemon/merovingian.c b/tools/merovingian/daemon/merovingian.c --- a/tools/merovingian/daemon/merovingian.c +++ b/tools/merovingian/daemon/merovingian.c @@ -314,7 +314,7 @@ doTerminateProcess(void *p) { dpair dp = p; pthread_mutex_lock(&dp->fork_lock); - terminateProcess(dp->dbname, dp->pid, dp->type); + (void) terminateProcess(dp->dbname, dp->pid, dp->type); pthread_mutex_unlock(&dp->fork_lock); return NULL; } diff --git a/tools/merovingian/daemon/merovingian.h b/tools/merovingian/daemon/merovingian.h --- a/tools/merovingian/daemon/merovingian.h +++ b/tools/merovingian/daemon/merovingian.h @@ -59,7 +59,7 @@ typedef struct _dpair { char *newErr(_In_z_ _Printf_format_string_ const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); -void terminateProcess(char *dbname, pid_t pid, mtype type); +bool terminateProcess(char *dbname, pid_t pid, mtype type); void logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream, int rest); extern char *_mero_mserver; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list