[master] 9aab053 Add a proof-of-concept round-robin director as a VMOD object
Poul-Henning Kamp
phk at varnish-cache.org
Wed Mar 6 20:58:56 CET 2013
commit 9aab053b96f4373c519bb228988430601357db06
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Mar 6 19:58:40 2013 +0000
Add a proof-of-concept round-robin director as a VMOD object
diff --git a/bin/varnishtest/tests/m00009.vtc b/bin/varnishtest/tests/m00009.vtc
new file mode 100644
index 0000000..b81f07e
--- /dev/null
+++ b/bin/varnishtest/tests/m00009.vtc
@@ -0,0 +1,69 @@
+varnishtest "Test vmod.debug round robin director"
+
+
+server s1 {
+ rxreq
+ txresp -body "1"
+} -start
+
+server s2 {
+ rxreq
+ txresp -body "22"
+} -start
+
+
+server s3 {
+ rxreq
+ txresp -body "333"
+} -start
+
+server s4 {
+ rxreq
+ txresp -body "4444"
+} -start
+
+
+varnish v1 -vcl+backend {
+
+ import debug from "${topbuild}/lib/libvmod_debug/.libs/libvmod_debug.so" ;
+ sub vcl_init {
+ new rr = debug.rr();
+ rr.add_backend(s1);
+ rr.add_backend(s2);
+ rr.add_backend(s3);
+ rr.add_backend(s4);
+ }
+
+ sub vcl_recv {
+ set req.backend = rr.select();
+ }
+} -start
+
+client c1 {
+ timeout 3
+ txreq -url "/foo1"
+ rxresp
+ expect resp.bodylen == 1
+ txreq -url "/foo2"
+ rxresp
+ expect resp.bodylen == 2
+ txreq -url "/foo3"
+ rxresp
+ expect resp.bodylen == 3
+ txreq -url "/foo4"
+ rxresp
+ expect resp.bodylen == 4
+} -run
+
+server s1 -start
+server s2 -start
+
+client c2 {
+ timeout 3
+ txreq -url "/foo11"
+ rxresp
+ expect resp.bodylen == 1
+ txreq -url "/foo22"
+ rxresp
+ expect resp.bodylen == 2
+} -run
diff --git a/lib/libvmod_debug/vmod.vcc b/lib/libvmod_debug/vmod.vcc
index 57d8721..97d5f5e 100644
--- a/lib/libvmod_debug/vmod.vcc
+++ b/lib/libvmod_debug/vmod.vcc
@@ -35,3 +35,8 @@ Object obj(STRING) {
Method STRING .foo(STRING why)
Method TIME .date()
}
+
+Object rr() {
+ Method VOID .add_backend(BACKEND)
+ Method BACKEND .select()
+}
diff --git a/lib/libvmod_debug/vmod_debug_obj.c b/lib/libvmod_debug/vmod_debug_obj.c
index d44e634..3ec94e1 100644
--- a/lib/libvmod_debug/vmod_debug_obj.c
+++ b/lib/libvmod_debug/vmod_debug_obj.c
@@ -86,3 +86,86 @@ vmod_obj_date(struct req *req, struct vmod_debug_obj *o)
assert(o->foobar == 42);
return (21.4);
}
+
+/*----------------------------------------------------------------------*/
+
+struct vmod_debug_rr_entry {
+ unsigned magic;
+#define VMOD_DEBUG_RR_ENTRY_MAGIC 0xa80970cf
+ VTAILQ_ENTRY(vmod_debug_rr_entry) list;
+ VCL_BACKEND be;
+};
+
+struct vmod_debug_rr {
+ unsigned magic;
+#define VMOD_DEBUG_RR_MAGIC 0x99f4b726
+ VTAILQ_HEAD(, vmod_debug_rr_entry) listhead;
+ pthread_mutex_t mtx;
+};
+
+VCL_VOID
+vmod_rr__init(struct req *req, struct vmod_debug_rr **rrp)
+{
+ struct vmod_debug_rr *rr;
+
+ (void)req;
+
+ AN(rrp);
+ AZ(*rrp);
+ ALLOC_OBJ(rr, VMOD_DEBUG_RR_MAGIC);
+ AN(rr);
+ *rrp = rr;
+ AZ(pthread_mutex_init(&rr->mtx, NULL));
+ VTAILQ_INIT(&rr->listhead);
+}
+
+VCL_VOID
+vmod_rr__fini(struct req *req, struct vmod_debug_rr **rrp)
+{
+ struct vmod_debug_rr *rr;
+ struct vmod_debug_rr_entry *ep;
+
+ (void)req;
+
+ rr = *rrp;
+ *rrp = NULL;
+ CHECK_OBJ_NOTNULL(rr, VMOD_DEBUG_RR_MAGIC);
+
+ AZ(pthread_mutex_destroy(&rr->mtx));
+ while (!VTAILQ_EMPTY(&rr->listhead)) {
+ ep = VTAILQ_FIRST(&rr->listhead);
+ VTAILQ_REMOVE(&rr->listhead, ep, list);
+ FREE_OBJ(ep);
+ }
+ FREE_OBJ(*rrp);
+}
+
+VCL_VOID
+vmod_rr_add_backend(struct req *req, struct vmod_debug_rr * rr, VCL_BACKEND be)
+{
+ struct vmod_debug_rr_entry *ep;
+ (void)req;
+
+ ALLOC_OBJ(ep, VMOD_DEBUG_RR_ENTRY_MAGIC);
+ AN(ep);
+ ep->be = be;
+ AZ(pthread_mutex_lock(&rr->mtx));
+ VTAILQ_INSERT_TAIL(&rr->listhead, ep, list);
+ AZ(pthread_mutex_unlock(&rr->mtx));
+}
+
+VCL_BACKEND
+vmod_rr_select(struct req *req, struct vmod_debug_rr *rr)
+{
+ struct vmod_debug_rr_entry *ep;
+
+ (void)req;
+
+ CHECK_OBJ_NOTNULL(rr, VMOD_DEBUG_RR_MAGIC);
+ AZ(pthread_mutex_lock(&rr->mtx));
+ ep = VTAILQ_FIRST(&rr->listhead);
+ VTAILQ_REMOVE(&rr->listhead, ep, list);
+ VTAILQ_INSERT_TAIL(&rr->listhead, ep, list);
+ AZ(pthread_mutex_unlock(&rr->mtx));
+ return (ep->be);
+}
More information about the varnish-commit
mailing list