Changeset: 569c53e5f1a0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=569c53e5f1a0
Modified Files:
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/merovingian.h
        tools/merovingian/daemon/multiplex-funnel.c
Branch: Jun2016
Log Message:

When governed by select, only do a single read in logFD.
If "the other side" were to send exactly 8095 bytes of data, we would
attempt a second read which would hang when called from logListener.
We don't want that.  Now, if "the other side" sends something bigger
than 8095, the second read will happen after the select in logListener
will indicate that it is ok to read.


diffs (82 lines):

diff --git a/tools/merovingian/daemon/handlers.c 
b/tools/merovingian/daemon/handlers.c
--- a/tools/merovingian/daemon/handlers.c
+++ b/tools/merovingian/daemon/handlers.c
@@ -180,7 +180,7 @@ childhandler(void)
                while (p != NULL) {
                        if (p->pid == pid) {
                                /* log everything that's still in the pipes */
-                               logFD(p->out, "MSG", p->dbname, (long long 
int)p->pid, _mero_logfile);
+                               logFD(p->out, "MSG", p->dbname, (long long 
int)p->pid, _mero_logfile, 1);
                                /* remove from the list */
                                q->next = p->next;
                                /* close the descriptors */
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
@@ -126,7 +126,7 @@ confkeyval *_mero_props = NULL;
 /* funcs */
 
 inline void
-logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream)
+logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream, int 
rest)
 {
        time_t now;
        char buf[8096];
@@ -137,7 +137,7 @@ logFD(int fd, char *type, char *dbname, 
        char writeident = 1;
 
        do {
-               if ((len = read(fd, buf, 8095)) <= 0)
+               if ((len = read(fd, buf, sizeof(buf) - 1)) <= 0)
                        break;
                buf[len] = '\0';
                q = buf;
@@ -158,9 +158,9 @@ logFD(int fd, char *type, char *dbname, 
                                fprintf(stream, "%s %s %s[" LLFMT "]: ",
                                                mytime, type, dbname, pid);
                        writeident = 0;
-                       fprintf(stream, "%s", q);
+                       fprintf(stream, "%s\n", q);
                }
-       } while (len == 8095);
+       } while (rest);
        fflush(stream);
 }
 
@@ -222,10 +222,10 @@ logListener(void *x)
                        if (w->flag & 1) {
                                if (FD_ISSET(w->out, &readfds) != 0)
                                        logFD(w->out, "MSG", w->dbname,
-                                                 (long long int)w->pid, 
_mero_logfile);
+                                                 (long long int)w->pid, 
_mero_logfile, 0);
                                if (w->err != w->out && FD_ISSET(w->err, 
&readfds) != 0)
                                        logFD(w->err, "ERR", w->dbname,
-                                                 (long long int)w->pid, 
_mero_logfile);
+                                                 (long long int)w->pid, 
_mero_logfile, 0);
                                w->flag &= ~1;
                        }
                        w = w->next;
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
@@ -61,7 +61,7 @@ typedef struct _dpair {
 char *newErr(_In_z_ _Printf_format_string_ const char *fmt, ...)
        __attribute__((__format__(__printf__, 1, 2)));
 void terminateProcess(pid_t pid, char *dbname, mtype type, int lock);
-void logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream);
+void logFD(int fd, char *type, char *dbname, long long int pid, FILE *stream, 
int rest);
 
 extern char *_mero_mserver;
 extern dpair _mero_topdp;
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
@@ -807,7 +807,7 @@ multiplexThread(void *d)
        while (p != NULL) {
                if (p->type == MEROFUN && strcmp(p->dbname, m->name) == 0) {
                        /* log everything that's still in the pipes */
-                       logFD(p->out, "MSG", p->dbname, (long long int)p->pid, 
_mero_logfile);
+                       logFD(p->out, "MSG", p->dbname, (long long int)p->pid, 
_mero_logfile, 1);
                        /* remove from the list */
                        q->next = p->next;
                        /* close the descriptors */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to