Commit c4cd7bd0 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Don't halfclose the backend polling TCP connection after sending the

request, some backends gets confused by this.

Add a ".status" to backend polling, to configure the expected HTTP
status code for a good poll.

Fixes #584



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@4356 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 1e1d24b3
...@@ -174,23 +174,6 @@ vbp_poke(struct vbp_target *vt) ...@@ -174,23 +174,6 @@ vbp_poke(struct vbp_target *vt)
} }
vt->good_xmit |= 1; vt->good_xmit |= 1;
/* And do a shutdown(WR) so we know that the backend got it */
i = shutdown(s, SHUT_WR);
if (i != 0) {
vt->err_shut |= 1;
TCP_close(&s);
return;
}
vt->good_shut |= 1;
/* Check if that took too long time */
t_now = TIM_real();
tmo = (int)round((t_end - t_now) * 1e3);
if (tmo < 0) {
TCP_close(&s);
return;
}
pfd->fd = s; pfd->fd = s;
rlen = 0; rlen = 0;
do { do {
...@@ -237,7 +220,7 @@ vbp_poke(struct vbp_target *vt) ...@@ -237,7 +220,7 @@ vbp_poke(struct vbp_target *vt)
i = sscanf(vt->resp_buf, "HTTP/%*f %u %s", &resp, buf); i = sscanf(vt->resp_buf, "HTTP/%*f %u %s", &resp, buf);
if (i == 2 && resp == 200) if (i == 2 && resp == vt->probe.exp_status)
vt->happy |= 1; vt->happy |= 1;
} }
...@@ -336,6 +319,8 @@ vbp_wrk_poll_backend(void *priv) ...@@ -336,6 +319,8 @@ vbp_wrk_poll_backend(void *priv)
vt->probe.window = 8; vt->probe.window = 8;
if (vt->probe.threshold == 0) if (vt->probe.threshold == 0)
vt->probe.threshold = 3; vt->probe.threshold = 3;
if (vt->probe.exp_status == 0)
vt->probe.exp_status = 200;
if (vt->probe.threshold == ~0U) if (vt->probe.threshold == ~0U)
vt->probe.initial = vt->probe.threshold - 1; vt->probe.initial = vt->probe.threshold - 1;
......
...@@ -33,8 +33,6 @@ BITMAP(good_ipv4, '4', "Good IPv4", 0) ...@@ -33,8 +33,6 @@ BITMAP(good_ipv4, '4', "Good IPv4", 0)
BITMAP(good_ipv6, '6', "Good IPv6", 0) BITMAP(good_ipv6, '6', "Good IPv6", 0)
BITMAP( err_xmit, 'x', "Error Xmit", 0) BITMAP( err_xmit, 'x', "Error Xmit", 0)
BITMAP(good_xmit, 'X', "Good Xmit", 0) BITMAP(good_xmit, 'X', "Good Xmit", 0)
BITMAP( err_shut, 's', "Error Shut", 0)
BITMAP(good_shut, 'S', "Good Shut", 0)
BITMAP( err_recv, 'r', "Error Recv", 0) BITMAP( err_recv, 'r', "Error Recv", 0)
BITMAP(good_recv, 'R', "Good Recv", 0) BITMAP(good_recv, 'R', "Good Recv", 0)
BITMAP(happy, 'H', "Happy", 1) BITMAP(happy, 'H', "Happy", 1)
...@@ -185,3 +185,11 @@ varnish v1 -badvcl { ...@@ -185,3 +185,11 @@ varnish v1 -badvcl {
} }
} }
varnish v1 -badvcl {
backend b1 {
.host = "127.0.0.1";
.probe = { .status = 13; }
}
}
...@@ -2,6 +2,16 @@ ...@@ -2,6 +2,16 @@
test "VCL: test backend probe syntax" test "VCL: test backend probe syntax"
# Check status definition
varnish v1 -vcl {
backend b1 {
.host = "127.0.0.1";
.probe = {
.status = 204;
}
}
}
# Check url definition # Check url definition
varnish v1 -vcl { varnish v1 -vcl {
backend b1 { backend b1 {
......
...@@ -52,6 +52,7 @@ struct vrt_backend_probe { ...@@ -52,6 +52,7 @@ struct vrt_backend_probe {
const char *request; const char *request;
double timeout; double timeout;
double interval; double interval;
unsigned exp_status;
unsigned window; unsigned window;
unsigned threshold; unsigned threshold;
unsigned initial; unsigned initial;
......
...@@ -343,11 +343,12 @@ vcc_ParseProbe(struct tokenlist *tl) ...@@ -343,11 +343,12 @@ vcc_ParseProbe(struct tokenlist *tl)
struct token *t_field; struct token *t_field;
struct token *t_did = NULL, *t_window = NULL, *t_threshold = NULL; struct token *t_did = NULL, *t_window = NULL, *t_threshold = NULL;
struct token *t_initial = NULL; struct token *t_initial = NULL;
unsigned window, threshold, initial; unsigned window, threshold, initial, status;
fs = vcc_FldSpec(tl, fs = vcc_FldSpec(tl,
"?url", "?url",
"?request", "?request",
"?status",
"?timeout", "?timeout",
"?interval", "?interval",
"?window", "?window",
...@@ -361,6 +362,7 @@ vcc_ParseProbe(struct tokenlist *tl) ...@@ -361,6 +362,7 @@ vcc_ParseProbe(struct tokenlist *tl)
window = 0; window = 0;
threshold = 0; threshold = 0;
initial = 0; initial = 0;
status = 0;
Fb(tl, 0, "\t.probe = {\n"); Fb(tl, 0, "\t.probe = {\n");
while (tl->t->tok != '}') { while (tl->t->tok != '}') {
...@@ -406,6 +408,17 @@ vcc_ParseProbe(struct tokenlist *tl) ...@@ -406,6 +408,17 @@ vcc_ParseProbe(struct tokenlist *tl)
initial = vcc_UintVal(tl); initial = vcc_UintVal(tl);
vcc_NextToken(tl); vcc_NextToken(tl);
ERRCHK(tl); ERRCHK(tl);
} else if (vcc_IdIs(t_field, "status")) {
status = vcc_UintVal(tl);
if (status < 100 || status > 999) {
vsb_printf(tl->sb,
"Must specify .status with exactly three "
" digits (100 <= x <= 999)\n");
vcc_ErrWhere(tl, tl->t);
return;
}
vcc_NextToken(tl);
ERRCHK(tl);
} else if (vcc_IdIs(t_field, "threshold")) { } else if (vcc_IdIs(t_field, "threshold")) {
t_threshold = tl->t; t_threshold = tl->t;
threshold = vcc_UintVal(tl); threshold = vcc_UintVal(tl);
...@@ -457,6 +470,8 @@ vcc_ParseProbe(struct tokenlist *tl) ...@@ -457,6 +470,8 @@ vcc_ParseProbe(struct tokenlist *tl)
Fb(tl, 0, "\t\t.initial = %u,\n", initial); Fb(tl, 0, "\t\t.initial = %u,\n", initial);
else else
Fb(tl, 0, "\t\t.initial = ~0U,\n", initial); Fb(tl, 0, "\t\t.initial = ~0U,\n", initial);
if (status > 0)
Fb(tl, 0, "\t\t.exp_status = %u,\n", status);
Fb(tl, 0, "\t},\n"); Fb(tl, 0, "\t},\n");
ExpectErr(tl, '}'); ExpectErr(tl, '}');
vcc_NextToken(tl); vcc_NextToken(tl);
......
/* /*
* $Id$ * $Id: vcc_gen_fixed_token.tcl 4236 2009-09-14 08:47:03Z phk $
* *
* NB: This file is machine generated, DO NOT EDIT! * NB: This file is machine generated, DO NOT EDIT!
* *
...@@ -159,9 +159,10 @@ vcl_output_lang_h(struct vsb *sb) ...@@ -159,9 +159,10 @@ vcl_output_lang_h(struct vsb *sb)
/* ../../include/vcl.h */ /* ../../include/vcl.h */
vsb_cat(sb, "/*\n * $Id$\n *\n * NB: This file is machine generate"); vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 4236 2009-09-14 08");
vsb_cat(sb, "d, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_tok"); vsb_cat(sb, ":47:03Z phk $\n *\n * NB: This file is machine genera");
vsb_cat(sb, "en.tcl instead\n */\n\nstruct sess;\n"); vsb_cat(sb, "ted, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_t");
vsb_cat(sb, "oken.tcl instead\n */\n\nstruct sess;\n");
vsb_cat(sb, "struct cli;\n\ntypedef void vcl_init_f(struct cli *);\n"); vsb_cat(sb, "struct cli;\n\ntypedef void vcl_init_f(struct cli *);\n");
vsb_cat(sb, "typedef void vcl_fini_f(struct cli *);\n"); vsb_cat(sb, "typedef void vcl_fini_f(struct cli *);\n");
vsb_cat(sb, "typedef int vcl_func_f(struct sess *sp);\n"); vsb_cat(sb, "typedef int vcl_func_f(struct sess *sp);\n");
...@@ -227,25 +228,25 @@ vcl_output_lang_h(struct vsb *sb) ...@@ -227,25 +228,25 @@ vcl_output_lang_h(struct vsb *sb)
vsb_cat(sb, " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWI"); vsb_cat(sb, " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWI");
vsb_cat(sb, "SE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFT"); vsb_cat(sb, "SE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFT");
vsb_cat(sb, "WARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n"); vsb_cat(sb, "WARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n");
vsb_cat(sb, " * SUCH DAMAGE.\n *\n * $Id$\n *\n"); vsb_cat(sb, " * SUCH DAMAGE.\n *\n * $Id: vrt.h 4336 2009-10-21 11:");
vsb_cat(sb, " * Runtime support for compiled VCL programs.\n"); vsb_cat(sb, "36:28Z kristian $\n *\n * Runtime support for compiled");
vsb_cat(sb, " *\n * XXX: When this file is changed, lib/libvcl/vcc_"); vsb_cat(sb, " VCL programs.\n *\n * XXX: When this file is changed,");
vsb_cat(sb, "gen_fixed_token.tcl\n * XXX: *MUST* be rerun.\n"); vsb_cat(sb, " lib/libvcl/vcc_gen_fixed_token.tcl\n");
vsb_cat(sb, " */\n\nstruct sess;\nstruct vsb;\n"); vsb_cat(sb, " * XXX: *MUST* be rerun.\n */\n");
vsb_cat(sb, "struct cli;\nstruct director;\n"); vsb_cat(sb, "\nstruct sess;\nstruct vsb;\nstruct cli;\n");
vsb_cat(sb, "struct VCL_conf;\nstruct sockaddr;\n"); vsb_cat(sb, "struct director;\nstruct VCL_conf;\n");
vsb_cat(sb, "\n/*\n * A backend probe specification\n"); vsb_cat(sb, "struct sockaddr;\n\n/*\n * A backend probe specificati");
vsb_cat(sb, " */\n\nextern const void * const vrt_magic_string_end;"); vsb_cat(sb, "on\n */\n\nextern const void * const vrt_magic_string_");
vsb_cat(sb, "\n\nstruct vrt_backend_probe {\n"); vsb_cat(sb, "end;\n\nstruct vrt_backend_probe {\n");
vsb_cat(sb, "\tconst char\t*url;\n\tconst char\t*request;\n"); vsb_cat(sb, "\tconst char\t*url;\n\tconst char\t*request;\n");
vsb_cat(sb, "\tdouble\t\ttimeout;\n\tdouble\t\tinterval;\n"); vsb_cat(sb, "\tdouble\t\ttimeout;\n\tdouble\t\tinterval;\n");
vsb_cat(sb, "\tunsigned\twindow;\n\tunsigned\tthreshold;\n"); vsb_cat(sb, "\tunsigned\texp_status;\n\tunsigned\twindow;\n");
vsb_cat(sb, "\tunsigned\tinitial;\n};\n\n/*\n"); vsb_cat(sb, "\tunsigned\tthreshold;\n\tunsigned\tinitial;\n");
vsb_cat(sb, " * A backend is a host+port somewhere on the network\n"); vsb_cat(sb, "};\n\n/*\n * A backend is a host+port somewhere on the");
vsb_cat(sb, " */\nstruct vrt_backend {\n\tconst char\t\t\t*vcl_name"); vsb_cat(sb, " network\n */\nstruct vrt_backend {\n");
vsb_cat(sb, ";\n\tconst char\t\t\t*ident;\n\n"); vsb_cat(sb, "\tconst char\t\t\t*vcl_name;\n\tconst char\t\t\t*ident");
vsb_cat(sb, "\tconst char\t\t\t*hosthdr;\n\n"); vsb_cat(sb, ";\n\n\tconst char\t\t\t*hosthdr;\n");
vsb_cat(sb, "\tconst unsigned char\t\t*ipv4_sockaddr;\n"); vsb_cat(sb, "\n\tconst unsigned char\t\t*ipv4_sockaddr;\n");
vsb_cat(sb, "\tconst unsigned char\t\t*ipv6_sockaddr;\n"); vsb_cat(sb, "\tconst unsigned char\t\t*ipv6_sockaddr;\n");
vsb_cat(sb, "\n\tdouble\t\t\t\tconnect_timeout;\n"); vsb_cat(sb, "\n\tdouble\t\t\t\tconnect_timeout;\n");
vsb_cat(sb, "\tdouble\t\t\t\tfirst_byte_timeout;\n"); vsb_cat(sb, "\tdouble\t\t\t\tfirst_byte_timeout;\n");
...@@ -318,25 +319,26 @@ vcl_output_lang_h(struct vsb *sb) ...@@ -318,25 +319,26 @@ vcl_output_lang_h(struct vsb *sb)
/* ../../include/vrt_obj.h */ /* ../../include/vrt_obj.h */
vsb_cat(sb, "/*\n * $Id$\n *\n * NB: This file is machine generate"); vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 4236 2009-09-14 08");
vsb_cat(sb, "d, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_tok"); vsb_cat(sb, ":47:03Z phk $\n *\n * NB: This file is machine genera");
vsb_cat(sb, "en.tcl instead\n */\n\nstruct sockaddr * VRT_r_client_"); vsb_cat(sb, "ted, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_t");
vsb_cat(sb, "ip(const struct sess *);\nstruct sockaddr * VRT_r_serv"); vsb_cat(sb, "oken.tcl instead\n */\n\nstruct sockaddr * VRT_r_clien");
vsb_cat(sb, "er_ip(struct sess *);\nconst char * VRT_r_server_hostn"); vsb_cat(sb, "t_ip(const struct sess *);\nstruct sockaddr * VRT_r_se");
vsb_cat(sb, "ame(struct sess *);\nconst char * VRT_r_server_identit"); vsb_cat(sb, "rver_ip(struct sess *);\nconst char * VRT_r_server_hos");
vsb_cat(sb, "y(struct sess *);\nint VRT_r_server_port(struct sess *"); vsb_cat(sb, "tname(struct sess *);\nconst char * VRT_r_server_ident");
vsb_cat(sb, ");\nconst char * VRT_r_req_request(const struct sess *"); vsb_cat(sb, "ity(struct sess *);\nint VRT_r_server_port(struct sess");
vsb_cat(sb, ");\nvoid VRT_l_req_request(const struct sess *, const "); vsb_cat(sb, " *);\nconst char * VRT_r_req_request(const struct sess");
vsb_cat(sb, "char *, ...);\nconst char * VRT_r_req_url(const struct"); vsb_cat(sb, " *);\nvoid VRT_l_req_request(const struct sess *, cons");
vsb_cat(sb, " sess *);\nvoid VRT_l_req_url(const struct sess *, con"); vsb_cat(sb, "t char *, ...);\nconst char * VRT_r_req_url(const stru");
vsb_cat(sb, "st char *, ...);\nconst char * VRT_r_req_proto(const s"); vsb_cat(sb, "ct sess *);\nvoid VRT_l_req_url(const struct sess *, c");
vsb_cat(sb, "truct sess *);\nvoid VRT_l_req_proto(const struct sess"); vsb_cat(sb, "onst char *, ...);\nconst char * VRT_r_req_proto(const");
vsb_cat(sb, " *, const char *, ...);\nvoid VRT_l_req_hash(struct se"); vsb_cat(sb, " struct sess *);\nvoid VRT_l_req_proto(const struct se");
vsb_cat(sb, "ss *, const char *);\nstruct director * VRT_r_req_back"); vsb_cat(sb, "ss *, const char *, ...);\nvoid VRT_l_req_hash(struct ");
vsb_cat(sb, "end(struct sess *);\nvoid VRT_l_req_backend(struct ses"); vsb_cat(sb, "sess *, const char *);\nstruct director * VRT_r_req_ba");
vsb_cat(sb, "s *, struct director *);\nint VRT_r_req_restarts(const"); vsb_cat(sb, "ckend(struct sess *);\nvoid VRT_l_req_backend(struct s");
vsb_cat(sb, " struct sess *);\ndouble VRT_r_req_grace(struct sess *"); vsb_cat(sb, "ess *, struct director *);\nint VRT_r_req_restarts(con");
vsb_cat(sb, ");\nvoid VRT_l_req_grace(struct sess *, double);\n"); vsb_cat(sb, "st struct sess *);\ndouble VRT_r_req_grace(struct sess");
vsb_cat(sb, " *);\nvoid VRT_l_req_grace(struct sess *, double);\n");
vsb_cat(sb, "const char * VRT_r_req_xid(struct sess *);\n"); vsb_cat(sb, "const char * VRT_r_req_xid(struct sess *);\n");
vsb_cat(sb, "unsigned VRT_r_req_esi(struct sess *);\n"); vsb_cat(sb, "unsigned VRT_r_req_esi(struct sess *);\n");
vsb_cat(sb, "void VRT_l_req_esi(struct sess *, unsigned);\n"); vsb_cat(sb, "void VRT_l_req_esi(struct sess *, unsigned);\n");
......
/* /*
* $Id$ * $Id: vcc_gen_fixed_token.tcl 4236 2009-09-14 08:47:03Z phk $
* *
* NB: This file is machine generated, DO NOT EDIT! * NB: This file is machine generated, DO NOT EDIT!
* *
......
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