Changeset: 33ddb0146799 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=33ddb0146799
Modified Files:
tools/merovingian/daemon/controlrunner.c
tools/merovingian/daemon/forkmserver.c
tools/merovingian/daemon/merovingian.c
tools/merovingian/daemon/merovingian.h
Branch: Jun2020
Log Message:
Produce message that database is stopped even when not yet waited for.
diffs (186 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
@@ -355,6 +355,7 @@ static void ctl_handle_client(
dp = _mero_topdp->next; /* don't need the
console/log */
while (dp != NULL) {
if (dp->type == MERODB &&
strcmp(dp->dbname, q) == 0) {
+ bool terminated = false;
if (dp->pid <= 0) {
dp = NULL;
/* unlock happens below
*/
@@ -374,24 +375,28 @@ static void ctl_handle_client(
} else if (stats !=
NULL)
msab_freeStatus(&stats);
pthread_mutex_lock(&dp->fork_lock);
- terminateProcess(dp,
type);
+ terminated =
terminateProcess(dp, type);
pthread_mutex_unlock(&dp->fork_lock);
Mfprintf(_mero_ctlout,
"%s: stopped "
"database '%s'\n", origin, q);
} else {
- kill(dp->pid, SIGKILL);
-
pthread_mutex_unlock(&_mero_topdp_lock);
+ terminated =
kill(dp->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 {
+ dp = NULL; /* message
generated below */
+ }
break;
} else if (dp->type == MEROFUN &&
strcmp(dp->dbname, q) == 0) {
/* multiplexDestroy needs topdp
lock to remove itself */
char *dbname =
strdup(dp->dbname);
pthread_mutex_unlock(&_mero_topdp_lock);
multiplexDestroy(dbname);
+
pthread_mutex_lock(&_mero_topdp_lock);
free(dbname);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send_client("=");
@@ -400,8 +405,8 @@ static void ctl_handle_client(
dp = dp->next;
}
+ pthread_mutex_unlock(&_mero_topdp_lock);
if (dp == NULL) {
- pthread_mutex_unlock(&_mero_topdp_lock);
Mfprintf(_mero_ctlerr, "%s: received
stop signal for "
"non running database:
%s\n", origin, q);
len = snprintf(buf2, sizeof(buf2),
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
@@ -31,7 +31,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(dpair dp, mtype type)
{
sabdb *stats;
@@ -44,13 +44,13 @@ terminateProcess(dpair dp, mtype type)
Mfprintf(stderr, "cannot terminate process %lld: %s\n",
(long long int)dp->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)dp->pid, dp->dbname);
- return;
+ return false;
}
switch (stats->state) {
@@ -62,13 +62,13 @@ terminateProcess(dpair dp, mtype type)
"(pid %lld) has crashed\n",
dp->dbname, (long long int)dp->pid);
msab_freeStatus(&stats);
- return;
+ return false;
case SABdbInactive:
Mfprintf(stdout, "database '%s' appears to have shut down
already\n",
dp->dbname);
fflush(stdout);
msab_freeStatus(&stats);
- return;
+ return false;
case SABdbStarting:
Mfprintf(stderr, "database '%s' appears to be starting up\n",
dp->dbname);
@@ -77,19 +77,19 @@ terminateProcess(dpair dp, mtype type)
default:
Mfprintf(stderr, "unknown state: %d\n", (int)stats->state);
msab_freeStatus(&stats);
- return;
+ return false;
}
if (type == MEROFUN) {
multiplexDestroy(dp->dbname);
msab_freeStatus(&stats);
- return;
+ return true;
} else if (type != MERODB) {
/* barf */
Mfprintf(stderr, "cannot stop merovingian process role: %s\n",
dp->dbname);
msab_freeStatus(&stats);
- return;
+ return false;
}
/* ok, once we get here, we'll be shutting down the server */
@@ -119,12 +119,12 @@ terminateProcess(dpair dp, mtype type)
Mfprintf (stderr, "database '%s' crashed after
SIGTERM\n",
dp->dbname);
msab_freeStatus(&stats);
- return;
+ return true;
case SABdbInactive:
Mfprintf(stdout, "database '%s' has shut
down\n", dp->dbname);
fflush(stdout);
msab_freeStatus(&stats);
- return;
+ return true;
default:
Mfprintf(stderr, "unknown state: %d\n",
(int)stats->state);
break;
@@ -136,6 +136,7 @@ terminateProcess(dpair dp, mtype type)
kv->val, (long long int)dp->pid, dp->dbname);
kill(dp->pid, SIGKILL);
msab_freeStatus(&stats);
+ return true;
}
/**
@@ -750,14 +751,14 @@ forkMserver(char *database, sabdb** stat
if (scen == NULL) {
/* we don't know what it's doing, but we don't
like it
* any case, so kill it */
- terminateProcess(dp, MERODB);
+ (void) terminateProcess(dp, 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, MERODB);
+ (void) terminateProcess(dp, 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
@@ -318,7 +318,7 @@ doTerminateProcess(void *p)
{
dpair dp = p;
pthread_mutex_lock(&dp->fork_lock);
- terminateProcess(dp, dp->type);
+ (void) terminateProcess(dp, 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
@@ -60,7 +60,7 @@ typedef struct _dpair {
char *newErr(_In_z_ _Printf_format_string_ const char *fmt, ...)
__attribute__((__format__(__printf__, 1, 2)));
-void terminateProcess(dpair dp, mtype type);
+bool terminateProcess(dpair dp, 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