Commit b2d026a9 authored by Nils Goroll's avatar Nils Goroll

backport to 4.1

parent c4e698e9
......@@ -18,7 +18,7 @@ AC_ARG_WITH([rst2man],
[RST2MAN="$withval"],
AC_CHECK_PROGS(RST2MAN, [rst2man rst2man.py], []))
VARNISH_PREREQ([5.2.0])
VARNISH_PREREQ([4.1.0], [4.2.0])
VARNISH_VMODS([all_healthy])
AC_CONFIG_FILES([
......
......@@ -33,10 +33,39 @@
#include <stdlib.h> // free/calloc
#include <cache/cache.h>
#include <cache/cache_director.h>
#include <vcl.h>
#include <vrt.h>
#include "vcc_all_healthy_if.h"
/* ------------------------------------------------------------
* compat
*/
VCL_VOID
VRT_fail(VRT_CTX, const char *fmt, ...)
{
va_list ap;
assert(ctx->vsl != NULL || ctx->msg != NULL);
AZ(strchr(fmt, '\n'));
va_start(ap, fmt);
if (ctx->vsl != NULL)
VSLbv(ctx->vsl, SLT_VCL_Error, fmt, ap);
else {
VSB_vprintf(ctx->msg, fmt, ap);
VSB_putc(ctx->msg, '\n');
}
va_end(ap);
VRT_handling(ctx, VCL_RET_FAIL);
}
/* ------------------------------------------------------------
* director
*/
struct vmod_all_healthy_director {
unsigned magic;
#define VMOD_ALL_HEALTHY_DIRECTOR_MAGIC 0x0d8790a3
......@@ -47,22 +76,16 @@ struct vmod_all_healthy_director {
VCL_BACKEND *consider;
};
static VCL_BACKEND vmod_director_resolve(VRT_CTX, VCL_BACKEND);
static VCL_BOOL vmod_director_healthy(VRT_CTX, VCL_BACKEND, VCL_TIME *);
static const struct vdi_methods vmod_director_methods[1] = {
{
.magic = VDI_METHODS_MAGIC,
.type = "all_healthy",
.resolve = vmod_director_resolve,
.healthy = vmod_director_healthy,
}
};
static VCL_BACKEND vmod_director_resolve(VCL_BACKEND, struct worker *,
struct busyobj *);
static VCL_BOOL vmod_director_healthy(VCL_BACKEND, const struct busyobj *,
VCL_TIME *);
VCL_VOID
vmod_director__init(VRT_CTX,
struct vmod_all_healthy_director **dp, const char *vcl_name)
{
struct director *dir;
struct vmod_all_healthy_director *d;
const int spc = 4;
......@@ -79,11 +102,19 @@ vmod_director__init(VRT_CTX,
goto fail_consider;
}
d->spcconsider = spc;
d->dir = VRT_AddDirector(ctx, vmod_director_methods, d, "%s", vcl_name);
if (d->dir == NULL) {
VRT_fail(ctx, "AddDirector failed");
ALLOC_OBJ(dir, DIRECTOR_MAGIC);
if (dir == NULL) {
VRT_fail(ctx, "director alloc failed");
goto fail_dir;
}
dir->name = "all_healthy";
REPLACE(dir->vcl_name, vcl_name);
dir->priv = d;
dir->healthy = vmod_director_healthy;
dir->resolve = vmod_director_resolve;
d->dir = dir;
*dp = d;
return;
......@@ -102,7 +133,9 @@ vmod_director__fini(struct vmod_all_healthy_director **dp) {
if (d == NULL)
return;
CHECK_OBJ(d, VMOD_ALL_HEALTHY_DIRECTOR_MAGIC);
VRT_DelDirector(&d->dir);
free(TRUST_ME(d->dir->vcl_name));
free(TRUST_ME(d->dir));
free(TRUST_ME(d->consider));
FREE_OBJ(d);
}
......@@ -175,29 +208,34 @@ vmod_director_backend(VRT_CTX, struct vmod_all_healthy_director *d)
return (d->dir);
}
static VCL_BACKEND vmod_director_resolve(VRT_CTX, VCL_BACKEND b)
static VCL_BACKEND vmod_director_resolve(VCL_BACKEND b, struct worker *w,
struct busyobj *bo)
{
struct vmod_all_healthy_director *d;
CAST_OBJ_NOTNULL(d, b->priv, VMOD_ALL_HEALTHY_DIRECTOR_MAGIC);
(void) w;
(void) b;
return (d->backend);
}
static VCL_BOOL
vmod_director_healthy(VRT_CTX, VCL_BACKEND b, VCL_TIME *t)
vmod_director_healthy(VCL_BACKEND b, const struct busyobj *bo,
VCL_TIME *t)
{
struct vmod_all_healthy_director *d;
int i;
VCL_BOOL r = 1;
VCL_TIME bt;
VCL_BACKEND be;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CAST_OBJ_NOTNULL(d, b->priv, VMOD_ALL_HEALTHY_DIRECTOR_MAGIC);
for (i = 0; i < d->nconsider; i++) {
CHECK_OBJ_NOTNULL(d->consider[i], DIRECTOR_MAGIC);
r &= VRT_Healthy(ctx, d->consider[i], &bt);
be = d->consider[i];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
r &= be->healthy(be, bo, &bt);
if (t && bt > *t)
*t = bt;
}
......
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