[master] c5966cb Add optional sticky arg to fb director
Guillaume Quintard
guillaume at varnish-software.com
Wed Feb 1 11:09:05 CET 2017
commit c5966cb74d4a23e629409303bd31931f2c9eb261
Author: Guillaume Quintard <guillaume at varnish-software.com>
Date: Fri Jan 27 14:39:52 2017 +0100
Add optional sticky arg to fb director
diff --git a/lib/libvmod_directors/fall_back.c b/lib/libvmod_directors/fall_back.c
index 7a44938..80ea3aa 100644
--- a/lib/libvmod_directors/fall_back.c
+++ b/lib/libvmod_directors/fall_back.c
@@ -42,6 +42,8 @@ struct vmod_directors_fallback {
unsigned magic;
#define VMOD_DIRECTORS_FALLBACK_MAGIC 0xad4e26ba
struct vdir *vd;
+ VCL_BOOL st;
+ unsigned cur;
};
static unsigned __match_proto__(vdi_healthy)
@@ -66,12 +68,16 @@ vmod_fallback_resolve(const struct director *dir, struct worker *wrk,
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_FALLBACK_MAGIC);
- vdir_rdlock(rr->vd);
+ vdir_wrlock(rr->vd);
+ if (!rr->st)
+ rr->cur = 0;
for (u = 0; u < rr->vd->n_backend; u++) {
- be = rr->vd->backend[u];
+ be = rr->vd->backend[rr->cur];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
if (be->healthy(be, bo, NULL))
break;
+ if (++rr->cur == rr->vd->n_backend)
+ rr->cur = 0;
}
vdir_unlock(rr->vd);
if (u == rr->vd->n_backend)
@@ -81,7 +87,7 @@ vmod_fallback_resolve(const struct director *dir, struct worker *wrk,
VCL_VOID __match_proto__()
vmod_fallback__init(VRT_CTX,
- struct vmod_directors_fallback **rrp, const char *vcl_name)
+ struct vmod_directors_fallback **rrp, const char *vcl_name, VCL_BOOL sticky)
{
struct vmod_directors_fallback *rr;
@@ -93,6 +99,7 @@ vmod_fallback__init(VRT_CTX,
*rrp = rr;
vdir_new(&rr->vd, "fallback", vcl_name, vmod_fallback_healthy,
vmod_fallback_resolve, rr);
+ rr->st = sticky;
}
VCL_VOID __match_proto__()
@@ -123,7 +130,7 @@ vmod_fallback_remove_backend(VRT_CTX,
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(fb, VMOD_DIRECTORS_FALLBACK_MAGIC);
- vdir_remove_backend(fb->vd, be, NULL);
+ vdir_remove_backend(fb->vd, be, &fb->cur);
}
VCL_BACKEND __match_proto__()
diff --git a/lib/libvmod_directors/vmod.vcc b/lib/libvmod_directors/vmod.vcc
index c0fd1b8..cce8acb 100644
--- a/lib/libvmod_directors/vmod.vcc
+++ b/lib/libvmod_directors/vmod.vcc
@@ -95,7 +95,7 @@ Example
set req.backend_hint = vdir.backend();
-$Object fallback()
+$Object fallback(BOOL sticky = 0)
Description
Create a fallback director.
@@ -103,6 +103,10 @@ Description
A fallback director will try each of the added backends in turn,
and return the first one that is healthy.
+ If ``sticky`` is set to true, the director will keep using the healthy
+ backend, even if a higher-priority backend becomes available. Once the
+ whole backend list is exhausted, it'll start over at the beginning.
+
Example
new vdir = directors.fallback();
More information about the varnish-commit
mailing list