Changeset: f80821907c58 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f80821907c58
Modified Files:
        tools/merovingian/daemon/controlrunner.c
        tools/merovingian/daemon/discoveryrunner.c
        tools/merovingian/daemon/multiplex-funnel.c
        tools/merovingian/daemon/peering.c
Branch: Apr2011
Log Message:

merovingian: don't attempt to read after a failed select call

Actual cause of monetdbd hang on shutdown on FreeBSD found after a day
of debugging.  On FreeBSD the select gets EINTR on a delivered signal,
but a read from a closed socket will just hang, unlike on Darwin,
Solaris and Linux.  Hence, make sure we don't attempt to read when
select fails, as it's likely to be EINTR when it fails.


diffs (48 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
@@ -106,7 +106,7 @@
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        retval = select(msgsock + 1, &fds, NULL, NULL, &tv);
-       if (retval == 0) {
+       if (retval <= 0) {
                /* nothing interesting has happened */
                return(-2);
        }
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
@@ -402,7 +402,7 @@
                tv.tv_sec = 5;
                tv.tv_usec = 0;
                nread = select(sock + 1, &fds, NULL, NULL, &tv);
-               if (nread == 0) {
+               if (nread <= 0) {  /* assume only failure is EINTR */
                        /* nothing interesting has happened */
                        buf[0] = '\0';
                        continue;
diff --git a/tools/merovingian/daemon/multiplex-funnel.c 
b/tools/merovingian/daemon/multiplex-funnel.c
--- a/tools/merovingian/daemon/multiplex-funnel.c
+++ b/tools/merovingian/daemon/multiplex-funnel.c
@@ -544,7 +544,7 @@
                }
 
                /* nothing interesting has happened */
-               if (r == 0)
+               if (r <= 0)
                        continue;
                for (c = m->clients; c != NULL; c = c->next) {
                        if (!FD_ISSET(c->sock, &fds))
diff --git a/tools/merovingian/daemon/peering.c 
b/tools/merovingian/daemon/peering.c
--- a/tools/merovingian/daemon/peering.c
+++ b/tools/merovingian/daemon/peering.c
@@ -122,7 +122,7 @@
                tv.tv_usec = 0;
                len = select(msock + 1, &fds, NULL, NULL, &tv);
                /* nothing interesting has happened */
-               if (len == 0)
+               if (len <= 0)
                        continue;
                if (FD_ISSET(s, &fds)) {
                        /* from client, forward to our network */
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to