Changeset: 54b89e9d66a6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54b89e9d66a6
Modified Files:
tools/merovingian/daemon/controlrunner.c
tools/merovingian/daemon/discoveryrunner.c
tools/merovingian/daemon/discoveryrunner.h
tools/merovingian/daemon/merovingian.c
tools/merovingian/daemon/merovingian.h
tools/merovingian/daemon/monetdbd.1.in
Branch: ipv6
Log Message:
Revert discovery service changes.
IPv6 multicast requires to specify which interface to connect to, which would
require another property to monetdbd. As the discovery functionality is not
widely used, we will keep it under IPv4 exclusively.
diffs (278 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
@@ -48,7 +48,7 @@ leavedb(char *name)
"LEAV %s mapi:monetdb://%s:%u/",
name, _mero_hostname,
(unsigned int)getConfNum(_mero_props, "port"));
- difuse(buf);
+ broadcast(buf);
}
static void
@@ -103,7 +103,7 @@ anncdbS(sabdb *stats)
_mero_hostname,
(unsigned int)getConfNum(_mero_props, "port"),
getConfNum(_mero_props, "discoveryttl") + 60);
- difuse(buf);
+ broadcast(buf);
}
freeConfFile(props);
free(props);
diff --git a/tools/merovingian/daemon/discoveryrunner.c
b/tools/merovingian/daemon/discoveryrunner.c
--- a/tools/merovingian/daemon/discoveryrunner.c
+++ b/tools/merovingian/daemon/discoveryrunner.c
@@ -30,20 +30,16 @@ remotedb _mero_remotedbs = NULL;
pthread_mutex_t _mero_remotedb_lock = PTHREAD_MUTEX_INITIALIZER;
void
-difuse(char *msg)
+broadcast(char *msg)
{
- ssize_t sent;
- size_t len = strlen(msg) + 1;
+ int len = strlen(msg) + 1;
if (_mero_broadcastsock < 0)
return;
- sent = sendto(_mero_broadcastsock, msg, len, 0, _mero_broadcastaddr,
_mero_broadcastlength);
- if (sent == -1) {
- Mfprintf(_mero_discerr, "error while sending %s message: %s\n",
- _mero_broadcastaddr->sa_family == AF_INET ?
"broadcast" : "multicast", strerror(errno));
- } else if (sent < (ssize_t) len) {
- Mfprintf(_mero_discerr, "a %s message was not sent entirely\n",
- _mero_broadcastaddr->sa_family == AF_INET ?
"broadcast" : "multicast");
- }
+ if (sendto(_mero_broadcastsock, msg, len, 0,
+ (struct sockaddr *)&_mero_broadcastaddr,
+ sizeof(_mero_broadcastaddr)) != len)
+ Mfprintf(_mero_discerr, "error while sending broadcast "
+ "message: %s\n", strerror(errno));
}
static int
@@ -310,7 +306,7 @@ discoveryRunner(void *d)
/* start shouting around that we're here ;) request others to tell
* what databases they have */
snprintf(buf, 512, "HELO %s", _mero_hostname);
- difuse(buf);
+ broadcast(buf);
ckv = getDefaultProps();
discttl = findConfKey(_mero_props, "discoveryttl");
@@ -348,7 +344,7 @@ discoveryRunner(void *d)
stats->dbname, val[0]
== '\0' ? "" : "/", val,
_mero_hostname,
(unsigned int)getConfNum(_mero_props, "port"),
discttl->ival + 60);
- difuse(buf);
+ broadcast(buf);
}
freeConfFile(ckv);
}
@@ -362,7 +358,7 @@ discoveryRunner(void *d)
_mero_hostname, (unsigned
int)getConfNum(_mero_props, "port"),
discttl->ival + 60);
/* coverity[string_null] */
- difuse(buf);
+ broadcast(buf);
}
}
@@ -527,7 +523,7 @@ discoveryRunner(void *d)
snprintf(buf, 512, "LEAV %s mapi:monetdb://%s:%u/",
stats->dbname, _mero_hostname,
(unsigned int)getConfNum(_mero_props,
"port"));
- difuse(buf);
+ broadcast(buf);
}
freeConfFile(ckv);
stats = stats->next;
@@ -540,7 +536,7 @@ discoveryRunner(void *d)
if (getConfNum(_mero_props, "control") != 0) {
snprintf(buf, 512, "LEAV * %s:%u",
_mero_hostname, (unsigned
int)getConfNum(_mero_props, "port"));
- difuse(buf);
+ broadcast(buf);
}
free(ckv);
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
@@ -11,7 +11,7 @@
#include "msabaoth.h"
-void difuse(char *msg);
+void broadcast(char *msg);
void registerMessageTap(int fd);
void unregisterMessageTap(int fd);
void *discoveryRunner(void *d);
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
@@ -118,11 +118,8 @@ FILE *_mero_ctlerr = NULL;
int _mero_broadcastsock = -1;
/* ipv6 global any bind address constant */
const struct in6_addr ipv6_any_addr = IN6ADDR_ANY_INIT;
-/* broadcast/multicast address/port */
-struct sockaddr_in server_ipv4;
-struct sockaddr_in6 server_ipv6;
-struct sockaddr *_mero_broadcastaddr;
-socklen_t _mero_broadcastlength;
+/* broadcast address/port */
+struct sockaddr_in _mero_broadcastaddr;
/* hostname of this machine */
char _mero_hostname[128];
/* default options read from config file */
@@ -908,90 +905,36 @@ main(int argc, char *argv[])
/* open up connections */
if ((e = openConnectionTCP(&sock, use_ipv6, host, port, stdout)) ==
NO_ERR &&
(e = openConnectionUNIX(&socku, mapi_usock, 0, stdout)) ==
NO_ERR &&
- (discovery == 0 || (e = openConnectionUDP(&discsock, use_ipv6,
host, port)) == NO_ERR) &&
+ (discovery == 0 || (e = openConnectionUDP(&discsock, false,
host, port)) == NO_ERR) &&
(e = openConnectionUNIX(&unsock, control_usock, S_IRWXO,
_mero_ctlout)) == NO_ERR) {
pthread_t ctid = 0;
pthread_t dtid = 0;
if (discovery == 1) {
- if (use_ipv6) { //as ipv6 does not support broadcast,
we will use multicast instead
- int check = -1;
- struct ipv6_mreq mreq;
- struct addrinfo *multi, hints = (struct
addrinfo) {
- .ai_family = AF_INET6,
- .ai_socktype = SOCK_DGRAM,
- .ai_protocol = IPPROTO_UDP,
- };
-
- _mero_broadcastaddr = (struct sockaddr*)
&server_ipv6;
- _mero_broadcastlength = (socklen_t)
sizeof(struct sockaddr_in6);
-
- memset(&server_ipv6, 0, sizeof(struct
sockaddr_in6));
- server_ipv6.sin6_family = AF_INET6;
- server_ipv6.sin6_port = htons(port);
- server_ipv6.sin6_addr = ipv6_any_addr;
-
- _mero_broadcastsock = socket(AF_INET6,
SOCK_DGRAM
+ _mero_broadcastsock = socket(AF_INET, SOCK_DGRAM
#ifdef SOCK_CLOEXEC
-
| SOCK_CLOEXEC
+
| SOCK_CLOEXEC
#endif
- , 0);
- if (_mero_broadcastsock == -1) {
- Mfprintf(stderr, "cannot create
multicast package: %s\n", strerror(errno));
- closesocket(discsock);
- discsock = -1;
- } else if ((check = getaddrinfo("ff02::1",
NULL, &hints, &multi)) != 0) {
- //ipv6 multicast all nodes on the local
network segment
- Mfprintf(stderr, "cannot create
multicast package: %s\n", gai_strerror(check));
- closesocket(discsock);
- closesocket(_mero_broadcastsock);
- discsock = -1;
- }
-
- if (discsock != -1) {
- memset(&mreq, 0, sizeof(mreq));
- memcpy(&mreq.ipv6mr_multiaddr,
&((struct sockaddr_in6 *) multi->ai_addr)->sin6_addr,
-
sizeof(mreq.ipv6mr_multiaddr));
- mreq.ipv6mr_interface = 0;
- freeaddrinfo(multi);
-
- if (setsockopt( _mero_broadcastsock,
IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) != 0) {
- Mfprintf(stderr, "cannot create
multicast package: %s\n", strerror(errno));
- closesocket(discsock);
-
closesocket(_mero_broadcastsock);
- discsock = -1;
- }
- }
- } else {
- _mero_broadcastaddr = (struct sockaddr*)
&server_ipv4;
- _mero_broadcastlength = (socklen_t)
sizeof(struct sockaddr_in);
- server_ipv4.sin_family = AF_INET;
- server_ipv4.sin_addr.s_addr =
htonl(INADDR_BROADCAST);
- /* the target port is our configured port, not
elegant, but how
- * else can we do it? can't broadcast to all
ports or something */
- server_ipv4.sin_port = htons(port);
- for (int i = 0; i < 8; i++)
- server_ipv4.sin_zero[i] = 0;
- ret = 1;
- _mero_broadcastsock = socket(AF_INET, SOCK_DGRAM
-#ifdef SOCK_CLOEXEC
-
| SOCK_CLOEXEC
-#endif
- , 0);
- if (_mero_broadcastsock == -1 ||
- setsockopt(_mero_broadcastsock,
SOL_SOCKET, SO_BROADCAST, &ret, sizeof(ret)) == -1) {
- Mfprintf(stderr, "cannot create
broadcast package, discovery services disabled, error: %s \n",
- strerror(errno));
- closesocket(discsock);
- if (_mero_broadcastsock >= 0)
-
closesocket(_mero_broadcastsock);
- discsock = -1;
- }
+
, 0);
+ ret = 1;
+ if (_mero_broadcastsock == -1 ||
+ setsockopt(_mero_broadcastsock,
+ SOL_SOCKET, SO_BROADCAST,
&ret, sizeof(ret)) == -1)
+ {
+ Mfprintf(stderr, "cannot create broadcast
package, "
+ "discovery services
disabled\n");
+ closesocket(discsock);
+ discsock = -1;
}
#ifndef SOCK_CLOEXEC
- if (discsock != -1)
- (void) fcntl(_mero_broadcastsock, F_SETFD,
FD_CLOEXEC);
+ (void) fcntl(_mero_broadcastsock, F_SETFD, FD_CLOEXEC);
#endif
+
+ _mero_broadcastaddr.sin_family = AF_INET;
+ _mero_broadcastaddr.sin_addr.s_addr =
htonl(INADDR_BROADCAST);
+ /* the target port is our configured port, not elegant,
but how
+ * else can we do it? can't broadcast to all ports or
something */
+ _mero_broadcastaddr.sin_port = htons(port);
}
/* Paranoia umask, but good, because why would people have to
sniff
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
@@ -75,8 +75,7 @@ extern FILE *_mero_ctlout;
extern FILE *_mero_ctlerr;
extern int _mero_broadcastsock;
extern const struct in6_addr ipv6_any_addr;
-extern struct sockaddr *_mero_broadcastaddr;
-extern socklen_t _mero_broadcastlength;
+extern struct sockaddr_in _mero_broadcastaddr;
extern char _mero_hostname[128];
extern confkeyval *_mero_db_props;
extern confkeyval *_mero_props;
diff --git a/tools/merovingian/daemon/monetdbd.1.in
b/tools/merovingian/daemon/monetdbd.1.in
--- a/tools/merovingian/daemon/monetdbd.1.in
+++ b/tools/merovingian/daemon/monetdbd.1.in
@@ -170,9 +170,7 @@ This property specifies which TCP port
should listen to for connection requests. Defaults to 50000.
.TP
.B ipv6
-This property forces monetdbd to bind on IPv6 addresses only. This
-enforcement applies to the discovery service as well if enabled. In that
-case the discovery service will use IPv6 multicast on ff02::1 address.
+This property forces monetdbd to bind connections on IPv6 addresses only.
Defaults to false.
.TP
.B listenaddr
@@ -202,10 +200,9 @@ one specified at configure time, which i
Changing this property takes effect immediately at runtime.
.TP
.B discovery
-Specifies whether neighbor discovery is to be enabled using UDP.
-The discovery method is performed with broadcasts on IPv4 and
-multicasts in IPv6, while using the same portnumber as the port
-setting.
+Specifies whether neighbor discovery is to be enabled using UDP
+broadcasts or not. The broadcasts are done on the same portnumber as
+the port setting.
.TP
.B discoveryttl
.I Monetdbd
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list