Changeset: 4ffae97f8477 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4ffae97f8477
Added Files:
        monetdb5/tools/Tests/mserver5-ipv6.py
        monetdb5/tools/Tests/mserver5-ipv6.stable.err
        monetdb5/tools/Tests/mserver5-ipv6.stable.out
        
sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128
        sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
        
sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.err
        
sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
Modified Files:
        clients/R/Tests/All
        clients/mapilib/mapi.c
        common/options/monet_options.c
        gdk/gdk_string.c
        monetdb5/ChangeLog
        monetdb5/modules/mal/mal_mapi.c
        monetdb5/modules/mal/remote.c
        monetdb5/tools/Tests/All
        sql/backends/monet5/UDF/pyapi/conversion.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_statistics.c
        sql/backends/monet5/sql_statistics.h
        sql/backends/monet5/sql_upgrades.c
        sql/server/rel_optimizer.c
        sql/server/rel_optimizer.h
        sql/server/rel_planner.c
        sql/server/rel_remote.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
        sql/test/BugTracker-2017/Tests/cleanup_statistics.Bug-6439.stable.out
        
sql/test/BugTracker-2017/Tests/crash_after_oidx_on_sys_statistics.Bug-6251.stable.out
        sql/test/BugTracker-2017/Tests/statistics_nils_not_eq_zero.Bug-6331.sql
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.err
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-aritmetic-expressions-handling.Bug-6576.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-having-not-null-not-in.Bug-6557.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-having-not-null-not-in.Bug-6557.stable.err
        sql/test/BugTracker-2019/Tests/All
        sql/test/BugTracker/Tests/bug_in_selection.SF-1892413.stable.out
        sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.powerpc64.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
        sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
        sql/test/miscellaneous/Tests/groupby_expressions.stable.err
        sql/test/remote/Tests/partition_elim.stable.out
        sql/test/subquery/Tests/correlated.sql
        sql/test/subquery/Tests/correlated.stable.out
        sql/test/subquery/Tests/subquery.sql
        sql/test/subquery/Tests/subquery.stable.out
        sql/test/sys-schema/Tests/check_Not_Nullable_columns.sql
        sql/test/sys-schema/Tests/check_Not_Nullable_columns.stable.out
        sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-hge/Tests/dump.stable.out.int128
        sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade/Tests/dump.stable.out
        sql/test/testdb-upgrade/Tests/upgrade.stable.out
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
        testing/Mtest.py.in
        testing/process.py
        tools/merovingian/ChangeLog
        tools/merovingian/client/monetdb.1
        tools/merovingian/daemon/client.c
        tools/merovingian/daemon/connections.c
        tools/merovingian/daemon/connections.h
        tools/merovingian/daemon/controlrunner.c
        tools/merovingian/daemon/discoveryrunner.c
        tools/merovingian/daemon/discoveryrunner.h
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/merovingian.h
        tools/merovingian/daemon/monetdbd.1.in
        tools/merovingian/daemon/proxy.c
        tools/merovingian/utils/control.c
        tools/merovingian/utils/properties.c
Branch: mtime
Log Message:

Merge with default branch.


diffs (truncated from 136769 to 300 lines):

diff --git a/clients/R/Tests/All b/clients/R/Tests/All
--- a/clients/R/Tests/All
+++ b/clients/R/Tests/All
@@ -3,6 +3,6 @@ HAVE_LIBR?install
 HAVE_LIBR?deps-test
 HAVE_LIBR?dbi
 #HAVE_LIBR?dplyr too slow
-HAVE_LIBR?dplyr-flights
+#HAVE_LIBR?dplyr-flights they keep changing this
 HAVE_LIBR?copy_into_fwf
 HAVE_LIBR&NOT_WIN32?dbapply
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -1975,9 +1975,16 @@ mapi_mapiuri(const char *url, const char
                dbname = NULL;
                query = uri;
        } else {
-               char *p;
-
-               if ((p = strchr(uri, ':')) == NULL) {
+               char *p = uri;
+
+               if (*p == '[') {
+                       if ((p = strchr(p, ']')) == NULL) {
+                               free(uri);
+                               mapi_setError(mid, "URI contains an invalid 
IPv6 address", "mapi_mapiuri", MERROR);
+                               return mid;
+                       }
+               }
+               if ((p = strchr(p, ':')) == NULL) {
                        free(uri);
                        mapi_setError(mid,
                                      "URI must contain a port number after "
@@ -2829,6 +2836,14 @@ mapi_reconnect(Mapi mid)
                                red += 15; /* "mapi:monetdb://" */
                                p = red;
                                q = NULL;
+                               if (*red == '[') {
+                                       if ((red = strchr(red, ']')) == NULL) {
+                                               mapi_close_handle(hdl);
+                                               mapi_setError(mid, "invalid 
IPv6 hostname", "mapi_reconnect", MERROR);
+                                               close_connection(mid);
+                                               return mid->error;
+                                       }
+                               }
                                if ((red = strchr(red, ':')) != NULL) {
                                        *red++ = '\0';
                                        q = red;
diff --git a/common/options/monet_options.c b/common/options/monet_options.c
--- a/common/options/monet_options.c
+++ b/common/options/monet_options.c
@@ -219,7 +219,7 @@ mo_builtin_settings(opt **Set)
        if (Set == NULL)
                return 0;
 
-#define N_OPTIONS      8       /*MUST MATCH # OPTIONS BELOW */
+#define N_OPTIONS      9       /*MUST MATCH # OPTIONS BELOW */
        set = malloc(sizeof(opt) * N_OPTIONS);
        if (set == NULL)
                return 0;
@@ -246,6 +246,10 @@ mo_builtin_settings(opt **Set)
        set[i].value = strdup("false");
        i++;
        set[i].kind = opt_builtin;
+       set[i].name = strdup("mapi_ipv6");
+       set[i].value = strdup("false");
+       i++;
+       set[i].kind = opt_builtin;
        set[i].name = strdup("mapi_autosense");
        set[i].value = strdup("false");
        i++;
diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -630,7 +630,7 @@ strFromStr(const char *restrict src, siz
 
        if (!external) {
                size_t sz = strLen(src);
-               atommem(sz);
+               atommem(sz + 1);
                strncpy(*dst, src, sz + 1);
                return (ssize_t) sz;
        }
@@ -789,7 +789,7 @@ strToStr(char **restrict dst, size_t *re
 
        if (!external) {
                sz = strLen(src);
-               atommem(sz);
+               atommem(sz + 1);
                strncpy(*dst, src, sz + 1);
                return (ssize_t) sz;
        }
diff --git a/monetdb5/ChangeLog b/monetdb5/ChangeLog
--- a/monetdb5/ChangeLog
+++ b/monetdb5/ChangeLog
@@ -1,6 +1,11 @@
 # ChangeLog file for MonetDB5
 # This file is updated with Maddlog
 
+* Thu May  2 2019 Pedro Ferreira <pedro.ferre...@monetdbsolutions.com>
+- Added "mapi_ipv6" property to monet_options to force ipv6 address
+  binding only.  This property is inherited while forking from
+  monetdbd if it is also set there.
+
 * Thu Apr 18 2019 Sjoerd Mullender <sjo...@acm.org>
 - Removed (bat)calc.between_symmetric and changed (bat)calc.between
   by adding a number of extra arguments, all of type :bit: symmetric,
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
@@ -502,55 +502,19 @@ error:
                closesocket(usock);
 }
 
-/**
- * Small utility function to call the sabaoth marchConnection function
- * with the right arguments.  If the socket is bound to 0.0.0.0 the
- * hostname address is used, to make the info usable for servers outside
- * localhost.
- */
-static void SERVERannounce(struct in_addr addr, int port, str usockfile) {
-       str buf;
-       char host[128];
+static const struct in6_addr ipv6_loopback_addr = IN6ADDR_LOOPBACK_INIT;
 
-       if (port > 0) {
-               if (addr.s_addr == INADDR_ANY) {
-                       gethostname(host, sizeof(host));
-                       host[sizeof(host) - 1] = '\0';
-               } else {
-                       /* avoid doing this, it requires some includes that 
probably
-                        * give trouble on windowz
-                       host = inet_ntoa(addr);
-                        */
-                       sprintf(host, "%u.%u.%u.%u",
-                                       (unsigned) ((ntohl(addr.s_addr) >> 24) 
& 0xff),
-                                       (unsigned) ((ntohl(addr.s_addr) >> 16) 
& 0xff),
-                                       (unsigned) ((ntohl(addr.s_addr) >> 8) & 
0xff),
-                                       (unsigned) (ntohl(addr.s_addr) & 0xff));
-               }
-               if ((buf = msab_marchConnection(host, port)) != NULL)
-                       free(buf);
-               else
-                       /* announce that we're now reachable */
-                       printf("# Listening for connection requests on "
-                                       "mapi:monetdb://%s:%i/\n", host, port);
-       }
-       if (usockfile != NULL) {
-               port = 0;
-               if ((buf = msab_marchConnection(usockfile, port)) != NULL)
-                       free(buf);
-               else
-                       /* announce that we're now reachable */
-                       printf("# Listening for UNIX domain connection requests 
on "
-                                       "mapi:monetdb://%s\n", usockfile);
-       }
-}
+static const struct in6_addr ipv6_any_addr = IN6ADDR_ANY_INIT;
 
 static str
 SERVERlisten(int *Port, const char *Usockfile, int *Maxusers)
 {
-       struct sockaddr_in server;
+       struct sockaddr* server = NULL;
+       struct sockaddr_in server_ipv4;
+       struct sockaddr_in6 server_ipv6;
        SOCKET sock = INVALID_SOCKET;
        SOCKET *psock;
+       bool bind_ipv6 = false;
        bool accept_any = false;
        bool autosense = false;
 #ifdef HAVE_SYS_UN_H
@@ -564,19 +528,28 @@ SERVERlisten(int *Port, const char *Usoc
        int port;
        int maxusers;
        char *usockfile;
+       str buf;
+       char host[128];
+       const char *listenaddr;
 #ifdef DEBUG_SERVER
        char msg[512], host[512];
        Client cntxt= mal_clients;
 #endif
 
        accept_any = GDKgetenv_istrue("mapi_open");
+       bind_ipv6 = GDKgetenv_istrue("mapi_ipv6");
        autosense = GDKgetenv_istrue("mapi_autosense");
+       listenaddr = GDKgetenv("mapi_listenaddr");
 
        /* early way out, we do not want to listen on any port when running in 
embedded mode */
        if (GDKgetenv_istrue("mapi_disable")) {
                return MAL_SUCCEED;
        }
 
+       if (listenaddr && accept_any)
+               throw(ILLARG,"mal_mapi.listen", OPERATION_FAILED
+                                                                          ": 
mapi_open and mapi_listenaddr cannot be set at the same time");
+
        psock = GDKmalloc(sizeof(SOCKET) * 3);
        if (psock == NULL)
                throw(MAL,"mal_mapi.listen", SQLSTATE(HY001) MAL_MALLOC_FAIL);
@@ -614,69 +587,102 @@ SERVERlisten(int *Port, const char *Usoc
        }
 
        if (port > 0) {
-               sock = socket(AF_INET, SOCK_STREAM
+               if (listenaddr && *listenaddr) {
+                       int check = 0, e = errno;
+                       char sport[16];
+                       struct addrinfo *result = NULL, *rp = NULL, hints = 
(struct addrinfo) {
+                               .ai_family = bind_ipv6 ? AF_INET6 : AF_INET,
+                               .ai_socktype = SOCK_STREAM,
+                               .ai_flags = AI_PASSIVE,
+                               .ai_protocol = IPPROTO_TCP,
+                       };
+
+                       do {
+                               snprintf(sport, 16, "%d", port);
+                               check = getaddrinfo(listenaddr, sport, &hints, 
&result);
+                               if (check != 0) {
+                                       if (autosense && port <= 65535) {
+                                               port++;
+                                               continue;
+                                       }
+                                       GDKfree(psock);
+                                       GDKfree(usockfile);
+                                       throw(IO, "mal_mapi.listen", 
OPERATION_FAILED
+                                                         ": bind to stream 
socket on address %s and port %d failed: %s", listenaddr, port,
+                                                         gai_strerror(check));
+                               }
+
+                               for (rp = result; rp != NULL; rp = rp->ai_next) 
{
+                                       int bind_check;
+                                       sock = socket(rp->ai_family, 
rp->ai_socktype
 #ifdef SOCK_CLOEXEC
-                                         | SOCK_CLOEXEC
+                                                                 | SOCK_CLOEXEC
 #endif
-                                         , 0);
-               if (sock == INVALID_SOCKET) {
-                       int e = errno;
-                       GDKfree(psock);
-                       GDKfree(usockfile);
-                       errno = e;
-                       throw(IO, "mal_mapi.listen",
-                                 OPERATION_FAILED ": creation of stream socket 
failed: %s",
-#ifdef _MSC_VER
-                                 wsaerror(WSAGetLastError())
-#else
-                                 strerror(errno)
-#endif
-                               );
-               }
+                                                                 , 
rp->ai_protocol);
+                                       if (sock == INVALID_SOCKET) {
+                                               e = errno;
+                                               continue;
+                                       }
 #if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL)
-               (void) fcntl(sock, F_SETFD, FD_CLOEXEC);
+                                       (void) fcntl(sock, F_SETFD, FD_CLOEXEC);
 #endif
 
-               if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, 
sizeof on) == SOCKET_ERROR) {
-#ifdef _MSC_VER
-                       const char *err = wsaerror(WSAGetLastError());
-#else
-                       const char *err = strerror(errno);
-#endif
-                       GDKfree(psock);
-                       GDKfree(usockfile);
-                       closesocket(sock);
-                       throw(IO, "mal_mapi.listen", OPERATION_FAILED ": 
setsockptr failed %s", err);
-               }
+                                       if (setsockopt(sock, SOL_SOCKET, 
SO_REUSEADDR, (char *) &on, sizeof on) == SOCKET_ERROR) {
+                                               e = errno;
+                                               closesocket(sock);
+                                               continue;
+                                       }
 
-               server.sin_family = AF_INET;
-               if (accept_any)
-                       server.sin_addr.s_addr = htonl(INADDR_ANY);
-               else
-                       server.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-               for (i = 0; i < 8; i++)
-                       server.sin_zero[i] = 0;
-               length = (SOCKLEN) sizeof(server);
+                                       bind_check = bind(sock, (SOCKPTR) 
rp->ai_addr, (socklen_t) rp->ai_addrlen);
+                                       e = errno;
+                                       if (bind_check == SOCKET_ERROR) {
+                                               closesocket(sock);
+                                               continue;
+                                       } else
+                                               break;
+                               }
+                               if (result)
+                                       freeaddrinfo(result);
+                               errno = e;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to