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

Reply via email to