Skip to content

Commit

Permalink
Optimize lookup
Browse files Browse the repository at this point in the history
Fix potential case when varnish stops responding with a large number of bans and variations
  • Loading branch information
sobolevsv committed Nov 30, 2024
1 parent f279c0c commit f81e912
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 6 deletions.
12 changes: 6 additions & 6 deletions bin/varnishd/cache/cache_hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,12 +451,6 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
if (oc->ttl <= 0.)
continue;

if (BAN_CheckObject(wrk, oc, req)) {
oc->flags |= OC_F_DYING;
EXP_Remove(oc, NULL);
continue;
}

if (!req->hash_ignore_vary && ObjHasAttr(wrk, oc, OA_VARY)) {
vary = ObjGetAttr(wrk, oc, OA_VARY, NULL);
AN(vary);
Expand All @@ -466,6 +460,12 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
}
}

if (BAN_CheckObject(wrk, oc, req)) {
oc->flags |= OC_F_DYING;
EXP_Remove(oc, NULL);
continue;
}

if (req->vcf != NULL) {
vr = req->vcf->func(req, &oc, &exp_oc, 0);
if (vr == VCF_CONTINUE)
Expand Down
86 changes: 86 additions & 0 deletions bin/varnishtest/tests/c00133.vtc
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
varnishtest "Optimized HSH_Lookup - ban is checked after Vary is matched"

server s1 {
rxreq
expect req.url == /foo
expect req.http.foobar == "1"
txresp -hdr "Vary: Foobar" -body "1111"

rxreq
expect req.url == /foo
expect req.http.foobar == "2"
txresp -hdr "Vary: Foobar" -body "2222"

rxreq
expect req.url == /foo
expect req.http.foobar == "3"
txresp -hdr "Vary: Foobar" -body "3333"

rxreq
expect req.url == /foo
expect req.http.foobar == "1"
txresp -hdr "Vary: Foobar" -body "1111"

rxreq
expect req.url == /foo
expect req.http.foobar == "1"
txresp -hdr "Vary: Foobar" -body "1111"

} -start

varnish v1 -vcl+backend {
sub vcl_backend_response {
set beresp.http.url = bereq.url;
}
} -start


client c1 {
txreq -url /foo -hdr "Foobar: 1"
rxresp
expect resp.body == "1111"
} -run

client c1 {
txreq -url /foo -hdr "Foobar: 2"
rxresp
expect resp.body == "2222"
} -run

client c1 {
txreq -url /foo -hdr "Foobar: 3"
rxresp
expect resp.body == "3333"

} -run

varnish v1 -expect n_object == 3
varnish v1 -expect cache_hit == 0
varnish v1 -expect cache_miss == 3

client c1 {
txreq -url /foo -hdr "Foobar: 1"
rxresp
} -run

varnish v1 -expect cache_hit == 1
varnish v1 -expect cache_miss == 3

varnish v1 -cliok "ban obj.http.url == /foo"
varnish v1 -cliok "ban obj.http.url == /bar"
varnish v1 -cliok "ban obj.http.url == /baz"

client c1 {
txreq -url /foo -hdr "Foobar: 1"
rxresp
} -run

varnish v1 -expect bans_tested == 1
varnish v1 -expect bans_tests_tested == 3
varnish v1 -expect bans_obj_killed == 1
varnish v1 -expect n_object == 3


varnish v1 -expect cache_hit == 1
varnish v1 -expect cache_miss == 4
varnish v1 -expect client_req == 5

0 comments on commit f81e912

Please sign in to comment.