Commit 52e381f3 authored by Nils Goroll's avatar Nils Goroll

better approximation of change time

parent 77b6ce82
......@@ -34,6 +34,7 @@
#include <cache/cache.h>
#include <vcl.h>
#include <vtim.h>
#include "vcc_all_healthy_if.h"
......@@ -184,23 +185,50 @@ static VCL_BACKEND vmod_director_resolve(VRT_CTX, VCL_BACKEND b)
return (d->backend);
}
/*
* we can only approximate the change time for the unhealthy case because we do
* not have the full record: consider all backends healthy, a goes down, then b,
* a comes back up: we would need to record the time a went down initially. We
* approximate by returning the time b went down, so:
*
* - unhealthy: earliest change of unhealthy backend
* - healthy: latest change of healthy backend
*/
static VCL_BOOL
vmod_director_healthy(VRT_CTX, VCL_BACKEND b, VCL_TIME *t)
{
struct vmod_all_healthy_director *d;
int i;
VCL_BOOL r = 1;
VCL_TIME bt;
VCL_BOOL br, r = 1;
VCL_TIME bt, tt[2];
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CAST_OBJ_NOTNULL(d, b->priv, VMOD_ALL_HEALTHY_DIRECTOR_MAGIC);
if (t) {
tt[0] = VTIM_real();
tt[1] = 0.0;
}
for (i = 0; i < d->nconsider; i++) {
CHECK_OBJ_NOTNULL(d->consider[i], DIRECTOR_MAGIC);
r &= VRT_Healthy(ctx, d->consider[i], &bt);
if (t && bt > *t)
*t = bt;
br = !!VRT_Healthy(ctx, d->consider[i], &bt);
r &= br;
if (t) {
if (r && br) {
if (bt > tt[1])
tt[1] = bt;
} else if (! br) {
if (bt < tt[0])
tt[0] = bt;
}
}
}
assert(r == 0 || r == 1);
if (t)
*t = tt[r];
return (r);
}
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