From 89f90012893b9c7f6ef4fac116ccb827f9838d3d Mon Sep 17 00:00:00 2001 From: phk Date: Mon, 8 Oct 2007 07:19:52 +0000 Subject: [PATCH] Try to make the pipe code even more robust git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2080 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_pipe.c | 55 +++++++++++++------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_pipe.c b/varnish-cache/bin/varnishd/cache_pipe.c index 5e36d172..14913dc7 100644 --- a/varnish-cache/bin/varnishd/cache_pipe.c +++ b/varnish-cache/bin/varnishd/cache_pipe.c @@ -42,30 +42,25 @@ #include "heritage.h" #include "cache.h" -static void -rdf(struct pollfd *fds, int idx, int fd0, int fd1) +static int +rdf(int fd0, int fd1) { int i, j; char buf[BUFSIZ], *p; - i = read(fds[idx].fd, buf, sizeof buf); - if (i <= 0 || fds[1-idx].events == 0) { - AZ(shutdown(fd0, SHUT_RD)); - AZ(shutdown(fd1, SHUT_WR)); - fds[idx].fd = -1; - fds[idx].events = 0; - return; - } + i = read(fd0, buf, sizeof buf); + if (i <= 0) + return (1); for (p = buf; i > 0; i -= j, p += j) { - j = write(fds[1-idx].fd, p, i); - if (j != i) { - AZ(shutdown(fd0, SHUT_RD)); - AZ(shutdown(fd1, SHUT_WR)); - fds[idx].fd = -1; - fds[idx].events = 0; - return; + j = write(fd1, p, i); + if (j <= 0) + return (1); + if (i != j) { + printf("flunk %d %d\n", i, j); + usleep(100000); /* XXX hack */ } } + return (0); } void @@ -110,24 +105,32 @@ PipeSession(struct sess *sp) fds[1].fd = sp->fd; fds[1].events = POLLIN | POLLERR; - while (fds[0].events || fds[1].events) { + while (fds[0].fd > -1 || fds[1].fd > -1) { fds[0].revents = 0; fds[1].revents = 0; i = poll(fds, 2, params->pipe_timeout * 1000); if (i < 1) break; - if (fds[0].revents) - rdf(fds, 0, vc->fd, sp->fd); - if (fds[1].revents) - rdf(fds, 1, sp->fd, vc->fd); + if (fds[0].revents && rdf(vc->fd, sp->fd)) { + AZ(shutdown(vc->fd, SHUT_RD)); + AZ(shutdown(sp->fd, SHUT_WR)); + fds[0].events = 0; + fds[0].fd = -1; + } + if (fds[1].revents && rdf(sp->fd, vc->fd)) { + AZ(shutdown(sp->fd, SHUT_RD)); + AZ(shutdown(vc->fd, SHUT_WR)); + fds[1].events = 0; + fds[1].fd = -1; + } } if (fds[0].fd >= 0) { - AZ(shutdown(fds[0].fd, SHUT_RD)); - AZ(shutdown(fds[1].fd, SHUT_WR)); + AZ(shutdown(vc->fd, SHUT_RD)); + AZ(shutdown(sp->fd, SHUT_WR)); } if (fds[1].fd >= 0) { - AZ(shutdown(fds[1].fd, SHUT_RD)); - AZ(shutdown(fds[0].fd, SHUT_WR)); + AZ(shutdown(sp->fd, SHUT_RD)); + AZ(shutdown(vc->fd, SHUT_WR)); } vca_close_session(sp, "pipe"); VBE_ClosedFd(sp->wrk, vc); -- 2.39.5