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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list