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

Reply via email to