Thanks! --- well, haven tested it yet, but just hit this one when compiling with gcc and optimization enabled:
/ufs/manegold/_/scratch0/Monet/HG/Jun2010/source/sql/src/backends/monet5/merovingian/monetdb.c: In function ‘main’: /ufs/manegold/_/scratch0/Monet/HG/Jun2010/source/sql/src/backends/monet5/merovingian/monetdb.c:1489: error: ignoring return value of ‘chdir’, declared with attribute warn_unused_result Stefan On Mon, Jul 26, 2010 at 11:38:29AM +0200, Fabian Groffen wrote: > Changeset: 986a0834e2fe for MonetDB > URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=986a0834e2fe > Modified Files: > sql/src/backends/monet5/merovingian/ChangeLog.Jun2010 > sql/src/backends/monet5/merovingian/merovingian.c > sql/src/backends/monet5/merovingian/monetdb.c > Branch: Jun2010 > Log Message: > > Work around UNIX domain socket length restriction of around 108 chars. > > The sun_path element is typically around only 108 chars long. This > causes paths to be truncated. Find below list for the actual limits on > sun_path and what it accepts in reality. I worked around the problem by > using a relative socket file location (in the current working > directory), such that the long absolute path is no longer necessary. > For merovingian this wasn't much of a problem because it already chdirs > into the dbfarm, but for monetdb it required a chdir to dbfarm first. > It only does now if the connection to use is a UNIX domain socket. > Since all actions are done remotely, the working directory for monetdb > doesn't matter at all. > > Solaris: > defined sun_path = 108 > max sun_path = 1024 > > FreeBSD 8.0: > defined sun_path = 104 > max sun_path = 254 > > Fedora 11: > defined sun_path = 108 > max sun_path = 108 > > AIX 6.1: > defined sun_path = 1023 > max sun_path = 1023 > > > diffs (120 lines): > > diff -r a6e4cb66bb13 -r 986a0834e2fe > sql/src/backends/monet5/merovingian/ChangeLog.Jun2010 > --- a/sql/src/backends/monet5/merovingian/ChangeLog.Jun2010 Mon Jul 26 > 11:19:01 2010 +0200 > +++ b/sql/src/backends/monet5/merovingian/ChangeLog.Jun2010 Mon Jul 26 > 11:38:04 2010 +0200 > @@ -1,6 +1,10 @@ > # ChangeLog file for sql/src/backends/monet5/merovingian > # This file is updated with mchangelog > > + 26 Jul 2010; Fabian Groffen <[email protected]> merovingian.c, monetdb.c: > + On installs with (very) long prefixes, the UNIX domain sockets could get > + truncated, causing merovingian to become unavailable to monetdb and > mclient. > + > 21 Jul 2010; Fabian Groffen <[email protected]> merovingian.c: > Really shutdown when an argument to merovingian was given, instead of > ending up in some inconsistent state. This solves all weird behaviour > diff -r a6e4cb66bb13 -r 986a0834e2fe > sql/src/backends/monet5/merovingian/merovingian.c > --- a/sql/src/backends/monet5/merovingian/merovingian.c Mon Jul 26 > 11:19:01 2010 +0200 > +++ b/sql/src/backends/monet5/merovingian/merovingian.c Mon Jul 26 > 11:38:04 2010 +0200 > @@ -425,8 +425,9 @@ > str dbfarm, pidfilename; > str p, prefix; > FILE *cnf = NULL, *pidfile = NULL; > + char *control_usock; > + char *mapi_usock; > char buf[1024]; > - char bufu[1024]; > dpair d = NULL; > int pfd[2]; > int retfd = -1; > @@ -593,7 +594,7 @@ > } > > /* where is the mserver5 binary we fork on demand? */ > - snprintf(buf, 1023, "%s/bin/mserver5", prefix); > + snprintf(buf, sizeof(buf), "%s/bin/mserver5", prefix); > _mero_mserver = alloca(sizeof(char) * (strlen(buf) + 1)); > memcpy(_mero_mserver, buf, strlen(buf) + 1); > /* exit early if this is not going to work well */ > @@ -912,20 +913,20 @@ > Mfprintf(stdout, "monitoring dbfarm %s\n", dbfarm); > > SABAOTHinit(dbfarm, NULL); > + GDKfree(dbfarm); > > /* set up control channel path */ > - snprintf(buf, 1024, "%s/.merovingian_control", dbfarm); > - unlink(buf); > - snprintf(bufu, 1024, "%s/mapi_socket", dbfarm); > - unlink(bufu); > - GDKfree(dbfarm); > + control_usock = ".merovingian_control"; > + unlink(control_usock); > + mapi_usock = "mapi_socket"; > + unlink(mapi_usock); > > /* open up connections */ > if ( > (e = openConnectionTCP(&sock, _mero_port, stdout)) == > NO_ERR && > - (e = openConnectionUNIX(&socku, bufu, 0, stdout)) == > NO_ERR && > + (e = openConnectionUNIX(&socku, mapi_usock, 0, stdout)) > == NO_ERR && > (e = openConnectionUDP(&usock, discoveryport)) == > NO_ERR && > - (e = openConnectionUNIX(&unsock, buf, S_IRWXO, > _mero_ctlout)) == NO_ERR && > + (e = openConnectionUNIX(&unsock, control_usock, > S_IRWXO, _mero_ctlout)) == NO_ERR && > (_mero_controlport == 0 || (e = > openConnectionTCP(&csock, _mero_controlport, _mero_ctlout)) == NO_ERR) > ) > { > @@ -992,12 +993,12 @@ > } > > /* control channel is already closed at this point */ > - if (unlink(buf) == -1) > + if (unlink(control_usock) == -1) > Mfprintf(stderr, "unable to unlink control socket '%s': %s\n", > - buf, strerror(errno)); > - if (unlink(bufu) == -1) > + control_usock, strerror(errno)); > + if (unlink(mapi_usock) == -1) > Mfprintf(stderr, "unable to unlink mapi socket '%s': %s\n", > - bufu, strerror(errno)); > + mapi_usock, strerror(errno)); > > if (e != NO_ERR) { > /* console */ > diff -r a6e4cb66bb13 -r 986a0834e2fe > sql/src/backends/monet5/merovingian/monetdb.c > --- a/sql/src/backends/monet5/merovingian/monetdb.c Mon Jul 26 11:19:01 > 2010 +0200 > +++ b/sql/src/backends/monet5/merovingian/monetdb.c Mon Jul 26 11:38:04 > 2010 +0200 > @@ -76,7 +76,6 @@ > > static str dbfarm = NULL; > static int mero_running = 0; > -static char mero_control[8096]; > static char *mero_host = NULL; > static int mero_port = -1; > static char *mero_pass = NULL; > @@ -1366,10 +1365,6 @@ > mero_running = 0; > } > > - /* set path to control channel */ > - snprintf(mero_control, sizeof(mero_control), > - "%s/.merovingian_control", dbfarm); > - > /* Start handling the arguments. > * monetdb [monetdb_options] command [options] [database [...]] > * this means we first scout for monetdb_options which stops as soon > @@ -1487,8 +1482,13 @@ > } > > /* use UNIX socket if no hostname given */ > - if (mero_host == NULL) > - mero_host = mero_control; > + if (mero_host == NULL) { > + /* avoid overrunning the sun_path buffer by moving into the > + * directory where the UNIX socket resides (sun_path is > + * typically around 108 chars long) */ > + chdir(dbfarm); > + mero_host = ".merovingian_control"; > + } > > /* handle regular commands */ > if (strcmp(argv[i], "create") == 0) { > _______________________________________________ > Checkin-list mailing list > [email protected] > http://mail.monetdb.org/mailman/listinfo/checkin-list > -- | Dr. Stefan Manegold | mailto:[email protected] | | CWI, P.O.Box 94079 | http://www.cwi.nl/~manegold/ | | 1090 GB Amsterdam | Tel.: +31 (20) 592-4212 | | The Netherlands | Fax : +31 (20) 592-4199 | _______________________________________________ Checkin-list mailing list [email protected] http://mail.monetdb.org/mailman/listinfo/checkin-list
