VCL_BOOL vdir_any_healthy(VRT_CTX, struct vdir *vd, VCL_TIME *changed) { unsigned retval = 0; VCL_BACKEND be; unsigned u; vtim_real c; CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); vdir_rdlock(vd); if (changed != NULL) *changed = 0; for (u = 0; u < vd->n_backend; u++) { be = vd->backend[u]; CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC); retval = VRT_Healthy(ctx, be, &c); if (changed != NULL && c > *changed) *changed = c; if (retval) break; } vdir_unlock(vd); return (retval); }
unsigned vdir_any_healthy(struct vdir *vd, const struct busyobj *bo, double *changed) { unsigned retval = 0; VCL_BACKEND be; unsigned u; double c; CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC); vdir_rdlock(vd); if (changed != NULL) *changed = 0; for (u = 0; u < vd->n_backend; u++) { be = vd->backend[u]; CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC); retval = be->healthy(be, bo, &c); if (changed != NULL && c > *changed) *changed = c; if (retval) break; } vdir_unlock(vd); return (retval); }
void vdir_list(VRT_CTX, struct vdir *vd, struct vsb *vsb, int pflag, int jflag, int weight) { VCL_BACKEND be; VCL_BOOL h; unsigned u, nh; double w; CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); if (pflag) { if (jflag) { VSB_cat(vsb, "{\n"); VSB_indent(vsb, 2); if (weight) VSB_printf(vsb, "\"total_weight\": %f,\n", vd->total_weight); VSB_cat(vsb, "\"backends\": {\n"); VSB_indent(vsb, 2); } else { VSB_cat(vsb, "\n\n\tBackend\tWeight\tHealth\n"); } } vdir_rdlock(vd); vdir_update_health(ctx, vd); for (u = 0; pflag && u < vd->n_backend; u++) { be = vd->backend[u]; CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC); h = vbit_test(vd->healthy, u); w = h ? vd->weight[u] : 0.0; if (jflag) { if (u) VSB_cat(vsb, ",\n"); VSB_printf(vsb, "\"%s\": {\n", be->vcl_name); VSB_indent(vsb, 2); if (weight) VSB_printf(vsb, "\"weight\": %f,\n", w); if (h) VSB_cat(vsb, "\"health\": \"healthy\"\n"); else VSB_cat(vsb, "\"health\": \"sick\"\n"); VSB_indent(vsb, -2); VSB_cat(vsb, "}"); } else { VSB_cat(vsb, "\t"); VSB_cat(vsb, be->vcl_name); if (weight) VSB_printf(vsb, "\t%6.2f%%\t", 100 * w / vd->total_weight); else VSB_cat(vsb, "\t-\t"); VSB_cat(vsb, h ? "healthy" : "sick"); VSB_cat(vsb, "\n"); } } nh = vd->n_healthy; u = vd->n_backend; vdir_unlock(vd); if (jflag && (pflag)) { VSB_cat(vsb, "\n"); VSB_indent(vsb, -2); VSB_cat(vsb, "}\n"); VSB_indent(vsb, -2); VSB_cat(vsb, "},\n"); } if (pflag) return; if (jflag) VSB_printf(vsb, "[%u, %u, \"%s\"]", nh, u, nh ? "healthy" : "sick"); else VSB_printf(vsb, "%u/%u\t%s", nh, u, nh ? "healthy" : "sick"); }