Changeset: 255a382c6742 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=255a382c6742 Modified Files: tools/merovingian/daemon/controlrunner.c tools/merovingian/daemon/forkmserver.c tools/merovingian/daemon/merovingian.c tools/merovingian/daemon/merovingian.h Branch: Jun2016 Log Message:
Avoid attempting to recursively lock a non-recursive lock. See bug 4066, comment 29 and 33. diffs (234 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 @@ -340,7 +340,7 @@ static void ctl_handle_client( if (dp->type == MERODB && strcmp(dp->dbname, q) == 0) { pthread_mutex_unlock(&_mero_topdp_lock); if (strcmp(p, "stop") == 0) { - terminateProcess(dp); + terminateProcess(dp, 1); 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 @@ -35,10 +35,9 @@ static pthread_mutex_t fork_lock = PTHRE * shut down gracefully within a given time-out. If that fails, it * sends the deadly SIGKILL signal to the mserver process and returns. */ -void * -terminateProcess(void *p) +void +terminateProcess(dpair d, int lock) { - dpair d = (dpair)p; sabdb *stats; char *er; int i; @@ -47,24 +46,27 @@ terminateProcess(void *p) pid_t pid = d->pid; char *dbname = strdup(d->dbname); - pthread_mutex_lock(&fork_lock); + if (lock) + pthread_mutex_lock(&fork_lock); er = msab_getStatus(&stats, dbname); if (er != NULL) { - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stderr, "cannot terminate process " LLFMT ": %s\n", (long long int)pid, er); free(er); free(dbname); - return NULL; + return; } if (stats == NULL) { - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stderr, "strange, process " LLFMT " serves database '%s' " "which does not exist\n", (long long int)pid, dbname); free(dbname); - return NULL; + return; } switch (stats->state) { @@ -72,48 +74,54 @@ terminateProcess(void *p) /* ok, what we expect */ break; case SABdbCrashed: - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stderr, "cannot shut down database '%s', mserver " "(pid " LLFMT ") has crashed\n", dbname, (long long int)pid); msab_freeStatus(&stats); free(dbname); - return NULL; + return; case SABdbInactive: - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stdout, "database '%s' appears to have shut down already\n", dbname); fflush(stdout); msab_freeStatus(&stats); free(dbname); - return NULL; + return; case SABdbStarting: - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stderr, "database '%s' appears to be starting up\n", dbname); /* starting up, so we'll go to the shut down phase */ break; default: - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stderr, "unknown state: %d\n", (int)stats->state); msab_freeStatus(&stats); free(dbname); - return NULL; + return; } if (d->type == MEROFUN) { - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); multiplexDestroy(dbname); msab_freeStatus(&stats); free(dbname); - return NULL; + return; } else if (d->type != MERODB) { /* barf */ - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stderr, "cannot stop merovingian process role: %s\n", dbname); msab_freeStatus(&stats); free(dbname); - return NULL; + return; } /* ok, once we get here, we'll be shutting down the server */ @@ -140,19 +148,21 @@ terminateProcess(void *p) /* ok, try again */ break; case SABdbCrashed: - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf (stderr, "database '%s' crashed after SIGTERM\n", dbname); msab_freeStatus(&stats); free(dbname); - return NULL; + return; case SABdbInactive: - pthread_mutex_unlock(&fork_lock); + if (lock) + pthread_mutex_unlock(&fork_lock); Mfprintf(stdout, "database '%s' has shut down\n", dbname); fflush(stdout); msab_freeStatus(&stats); free(dbname); - return NULL; + return; default: Mfprintf(stderr, "unknown state: %d\n", (int)stats->state); break; @@ -165,8 +175,8 @@ terminateProcess(void *p) kill(pid, SIGKILL); msab_freeStatus(&stats); free(dbname); - pthread_mutex_unlock(&fork_lock); - return NULL; + if (lock) + pthread_mutex_unlock(&fork_lock); } /** @@ -638,14 +648,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); + terminateProcess(dp, 0); msab_freeStatus(stats); pthread_mutex_unlock(&fork_lock); return(newErr("database '%s' did not initialise the sql " "scenario", database)); } } else if (dp != NULL) { - terminateProcess(dp); + terminateProcess(dp, 0); msab_freeStatus(stats); pthread_mutex_unlock(&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 @@ -262,6 +262,13 @@ newErr(const char *fmt, ...) } +static void * +doTerminateProcess(void *p) +{ + terminateProcess((dpair) p, 1); + return NULL; +} + int main(int argc, char *argv[]) { @@ -898,7 +905,7 @@ shutdown: tlw->next = NULL; if ((thret = pthread_create(&(tlw->tid), NULL, - terminateProcess, (void *)t)) != 0) + doTerminateProcess, t)) != 0) { Mfprintf(stderr, "%s: unable to create thread to terminate " "database '%s': %s\n", 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 @@ -42,11 +42,6 @@ typedef char* err; } \ } while (0) -char *newErr(_In_z_ _Printf_format_string_ const char *fmt, ...) - __attribute__((__format__(__printf__, 1, 2))); -void *terminateProcess(void *p); -void logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream); - typedef enum _mtype { MERO = 1, MERODB, @@ -63,6 +58,11 @@ typedef struct _dpair { struct _dpair* next; }* dpair; +char *newErr(_In_z_ _Printf_format_string_ const char *fmt, ...) + __attribute__((__format__(__printf__, 1, 2))); +void terminateProcess(dpair d, int lock); +void logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream); + extern char *_mero_mserver; extern dpair _mero_topdp; extern pthread_mutex_t _mero_topdp_lock; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list