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