[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