Changeset: 9540ecbf9d0e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9540ecbf9d0e
Modified Files:
tools/merovingian/daemon/controlrunner.c
tools/merovingian/daemon/forkmserver.c
tools/merovingian/daemon/forkmserver.h
Branch: default
Log Message:
Implement profiler shutdown procedure
diffs (151 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
@@ -639,7 +639,21 @@ static void ctl_handle_client(
}
msab_freeStatus(&stats);
} else if (strncmp(p, "profilerstop",
strlen("profilerstop")) == 0) {
-
+ char *e = shutdown_profiler(q, &stats);
+ if (e != NULL) {
+ Mfprintf(_mero_ctlerr, "%s: failed to
shutdown the profiler "
+ "database '%s': %s\n",
origin, q, getErrMsg(e));
+ len = snprintf(buf2, sizeof(buf2),
+ "%s\n",
getErrMsg(e));
+ send_client("!");
+ freeErr(e);
+ } else {
+ len = snprintf(buf2, sizeof(buf2),
"OK\n");
+ send_client("=");
+ Mfprintf(_mero_ctlout, "%s: profiler
shut down for '%s'\n",
+ origin, q);
+ }
+ msab_freeStatus(&stats);
} else if (strncmp(p, "name=", strlen("name=")) == 0) {
char *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
@@ -12,6 +12,7 @@
#include <sys/types.h>
#include <sys/un.h>
#include <sys/stat.h>
+#include <signal.h>
#include <unistd.h>
#include <string.h> /* char ** */
#include <time.h> /* localtime */
@@ -942,8 +943,102 @@ fork_profiler(char *dbname, sabdb **stat
freeConfFile(ckv);
free(ckv);
free(profiler_executable);
+ free(pidfilename);
pthread_mutex_unlock(&fork_lock);
return error;
}
+err
+shutdown_profiler(char *dbname, sabdb **stats)
+{
+ err error=NO_ERR;
+ confkeyval *ckv, *kv;
+ size_t pidfnlen = 0;
+ char *pidfilename = NULL;
+ FILE *pidfile;
+ char buf[BUFSIZ];
+ size_t nbytes;
+ pid_t pid;
+
+ error = msab_getStatus(stats, dbname);
+ if (error != NULL) {
+ return error;
+ }
+
+ if (*stats == NULL) {
+ /* TODO: What now? */
+ error = newErr("Null stats for db %s", dbname);
+ return error;
+ }
+
+ /* Verify that the requested db is running */
+ if ((*stats)->state != SABdbRunning) {
+ /* server is not running, shoo */
+ error = newErr("Database %s is not running.", dbname);
+ goto cleanup;
+ }
+
+ /* Find the pid file and make sure the profiler is running */
+ ckv = getDefaultProps();
+ readAllProps(ckv, (*stats)->path);
+ kv = findConfKey(ckv, PROFILERLOGPROPERTY);
+
+ if (kv == NULL) {
+ error = newErr("Property 'profilerlogpath' not set for db %s\n",
+ dbname);
+ goto cleanup;
+ }
+
+ /* construct the filename of the pid file */
+ pidfnlen = strlen(kv->val) + strlen("/profiler.pid") + 1;
+ pidfilename = malloc(pidfnlen);
+ if (pidfilename == NULL) {
+ error = newErr("Cannot allocate buffer while shutting down of
profiler");
+ goto cleanup;
+ }
+ snprintf(pidfilename, pidfnlen, "%s/profiler.pid", kv->val);
+
+ if ((pidfile = fopen(pidfilename, "r")) == NULL) {
+ error = newErr("Unable to open %s for reading", pidfilename);
+ goto cleanup;
+ }
+
+ clearerr(pidfile);
+ nbytes = fread(buf, 1, BUFSIZ, pidfile);
+
+ if (ferror(pidfile)) {
+ error = newErr("Cannot read pid (%s) from file %s", buf,
pidfilename);
+ fclose(pidfile);
+ goto cleanup;
+ }
+ fclose(pidfile);
+
+ if (buf[nbytes - 1] == '\n') {
+ buf[nbytes - 1] = '\0';
+ }
+
+ pid = (pid_t)strtol(buf, NULL, 10);
+ if (pid == 0 && errno == EINVAL) {
+ error = newErr("File contents %s not a valid pid", buf);
+ goto cleanup;
+ }
+
+ if (kill(pid, SIGTERM) == -1) {
+ char error_message[BUFSIZ];
+ strerror_r(errno, error_message, BUFSIZ);
+ error = newErr("%s", error_message);
+ goto cleanup;
+ }
+
+ /* All went well. Remove the pidfile */
+ if (unlink(pidfilename) != 0) {
+ error = newErr("Profiler seems to have stopped, but cannot
remove pid file.");
+ }
+
+ cleanup:
+ freeConfFile(ckv);
+ free(pidfilename);
+ return error;
+}
+
/* vim:set ts=4 sw=4 noexpandtab: */
diff --git a/tools/merovingian/daemon/forkmserver.h
b/tools/merovingian/daemon/forkmserver.h
--- a/tools/merovingian/daemon/forkmserver.h
+++ b/tools/merovingian/daemon/forkmserver.h
@@ -14,6 +14,7 @@
err forkMserver(char* database, sabdb** stats, int force);
err fork_profiler(char *database, sabdb **stats, char **log_path);
+err shutdown_profiler(char *dbname, sabdb **stats);
#endif
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list