Changeset: c57cfbc65dac for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c57cfbc65dac
Modified Files:
        common/utils/msabaoth.c
        tools/merovingian/daemon/client.c
        tools/merovingian/daemon/controlrunner.c
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/merovingian.h
        tools/merovingian/daemon/multiplex-funnel.c
Branch: Jun2020
Log Message:

Merge with linear-hashing branch.


diffs (truncated from 1068 to 300 lines):

diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -617,7 +617,7 @@ msab_getSingleStatus(const char *pathbuf
         */
        snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname,
                         _sabaoth_internal_uuid);
-       if (stat(buf, &statbuf) != -1) {
+       if (stat(buf, &statbuf) == 0) {
                /* database has the same process signature as ours, which
                 * means, it must be us, rely on the uplog state */
                snprintf(log, sizeof(log), "%s/%s/%s", pathbuf, dbname, 
UPLOGFILE);
@@ -641,7 +641,7 @@ msab_getSingleStatus(const char *pathbuf
                        (void)fclose(f);
                }
        } else if (snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, 
".gdk_lock"),
-                          ((fd = MT_lockf(buf, F_TEST)) == -2)) {
+                          ((fd = MT_lockf(buf, F_TLOCK)) == -2)) {
                /* Locking failed; this can be because the lockfile couldn't
                 * be created.  Probably there is no Mserver running for
                 * that case also.
@@ -650,15 +650,18 @@ msab_getSingleStatus(const char *pathbuf
        } else if (fd == -1) {
                /* file is locked, so mserver is running, see if the database
                 * has finished starting */
-               snprintf(buf, sizeof(buf), "%s/%s/%s",
-                                pathbuf, dbname, STARTEDFILE);
+               snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, 
STARTEDFILE);
                if (stat(buf, &statbuf) == -1) {
                        sdb->state = SABdbStarting;
                } else {
                        sdb->state = SABdbRunning;
                }
        } else {
-               /* file is not locked, check for a crash in the uplog */
+               /* file was not locked (we just locked it), check for a crash
+                * in the uplog */
+               snprintf(log, sizeof(log), "%s/%s/%s", pathbuf, dbname, 
STARTEDFILE);
+               /* just to be sure, remove the .started file */
+               (void) remove(log);             /* may fail, that's fine */
                snprintf(log, sizeof(log), "%s/%s/%s", pathbuf, dbname, 
UPLOGFILE);
                if ((f = fopen(log, "r")) != NULL) {
                        (void)fseek(f, -1, SEEK_END);
@@ -675,28 +678,27 @@ msab_getSingleStatus(const char *pathbuf
                        /* no uplog, so presumably never started */
                        sdb->state = SABdbInactive;
                }
+               MT_lockf(buf, F_ULOCK);
+               close(fd);
        }
        snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, 
MAINTENANCEFILE);
-       sdb->locked = stat(buf, &statbuf) != -1;
+       sdb->locked = stat(buf, &statbuf) == 0;
 
        /* add scenarios that are supported */
        sdb->scens = NULL;
        snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, SCENARIOFILE);
        if ((f = fopen(buf, "r")) != NULL) {
                sablist* np = NULL;
-               while (fgets(data, 8095, f) != NULL) {
+               while (fgets(data, (int) sizeof(data), f) != NULL) {
                        if (*data != '\0' && data[strlen(data) - 1] == '\n')
                                data[strlen(data) - 1] = '\0';
                        if (sdb->scens == NULL) {
-                               sdb->scens = malloc(sizeof(sablist));
-                               sdb->scens->val = strdup(data);
-                               sdb->scens->next = NULL;
-                               np = sdb->scens;
+                               np = sdb->scens = malloc(sizeof(sablist));
                        } else {
                                np = np->next = malloc(sizeof(sablist));
-                               np->val = strdup(data);
-                               np->next = NULL;
                        }
+                       np->val = strdup(data);
+                       np->next = NULL;
                }
                (void)fclose(f);
        }
@@ -706,19 +708,16 @@ msab_getSingleStatus(const char *pathbuf
        snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, CONNECTIONFILE);
        if ((f = fopen(buf, "r")) != NULL) {
                sablist* np = NULL;
-               while (fgets(data, 8095, f) != NULL) {
+               while (fgets(data, (int) sizeof(data), f) != NULL) {
                        if (*data != '\0' && data[strlen(data) - 1] == '\n')
                                data[strlen(data) - 1] = '\0';
                        if (sdb->conns == NULL) {
-                               sdb->conns = malloc(sizeof(sablist));
-                               sdb->conns->val = strdup(data);
-                               sdb->conns->next = NULL;
-                               np = sdb->conns;
+                               np = sdb->conns = malloc(sizeof(sablist));
                        } else {
                                np = np->next = malloc(sizeof(sablist));
-                               np->val = strdup(data);
-                               np->next = NULL;
                        }
+                       np->val = strdup(data);
+                       np->next = NULL;
                }
                (void)fclose(f);
        }
diff --git a/tools/merovingian/daemon/client.c 
b/tools/merovingian/daemon/client.c
--- a/tools/merovingian/daemon/client.c
+++ b/tools/merovingian/daemon/client.c
@@ -44,7 +44,7 @@
 struct threads {
        struct threads *next;
        pthread_t tid;
-       volatile char dead;
+       volatile bool dead;
 };
 struct clientdata {
        int sock;
@@ -85,7 +85,7 @@ handleClient(void *data)
        free(data);
        fdin = socket_rstream(sock, "merovingian<-client (read)");
        if (fdin == 0) {
-               self->dead = 1;
+               self->dead = true;
                return(newErr("merovingian-client inputstream problems"));
        }
        fdin = block_stream(fdin);
@@ -93,7 +93,7 @@ handleClient(void *data)
        fout = socket_wstream(sock, "merovingian->client (write)");
        if (fout == 0) {
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(newErr("merovingian-client outputstream problems"));
        }
        fout = block_stream(fout);
@@ -137,7 +137,7 @@ handleClient(void *data)
                mnstr_flush(fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(e);
        }
        buf[sizeof(buf) - 1] = '\0';
@@ -158,7 +158,7 @@ handleClient(void *data)
                mnstr_flush(fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(e);
        }
 
@@ -174,7 +174,7 @@ handleClient(void *data)
                        mnstr_flush(fout);
                        close_stream(fout);
                        close_stream(fdin);
-                       self->dead = 1;
+                       self->dead = true;
                        return(e);
                }
                algo = passwd + 1;
@@ -185,7 +185,7 @@ handleClient(void *data)
                        mnstr_flush(fout);
                        close_stream(fout);
                        close_stream(fdin);
-                       self->dead = 1;
+                       self->dead = true;
                        return(e);
                }
                *s = 0;
@@ -196,7 +196,7 @@ handleClient(void *data)
                mnstr_flush(fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(e);
        }
 
@@ -211,7 +211,7 @@ handleClient(void *data)
                mnstr_flush(fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(e);
        }
 
@@ -229,7 +229,7 @@ handleClient(void *data)
                        mnstr_flush(fout);
                        close_stream(fout);
                        close_stream(fdin);
-                       self->dead = 1;
+                       self->dead = true;
                        return(e);
                } else {
                        *s = '\0';
@@ -243,7 +243,7 @@ handleClient(void *data)
                mnstr_flush(fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(newErr("client %s specified no database", host));
        }
 
@@ -253,7 +253,7 @@ handleClient(void *data)
                        control_handleclient(host, sock, fdin, fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(NO_ERR);
        }
 
@@ -283,7 +283,7 @@ handleClient(void *data)
                mnstr_flush(fout);
                close_stream(fout);
                close_stream(fdin);
-               self->dead = 1;
+               self->dead = true;
                return(e);
        }
        stat = top;
@@ -295,7 +295,7 @@ handleClient(void *data)
        {
                multiplexAddClient(top->dbname, sock, fout, fdin, host);
                msab_freeStatus(&top);
-               self->dead = 1;
+               self->dead = true;
                return(NO_ERR);
        }
 
@@ -324,7 +324,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                msab_freeStatus(&top);
-               self->dead = 1;
+               self->dead = true;
                return(e);
        }
 
@@ -395,13 +395,13 @@ handleClient(void *data)
                        close_stream(fdin);
                        Mfprintf(stdout, "starting a proxy failed: %s\n", e);
                        msab_freeStatus(&top);
-                       self->dead = 1;
+                       self->dead = true;
                        return(e);
                }
        }
 
        msab_freeStatus(&top);
-       self->dead = 1;
+       self->dead = true;
        return(NO_ERR);
 }
 
@@ -623,7 +623,7 @@ acceptConnections(int sock, int usock)
                }
                data->sock = msgsock;
                data->isusock = isusock;
-               p->dead = 0;
+               p->dead = false;
                data->self = p;
                data->challenge[31] = '\0';
                generateSalt(data->challenge, 31);
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,9 +355,12 @@ 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) {
+                                               if (dp->pid <= 0) {
+                                                       dp = NULL;
+                                                       /* unlock happens below 
*/
+                                                       break;
+                                               }
                                                if (strcmp(p, "stop") == 0) {
-                                                       pid_t pid = dp->pid;
-                                                       char *dbname = 
strdup(dp->dbname);
                                                        mtype type = dp->type;
                                                        
pthread_mutex_unlock(&_mero_topdp_lock);
                                                        /* Try to shutdown the 
profiler before the DB.
@@ -366,10 +369,12 @@ static void ctl_handle_client(
                                                         * other words: ignore 
any errors that shutdown_profiler
                                                         * may have encountered.
                                                         */
-                                                       
shutdown_profiler(dbname, &stats);
+                                                       
shutdown_profiler(dp->dbname, &stats);
                                                        if (stats != NULL)
                                                                
msab_freeStatus(&stats);
-                                                       terminateProcess(pid, 
dbname, type, 1);
+                                                       
pthread_mutex_lock(&dp->fork_lock);
+                                                       terminateProcess(dp, 
type);
+                                                       
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
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to