Changeset: 75271988a344 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75271988a344
Removed Files:
        tools/merovingian/daemon/peering.c
        tools/merovingian/daemon/peering.h
Modified Files:
        common/utils/msabaoth.c
        common/utils/mutils.c
        common/utils/mutils.h
        monetdb5/modules/mal/mal_mapi.c
        tools/merovingian/client/monetdb.c
        tools/merovingian/daemon/Makefile.ag
        tools/merovingian/daemon/client.c
        tools/merovingian/daemon/controlrunner.c
        tools/merovingian/daemon/discoveryrunner.h
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/handlers.h
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/multiplex-funnel.c
        tools/merovingian/daemon/multiplex-funnel.h
        tools/merovingian/daemon/proxy.c
        tools/merovingian/utils/control.c
        tools/merovingian/utils/utils.c
Branch: Dec2016
Log Message:

Merge with Jun2016 branch.


diffs (truncated from 1182 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
@@ -675,7 +675,7 @@ msab_getSingleStatus(const char *pathbuf
                        (void)fclose(f);
                }
        } else if ((snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, 
".gdk_lock") > 0) & /* no typo */
-                          ((fd = MT_lockf(buf, F_TLOCK, 4, 1)) == -2)) {
+                          ((fd = MT_lockf(buf, F_TEST, 4, 1)) == -2)) {
                /* Locking failed; this can be because the lockfile couldn't
                 * be created.  Probably there is no Mserver running for
                 * that case also.
@@ -694,7 +694,7 @@ msab_getSingleStatus(const char *pathbuf
        } else {
                /* locking succeed, check for a crash in the uplog */
                snprintf(log, sizeof(log), "%s/%s/%s", pathbuf, dbname, 
UPLOGFILE);
-               if ((f = fdopen(fd, "r+")) != NULL) {
+               if ((f = fopen(log, "r")) != NULL) {
                        (void)fseek(f, -1, SEEK_END);
                        if (fread(data, 1, 1, f) != 1) {
                                /* the log is empty, assume no crash */
@@ -704,12 +704,10 @@ msab_getSingleStatus(const char *pathbuf
                        } else { /* should be \t */
                                sdb->state = SABdbCrashed;
                        }
-                       /* release the lock */
-                       MT_lockf(buf, F_ULOCK, 4, 1);
                        (void)fclose(f);
                } else {
-                       /* shouldn't happen */
-                       close(fd);
+                       /* no uplog, so presumably never started */
+                       sdb->state = SABdbInactive;
                }
        }
        snprintf(buf, sizeof(buf), "%s/%s/%s", pathbuf, dbname, 
MAINTENANCEFILE);
diff --git a/common/utils/mutils.c b/common/utils/mutils.c
--- a/common/utils/mutils.c
+++ b/common/utils/mutils.c
@@ -356,6 +356,13 @@ MT_lockf(char *filename, int mode, off_t
                ret = LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY | 
LOCKFILE_EXCLUSIVE_LOCK, 0, len, 0, &ov);
        } else if (mode == F_LOCK) {
                ret = LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, len, 0, &ov);
+       } else if (mode == F_TEST) {
+               ret = LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY | 
LOCKFILE_EXCLUSIVE_LOCK, 0, len, 0, &ov);
+               if (ret != 0) {
+                       UnlockFileEx(fh, 0, len, 0, &ov);
+                       close(fd);
+                       return 0;
+               }
        } else {
                close(fd);
                errno = EINVAL;
@@ -408,6 +415,7 @@ lockf(int fd, int cmd, off_t len)
 #endif
 /* returns -1 when locking failed,
  * returns -2 when the lock file could not be opened/created
+ * returns 0 when mode is F_TEST and the lock file was not locked
  * returns the (open) file descriptor to the file when locking
  * returns 0 when unlocking */
 int
@@ -420,7 +428,7 @@ MT_lockf(char *filename, int mode, off_t
 
        if (lseek(fd, off, SEEK_SET) >= 0 &&
            lockf(fd, mode, len) == 0) {
-               if (mode == F_ULOCK) {
+               if (mode == F_ULOCK || mode == F_TEST) {
                        close(fd);
                        return 0;
                }
diff --git a/common/utils/mutils.h b/common/utils/mutils.h
--- a/common/utils/mutils.h
+++ b/common/utils/mutils.h
@@ -56,9 +56,10 @@ mutils_export char *dirname(char *path);
 
 #define MONETDB_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | 
S_IWOTH)
 
-#define F_TLOCK 2              /* test and lock a region for exclusive use */
-#define F_ULOCK 0              /* unlock a previously locked region */
-#define F_LOCK 1               /* lock a region for exclusive use */
+#define F_TEST 3               /* test a region for other processes locks.  */
+#define F_TLOCK        2               /* test and lock a region for exclusive 
use */
+#define F_ULOCK        0               /* unlock a previously locked region */
+#define F_LOCK 1               /* lock a region for exclusive use */
 
 mutils_export int MT_lockf(char *filename, int mode, off_t off, off_t len);
 
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -339,6 +339,7 @@ SERVERlistenThread(SOCKET *Sock)
                                {       int *c_d;
                                        /* filedescriptor, put it in place of 
msgsock */
                                        cmsg = CMSG_FIRSTHDR(&msgh);
+                                       shutdown(msgsock, SHUT_WR);
                                        closesocket(msgsock);
                                        if (!cmsg || cmsg->cmsg_type != 
SCM_RIGHTS) {
                                                fprintf(stderr, 
"!mal_mapi.listen: "
diff --git a/tools/merovingian/client/monetdb.c 
b/tools/merovingian/client/monetdb.c
--- a/tools/merovingian/client/monetdb.c
+++ b/tools/merovingian/client/monetdb.c
@@ -1029,7 +1029,7 @@ command_startstop(int argc, char *argv[]
                free(e);
                exit(2);
        }
-       if (doall != 1) {
+       if (!doall) {
                stats = globMatchDBS(argc, argv, &orig, type);
                msab_freeStatus(&orig);
                orig = stats;
@@ -1046,7 +1046,7 @@ command_startstop(int argc, char *argv[]
                 * databases.  In this mode we should omit starting already
                 * started databases, so we need to check first. */
 
-               if (doall == 1 && (
+               if (doall && (
                                ((mode == STOP || mode == KILL) && 
(stats->state != SABdbRunning && stats->state != SABdbStarting))
                                || (mode == START && stats->state == 
SABdbRunning)))
                {
@@ -1283,7 +1283,7 @@ command_get(int argc, char *argv[])
 
        /* look at the arguments and evaluate them based on a glob (hence we
         * listed all databases before) */
-       if (doall != 1) {
+       if (!doall) {
                stats = globMatchDBS(argc, argv, &orig, "get");
                msab_freeStatus(&orig);
                orig = stats;
diff --git a/tools/merovingian/daemon/Makefile.ag 
b/tools/merovingian/daemon/Makefile.ag
--- a/tools/merovingian/daemon/Makefile.ag
+++ b/tools/merovingian/daemon/Makefile.ag
@@ -37,7 +37,6 @@ bin_monetdbd = {
                          forkmserver.c forkmserver.h \
                          handlers.c handlers.h \
                          multiplex-funnel.c multiplex-funnel.h \
-                         peering.c peering.h \
                          proxy.c proxy.h
        LIBS = ../utils/libmeroutil \
                   ../../../common/stream/libstream \
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
@@ -33,6 +33,7 @@
 #include "multiplex-funnel.h"
 #include "controlrunner.h"
 #include "client.h"
+#include "handlers.h"
 
 struct threads {
        struct threads *next;
@@ -460,6 +461,7 @@ acceptConnections(int sock, int usock)
                                        break;
                        }
                }
+               childhandler();
                if (retval == 0) {
                        /* nothing interesting has happened */
                        continue;
@@ -527,7 +529,7 @@ acceptConnections(int sock, int usock)
 
                        rv = recvmsg(msgsock, &msgh, 0);
                        if (rv == -1) {
-                               close(msgsock);
+                               closesocket(msgsock);
                                continue;
                        }
 
@@ -537,12 +539,12 @@ acceptConnections(int sock, int usock)
                                break;
                        case '1':
                                /* filedescriptor, no way */
-                               close(msgsock);
+                               closesocket(msgsock);
                                Mfprintf(stderr, "client error: fd passing not 
supported\n");
                                continue;
                        default:
                                /* some unknown state */
-                               close(msgsock);
+                               closesocket(msgsock);
                                Mfprintf(stderr, "client error: unknown initial 
byte\n");
                                continue;
                        }
@@ -560,19 +562,18 @@ acceptConnections(int sock, int usock)
                        p->next = threads;
                        threads = p;
                } else {
-                       close(msgsock);
+                       closesocket(msgsock);
                        free(data);
                        free(p);
                }
        } while (_mero_keep_listening);
        shutdown(sock, SHUT_RDWR);
-       close(sock);
+       closesocket(sock);
        return(NO_ERR);
 
 error:
        _mero_keep_listening = 0;
-       shutdown(sock, SHUT_RDWR);
-       close(sock);
+       closesocket(sock);
        return(newErr("accept connection: %s", msg));
 }
 
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
@@ -21,7 +21,6 @@
 #include <signal.h>
 
 #include <errno.h>
-#include <pthread.h>
 
 #include <msabaoth.h>
 #include <mcrypt.h>
@@ -390,13 +389,6 @@ static void ctl_handle_client(
                                } else {
                                        if (*p != '\0') {
                                                pid_t child;
-                                               sigset_t blocksig;
-                                               /* temporarily block SIGCHLD 
signals until
-                                                * we've waited for the child 
we're about to
-                                                * create. See bug 
http://bugs.monetdb.org/3603. */
-                                               sigemptyset(&blocksig);
-                                               sigaddset(&blocksig, SIGCHLD);
-                                               pthread_sigmask(SIG_BLOCK, 
&blocksig, (sigset_t *) 0);
                                                if ((child = fork()) == 0) {
                                                        FILE *secretf;
                                                        size_t len;
@@ -406,10 +398,6 @@ static void ctl_handle_client(
                                                        int setlen = 0;
                                                        char *sadbfarm;
 
-                                                       sigemptyset(&blocksig);
-                                                       sigaddset(&blocksig, 
SIGCHLD);
-                                                       
pthread_sigmask(SIG_UNBLOCK, &blocksig, (sigset_t *) 0);
-
                                                        if ((err = 
msab_getDBfarm(&sadbfarm)) != NULL) {
                                                                
Mfprintf(_mero_ctlerr, "%s: internal error: %s\n",
                                                                                
 origin, err);
@@ -465,9 +453,6 @@ static void ctl_handle_client(
                                                        Mfprintf(_mero_ctlout, 
"%s: forking failed\n",
                                                                         
origin);
                                                }
-                                               sigemptyset(&blocksig);
-                                               sigaddset(&blocksig, SIGCHLD);
-                                               pthread_sigmask(SIG_UNBLOCK, 
&blocksig, (sigset_t *) 0);
                                        }
 
                                        Mfprintf(_mero_ctlout, "%s: created 
database '%s'\n",
@@ -993,10 +978,11 @@ controlRunner(void *d)
                snprintf(origin, sizeof(origin), "(local)");
 
                ctl_handle_client(origin, msgsock, NULL, NULL);
-               close(msgsock);
+               shutdown(msgsock, SHUT_RDWR);
+               closesocket(msgsock);
        } while (_mero_keep_listening);
        shutdown(usock, SHUT_RDWR);
-       close(usock);
+       closesocket(usock);
        Mfprintf(_mero_ctlout, "control channel closed\n");
        return NULL;
 }
diff --git a/tools/merovingian/daemon/discoveryrunner.h 
b/tools/merovingian/daemon/discoveryrunner.h
--- a/tools/merovingian/daemon/discoveryrunner.h
+++ b/tools/merovingian/daemon/discoveryrunner.h
@@ -9,8 +9,6 @@
 #ifndef _DISCOVERYRUNNER_H
 #define _DISCOVERYRUNNER_H 1
 
-#include <pthread.h>
-
 #include <msabaoth.h>
 
 void broadcast(char *msg);
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
@@ -16,7 +16,6 @@
 #include <string.h> /* char ** */
 #include <time.h> /* localtime */
 #include <errno.h>
-#include <pthread.h>
 
 #include <msabaoth.h>
 #include <utils/utils.h>
@@ -32,6 +31,145 @@
 static pthread_mutex_t fork_lock = PTHREAD_MUTEX_INITIALIZER;
 
 /**
+ * The terminateProcess function tries to let the given mserver process
+ * 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)
+{
+       dpair d = (dpair)p;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to