Changeset: b16621c82dbc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b16621c82dbc
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:
Set dpair pid to -1 after terminating database process
diffs (189 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
@@ -400,6 +400,7 @@ static void ctl_handle_client(
// Kill it appropriately
if (strcmp(p, "stop") == 0) {
+ bool terminated;
/* make an attempt to shut down the
profiler first. */
if ((e = shutdown_profiler(q, &stats))
!= NULL) {
free(e);
@@ -408,9 +409,13 @@ static void ctl_handle_client(
/* then kill it */
if (dp)
pthread_mutex_lock(&dp->fork_lock);
- terminateProcess(q, pid, mtype);
- if (dp)
+ if (pid != -1)
+ terminated =
terminateProcess(q, pid, mtype);
+ if (dp) {
+ if (terminated)
+ dp->pid = -1;
pthread_mutex_unlock(&dp->fork_lock);
+ }
Mfprintf(_mero_ctlout, "%s: stopped "
"database '%s'\n",
origin, q);
} else {
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
@@ -34,13 +34,15 @@
* The terminateProcess function tries to let the given mserver process
* shut down gracefully within a given time-out. If that fails, it
* sends the deadly SIGKILL signal to the mserver process and returns.
+ *
+ * Returns a boolean indicating if the process was shutdown succesfuly.
*/
-void
+bool
terminateProcess(char *dbname, pid_t pid, mtype type)
{
sabdb *stats;
char *er;
- int i;
+ int i, killed, e;
confkeyval *kv;
er = msab_getStatus(&stats, dbname);
@@ -48,13 +50,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 +67,7 @@ terminateProcess(char *dbname, pid_t pid
dbname,
(long long int)pid
);
- return;
+ return false;
}
assert(stats->pid == pid);
@@ -78,13 +80,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,19 +95,19 @@ 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 */
@@ -135,12 +137,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;
@@ -150,8 +152,16 @@ terminateProcess(char *dbname, pid_t pid
Mfprintf(stderr, "timeout of %s seconds expired, sending process %lld"
" (database '%s') the KILL signal\n",
kv->val, (long long int)pid, dbname);
- kill(pid, SIGKILL);
+ killed = kill(pid, SIGKILL);
+ e = errno;
msab_freeStatus(&stats);
+ if (killed == -1) {
+ Mfprintf(stderr, "sending KILL signal to process %lld (database
'%s')"
+ " failed: %s\n", (long long int)pid, dbname,
strerror(e));
+ return false;
+ } else {
+ return true;
+ }
}
/**
@@ -769,14 +779,16 @@ 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);
+ if (terminateProcess(dp->dbname, dp->pid,
MERODB))
+ dp->pid = -1;
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);
+ if (terminateProcess(dp->dbname, dp->pid, MERODB))
+ dp->pid = -1;
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,8 @@ doTerminateProcess(void *p)
{
dpair dp = p;
pthread_mutex_lock(&dp->fork_lock);
- terminateProcess(dp->dbname, dp->pid, dp->type);
+ if (dp->pid != -1 && terminateProcess(dp->dbname, dp->pid, dp->type))
+ dp->pid = -1;
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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list