Commit d8ad2bae authored by Nils Goroll's avatar Nils Goroll

better approximation of change time

parent 3aa55b1d
......@@ -36,6 +36,7 @@
#include <cache/cache_director.h>
#include <vcl.h>
#include <vrt.h>
#include <vtim.h>
#include "vcc_all_healthy_if.h"
......@@ -220,25 +221,53 @@ static VCL_BACKEND vmod_director_resolve(VCL_BACKEND b, struct worker *w,
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(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_BOOL br, r = 1;
VCL_TIME bt, tt[2];
VCL_BACKEND be;
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++) {
be = d->consider[i];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
r &= be->healthy(be, bo, &bt);
if (t && bt > *t)
*t = bt;
br = !!be->healthy(be, bo, &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