]> err.no Git - varnish/commitdiff
Add a convenience function more for backend methods:
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Thu, 20 Sep 2007 08:22:59 +0000 (08:22 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Thu, 20 Sep 2007 08:22:59 +0000 (08:22 +0000)
VBE_CheckFd(): Check that a filedescriptor is reusable.

Right now we simply poll it with a zero timeout, and if there are
any events, we can't reuse it.

This check may need refinement down the road.

One option would be to attempt to write a CRNL onto the fd and see
that it works.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1965 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_backend.c

index 0c3e1f61ba9ff87323c27b405f47c10b04613f81..347260fe6b3ff9c5d283da46af32ac787812c61e 100644 (file)
@@ -400,7 +400,10 @@ struct backend *VBE_NewBackend(struct backend_method *method);
 struct vbe_conn *VBE_NewConn(void);
 void VBE_ReleaseConn(struct vbe_conn *);
 void VBE_UpdateHealth(struct sess *sp, struct vbe_conn *, int);
+
+/* convenience functions for backend methods */
 int VBE_TryConnect(struct sess *sp, struct addrinfo *ai);
+int VBE_CheckFd(int fd);
 
 /* cache_backend_simple.c */
 extern struct backend_method   backend_method_simple;
index da8ecc1c2b341ac8ac73059a03baa7a9beb9b887..cdf34fa70155eff15e7e1f4cf7ef62724dd3329e 100644 (file)
@@ -35,6 +35,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <poll.h>
 
 #include <sys/socket.h>
 #include <netdb.h>
@@ -106,7 +107,22 @@ VBE_TryConnect(struct sess *sp, struct addrinfo *ai)
        return (s);
 }
 
+/*--------------------------------------------------------------------
+ * Check that there is still something at the far end of a given fd.
+ * We poll the fd with instant timeout, if there are any events we can't
+ * use it (backends are not allowed to pipeline).
+ */
+
+int
+VBE_CheckFd(int fd)
+{
+       struct pollfd pfd;
 
+       pfd.fd = fd;
+       pfd.events = POLLIN;
+       pfd.revents = 0;
+       return(poll(&pfd, 1, 0) == 0);
+}
 
 /*--------------------------------------------------------------------
  * Get a http structure for talking to the backend.