Commit 1ccba69c authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Move also the fall-back director to the VMOD

parent ed1836b8
......@@ -46,13 +46,17 @@ client c1 {
} -run
varnish v1 -vcl {
director baz round-robin {
{ .backend = {
.host = "${bad_ip}"; .port = "9080";
} }
import directors from "${topbuild}/lib/libvmod_directors/.libs/libvmod_directors.so" ;
backend b1 {
.host = "${bad_ip}"; .port = "9080";
}
sub vcl_init {
new baz = directors.round_robin();
baz.add_backend(b1);
}
sub vcl_recv {
set req.backend = baz.backend();
error 200 "ok";
}
......
......@@ -23,15 +23,18 @@ server s4 {
varnish v1 -vcl+backend {
director batman round-robin {
{ .backend = s1; }
{ .backend = s2; }
{ .backend = s3; }
{ .backend = s4; }
import directors from "${topbuild}/lib/libvmod_directors/.libs/libvmod_directors.so" ;
sub vcl_init {
new batman = directors.round_robin();
batman.add_backend(s1);
batman.add_backend(s2);
batman.add_backend(s3);
batman.add_backend(s4);
}
sub vcl_recv {
set req.backend = batman;
set req.backend = batman.backend();
}
} -start
......
......@@ -15,32 +15,25 @@ server s3 {
txresp -hdr "Foo: 3"
} -start
varnish v1 -vcl {
backend b1 {
.host = "${s1_addr}";
.port = "${s1_port}";
}
backend b2 {
.host = "${s2_addr}";
.port = "${s2_port}";
}
backend b3 {
.host = "${s3_addr}";
.port = "${s3_port}";
}
director f1 fallback {
{ .backend = b1; }
{ .backend = b2; }
{ .backend = b3; }
}
varnish v1 -vcl+backend {
import directors from "${topbuild}/lib/libvmod_directors/.libs/libvmod_directors.so" ;
sub vcl_init {
new fb1 = directors.fall_back();
fb1.add_backend(s1);
fb1.add_backend(s2);
fb1.add_backend(s3);
}
sub vcl_recv {
set req.backend = f1;
set req.backend = fb1.backend();
return (pass);
}
} -start
varnish v1 -cliok "backend.set_health b1 sick"
varnish v1 -cliok "backend.set_health b2 sick"
varnish v1 -cliok "backend.set_health s1 sick"
varnish v1 -cliok "backend.set_health s2 sick"
client c1 {
# s1 & s2 are both sick, expect response from s3
......@@ -49,7 +42,7 @@ client c1 {
expect resp.http.foo == "3"
} -run
varnish v1 -cliok "backend.set_health b2 healthy"
varnish v1 -cliok "backend.set_health s2 healthy"
client c1 {
txreq
......@@ -57,7 +50,7 @@ client c1 {
expect resp.http.foo == "2"
} -run
varnish v1 -cliok "backend.set_health b1 healthy"
varnish v1 -cliok "backend.set_health s1 healthy"
client c1 {
txreq
......
......@@ -16,6 +16,7 @@ libvmod_directors_la_LDFLAGS = $(AM_LDFLAGS) -module -export-dynamic -avoid-vers
libvmod_directors_la_SOURCES = \
vdir.c \
vdir.h \
fall_back.c \
round_robin.c
nodist_libvmod_directors_la_SOURCES = \
......
/*-
* Copyright (c) 2013 Varnish Software AS
* All rights reserved.
*
* Author: Poul-Henning Kamp <phk@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include "config.h"
#include <stdlib.h>
#include "cache/cache.h"
#include "cache/cache_backend.h"
#include "vrt.h"
#include "vcc_if.h"
#include "vdir.h"
struct vmod_directors_fall_back {
unsigned magic;
#define VMOD_DIRECTORS_FALL_BACK_MAGIC 0xad4e26ba
struct vdir *vd;
};
static unsigned __match_proto__(vdi_healthy)
vmod_rr_healthy(const struct director *dir, const struct req *req)
{
struct vmod_directors_fall_back *rr;
CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_FALL_BACK_MAGIC);
return (vdir_any_healthy(rr->vd, req));
}
static struct vbc * __match_proto__(vdi_getfd_f)
vmod_rr_getfd(const struct director *dir, struct req *req)
{
struct vmod_directors_fall_back *rr;
unsigned u;
VCL_BACKEND be = NULL;
CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_FALL_BACK_MAGIC);
vdir_lock(rr->vd);
for (u = 0; u < rr->vd->n_backend; u++) {
be = rr->vd->backend[u];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
if (be->healthy(be, req))
break;
}
vdir_unlock(rr->vd);
if (u == rr->vd->n_backend || be == NULL)
return (NULL);
return (be->getfd(be, req));
}
VCL_VOID __match_proto__()
vmod_fall_back__init(struct req *req, struct vmod_directors_fall_back **rrp,
const char *vcl_name)
{
struct vmod_directors_fall_back *rr;
AZ(req);
AN(rrp);
AZ(*rrp);
ALLOC_OBJ(rr, VMOD_DIRECTORS_FALL_BACK_MAGIC);
AN(rr);
*rrp = rr;
vdir_new(&rr->vd, vcl_name, vmod_rr_healthy, vmod_rr_getfd, rr);
}
VCL_VOID __match_proto__()
vmod_fall_back__fini(struct req *req, struct vmod_directors_fall_back **rrp)
{
struct vmod_directors_fall_back *rr;
AZ(req);
rr = *rrp;
*rrp = NULL;
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_FALL_BACK_MAGIC);
vdir_delete(&rr->vd);
FREE_OBJ(rr);
}
VCL_VOID __match_proto__()
vmod_fall_back_add_backend(struct req *req,
struct vmod_directors_fall_back *rr, VCL_BACKEND be)
{
(void)req;
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_FALL_BACK_MAGIC);
(void)vdir_add_backend(rr->vd, be, 0.0);
}
VCL_BACKEND __match_proto__()
vmod_fall_back_backend(struct req *req, struct vmod_directors_fall_back *rr)
{
(void)req;
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_FALL_BACK_MAGIC);
return (rr->vd->dir);
}
......@@ -77,7 +77,7 @@ vmod_rr_getfd(const struct director *dir, struct req *req)
return (be->getfd(be, req));
}
VCL_VOID
VCL_VOID __match_proto__()
vmod_round_robin__init(struct req *req, struct vmod_directors_round_robin **rrp,
const char *vcl_name)
{
......@@ -92,7 +92,7 @@ vmod_round_robin__init(struct req *req, struct vmod_directors_round_robin **rrp,
vdir_new(&rr->vd, vcl_name, vmod_rr_healthy, vmod_rr_getfd, rr);
}
VCL_VOID
VCL_VOID __match_proto__()
vmod_round_robin__fini(struct req *req, struct vmod_directors_round_robin **rrp)
{
struct vmod_directors_round_robin *rr;
......@@ -105,14 +105,14 @@ vmod_round_robin__fini(struct req *req, struct vmod_directors_round_robin **rrp)
FREE_OBJ(rr);
}
VCL_VOID
VCL_VOID __match_proto__()
vmod_round_robin_add_backend(struct req *req,
struct vmod_directors_round_robin *rr, VCL_BACKEND be)
{
(void)req;
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC);
vdir_add_backend(rr->vd, be, 0.0);
(void)vdir_add_backend(rr->vd, be, 0.0);
}
VCL_BACKEND __match_proto__()
......
......@@ -31,3 +31,8 @@ Object round_robin() {
Method VOID .add_backend(BACKEND)
Method BACKEND .backend()
}
Object fall_back() {
Method VOID .add_backend(BACKEND)
Method BACKEND .backend()
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment