Quorum support
Artur Bergman
sky at crucially.net
Thu Oct 7 20:19:15 CEST 2010
Attached is a patch that implements quorum support. You specify the %
of servers that need to be up, and if less than that is up it marks
the entire director as down. This avoids the whack-a-mole problem when
bringing up servers.
Comments please.
Artur
----------
diff -u -r varnish-2.1.3/bin/varnishd/cache_dir_random.c varnish-
quorum/bin/varnishd/cache_dir_random.c
--- varnish-2.1.3/bin/varnishd/cache_dir_random.c 2010-03-24
09:44:13.000000000 +0000
+++ varnish-quorum/bin/varnishd/cache_dir_random.c 2010-10-07
18:07:37.126411696 +0000
@@ -75,6 +75,7 @@
enum crit_e criteria;
unsigned retries;
+ unsigned quorum_weight;
double tot_weight;
struct vdi_random_host *hosts;
unsigned nhosts;
@@ -155,7 +156,9 @@
if (VBE_Healthy_sp(sp, d2))
s1 += vs->hosts[i].weight;
}
-
+ if (s1 < vs->quorum_weight)
+ return (NULL);
+
if (s1 == 0.0)
return (NULL);
@@ -258,6 +261,7 @@
vh->backend = bp[te->host];
AN(vh->backend);
}
+ vs->quorum_weight = (vs->tot_weight * t->quorum / 100);
vs->nhosts = t->nmember;
bp[idx] = &vs->dir;
}
diff -u -r varnish-2.1.3/include/vrt.h varnish-quorum/include/vrt.h
--- varnish-2.1.3/include/vrt.h 2010-07-13 11:07:03.000000000 +0000
+++ varnish-quorum/include/vrt.h 2010-10-07 17:42:13.476408083 +0000
@@ -91,6 +91,7 @@
const char *name;
unsigned retries;
unsigned nmember;
+ unsigned quorum;
const struct vrt_dir_random_entry *members;
};
diff -u -r varnish-2.1.3/lib/libvcl/vcc_dir_random.c varnish-quorum/
lib/libvcl/vcc_dir_random.c
--- varnish-2.1.3/lib/libvcl/vcc_dir_random.c 2010-07-28
11:11:58.000000000 +0000
+++ varnish-quorum/lib/libvcl/vcc_dir_random.c 2010-10-07
18:01:23.526408498 +0000
@@ -55,13 +55,14 @@
struct token *t_field, *t_be;
int nelem;
struct fld_spec *fs, *mfs;
- unsigned u, retries;
+ unsigned u, retries, quorum;
const char *first;
char *p;
- fs = vcc_FldSpec(tl, "?retries", NULL);
+ fs = vcc_FldSpec(tl, "?retries","?quorum", NULL);
retries = 0;
+ quorum = 0;
while (tl->t->tok != '{') {
vcc_IsField(tl, &t_field, fs);
ERRCHK(tl);
@@ -70,6 +71,11 @@
retries = vcc_UintVal(tl);
ERRCHK(tl);
SkipToken(tl, ';');
+ } else if (vcc_IdIs(t_field, "quorum")) {
+ ExpectErr(tl, CNUM);
+ quorum = vcc_UintVal(tl);
+ ERRCHK(tl);
+ SkipToken(tl, ';');
} else {
ErrInternal(tl);
}
@@ -134,6 +140,7 @@
PF(tl->t_dir));
Fc(tl, 0, "\t.name = \"%.*s\",\n", PF(tl->t_dir));
Fc(tl, 0, "\t.retries = %u,\n", retries);
+ Fc(tl, 0, "\t.quorum = %u,\n", quorum);
Fc(tl, 0, "\t.nmember = %d,\n", nelem);
Fc(tl, 0, "\t.members = vdre_%.*s,\n", PF(tl->t_dir));
Fc(tl, 0, "};\n");
diff -u -r varnish-2.1.3/lib/libvcl/vcc_fixed_token.c varnish-quorum/
lib/libvcl/vcc_fixed_token.c
--- varnish-2.1.3/lib/libvcl/vcc_fixed_token.c 2010-07-28
09:48:29.000000000 +0000
+++ varnish-quorum/lib/libvcl/vcc_fixed_token.c 2010-10-07
17:42:14.888909071 +0000
@@ -258,8 +258,9 @@
vsb_cat(sb, "\tint\t\t\t\t\thost;\n\tdouble\t\t\t\t\tweight;\n");
vsb_cat(sb, "};\n\nstruct vrt_dir_random {\n");
vsb_cat(sb, "\tconst char\t\t\t\t*name;\n\tunsigned\t\t\t
\tretries;");
- vsb_cat(sb, "\n\tunsigned\t\t\t\tnmember;\n\tconst struct vrt_dir_r");
- vsb_cat(sb, "andom_entry\t*members;\n};\n\n/*\n");
+ vsb_cat(sb, "\n\tunsigned\t\t\t\tnmember;\n\tunsigned ");
+ vsb_cat(sb, " quorum;\n\tconst struct vrt_dir_rand");
+ vsb_cat(sb, "om_entry\t*members;\n};\n\n/*\n");
vsb_cat(sb, " * A director with round robin selection\n");
vsb_cat(sb, " */\n\nstruct vrt_dir_round_robin_entry {\n");
vsb_cat(sb, "\tint\t\t\t\t\thost;\n};\n\nstruct
vrt_dir_round_robin");
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-dev/attachments/20101007/c36b5889/attachment-0003.html>
More information about the varnish-dev
mailing list