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