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

Rewrite the ban-lurker in light of many changes and evidence that

it basically didn't work as intended any more.
parent 061bc5ca
...@@ -437,7 +437,6 @@ struct objcore { ...@@ -437,7 +437,6 @@ struct objcore {
#define OC_F_PASS (1<<2) #define OC_F_PASS (1<<2)
#define OC_F_OFFLRU (1<<4) #define OC_F_OFFLRU (1<<4)
#define OC_F_PRIV (1<<5) /* Stevedore private flag */ #define OC_F_PRIV (1<<5) /* Stevedore private flag */
#define OC_F_LURK (3<<6) /* Ban-lurker-color */
#define OC_F_DYING (1<<7) #define OC_F_DYING (1<<7)
#define OC_F_PRIVATE (1<<8) #define OC_F_PRIVATE (1<<8)
#define OC_F_FAILED (1<<9) #define OC_F_FAILED (1<<9)
......
This diff is collapsed.
varnishtest "ban lurker test" varnishtest "New ban-lurker test"
server s1 { server s1 {
rxreq rxreq
expect req.url == "/alpha" expect req.url == /1
txresp -hdr "Foo: /alpha" txresp -hdr "Foo: bar1"
rxreq rxreq
expect req.url == "/beta" expect req.url == /2
txresp -hdr "Foo: /beta" txresp -hdr "Foo: bar2"
rxreq rxreq
expect req.url == "/gamma" expect req.url == /3
txresp -hdr "Foo: /gamma" txresp -hdr "Foo: bar3"
rxreq rxreq
expect req.url == "/delta" expect req.url == /4
txresp -hdr "Foo: /delta" txresp -hdr "Foo: bar4"
rxreq rxreq
expect req.url == "/alpha" expect req.url == /5
txresp -hdr "Foo: /alpha2" txresp -hdr "Foo: bar5"
rxreq rxreq
expect req.url == "/beta" expect req.url == /6
txresp -hdr "Foo: /beta2" txresp -hdr "Foo: bar6"
rxreq rxreq
expect req.url == "/delta" expect req.url == /7
txresp -hdr "Foo: /delta2" txresp -hdr "Foo: bar7"
} -start rxreq
expect req.url == /4
txresp -hdr "Foo: bar4.1"
varnish v1 -vcl+backend {
} -start } -start
varnish v1 -vcl+backend {} -start
varnish v1 -cliok "param.set ban_lurker_sleep 0" varnish v1 -cliok "param.set ban_lurker_sleep 0"
varnish v1 -cliok "param.set debug +lurker" varnish v1 -cliok "param.set debug +lurker"
varnish v1 -cliok "ban.list"
client c1 { client c1 {
txreq -url "/alpha" txreq -url /1
rxresp rxresp
expect resp.http.foo == /alpha expect resp.http.foo == bar1
txreq -url /2
rxresp
expect resp.http.foo == bar2
} -run } -run
delay 0.1 varnish v1 -cliok "ban obj.http.foo == bar1"
varnish v1 -cliok "ban req.url == /alpha"
varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 2
varnish v1 -expect bans_gone == 1
client c1 { client c1 {
txreq -url "/beta" txreq -url /3
rxresp rxresp
expect resp.http.foo == /beta expect resp.http.foo == bar3
} -run } -run
delay 0.1 varnish v1 -cliok "ban obj.http.foo == bar2 && obj.http.foo != foof"
varnish v1 -cliok "ban obj.http.foo == /beta"
varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 3
client c1 { client c1 {
txreq -url "/gamma" txreq -url /4
rxresp rxresp
expect resp.http.foo == /gamma expect resp.http.foo == bar4
} -run } -run
delay 0.1 varnish v1 -cliok "ban req.http.kill == yes"
varnish v1 -cliok "ban obj.http.foo == /gamma"
varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 4
client c1 { client c1 {
txreq -url "/delta" txreq -url /5
rxresp rxresp
expect resp.http.foo == /delta expect resp.http.foo == bar5
} -run } -run
delay 0.1 varnish v1 -cliok "ban obj.http.foo == bar5"
varnish v1 -cliok "ban req.url == /delta"
varnish v1 -expect bans_gone == 1 client c1 {
varnish v1 -cliok "ban obj.http.foo == /gamma" txreq -url /6
# Dup-check should have added one rxresp
varnish v1 -expect bans_gone == 2 expect resp.http.foo == bar6
} -run
varnish v1 -cliok "ban obj.http.foo == bar6"
client c1 {
txreq -url /7
rxresp
expect resp.http.foo == bar7
} -run
# Get the VSL out of the way
delay .1
varnish v1 -cliok "ban req.url == /epsilon"
varnish v1 -cliok "ban.list" varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 7
varnish v1 -expect bans_gone == 2 varnish v1 -expect bans == 6
varnish v1 -expect bans_gone == 1
varnish v1 -expect bans_req == 1
varnish v1 -expect bans_obj == 4
varnish v1 -expect bans_added == 6
varnish v1 -expect bans_deleted == 0
varnish v1 -expect bans_tested == 0
varnish v1 -expect bans_tests_tested == 0
varnish v1 -expect bans_obj_killed == 0
varnish v1 -expect bans_lurker_tested == 0
varnish v1 -expect bans_lurker_tests_tested == 0
varnish v1 -expect bans_lurker_obj_killed == 0
varnish v1 -expect bans_dups == 0
varnish v1 -cliok "param.set ban_lurker_sleep .01" varnish v1 -cliok "param.set ban_lurker_sleep .01"
delay 1
varnish v1 -cliok "param.set ban_lurker_sleep .00" delay 2
varnish v1 -cliok "ban.list" varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 7
varnish v1 -expect bans == 5
varnish v1 -expect bans_gone == 4 varnish v1 -expect bans_gone == 4
varnish v1 -expect bans_req == 1
varnish v1 -expect bans_obj == 4
varnish v1 -expect bans_added == 6
varnish v1 -expect bans_deleted == 1
varnish v1 -expect bans_tested == 0
varnish v1 -expect bans_tests_tested == 0
varnish v1 -expect bans_obj_killed == 0
varnish v1 -expect bans_lurker_tested == 10
varnish v1 -expect bans_lurker_tests_tested == 11
varnish v1 -expect bans_lurker_obj_killed == 4
varnish v1 -expect bans_dups == 0
client c1 { client c1 {
txreq -url "/alpha" txreq -url /3
rxresp rxresp
expect resp.http.foo == /alpha2 expect resp.http.foo == bar3
} -run } -run
# Give lurker time to trim tail
delay 1 delay 1
varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 4
client c1 {
txreq -url "/beta"
rxresp
expect resp.http.foo == /beta2
} -run
varnish v1 -cliok "ban.list" varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 4
varnish v1 -expect bans_gone == 3
varnish v1 -expect bans_req == 1
varnish v1 -expect bans_obj == 3
varnish v1 -expect bans_added == 6
varnish v1 -expect bans_deleted == 2
varnish v1 -expect bans_tested == 1
varnish v1 -expect bans_tests_tested == 1
varnish v1 -expect bans_obj_killed == 0
varnish v1 -expect bans_lurker_tested == 10
varnish v1 -expect bans_lurker_tests_tested == 11
varnish v1 -expect bans_lurker_obj_killed == 4
varnish v1 -expect bans_dups == 0
client c1 { client c1 {
txreq -url "/delta" txreq -url /4 -hdr "kill: yes"
rxresp rxresp
expect resp.http.foo == /delta2 expect resp.http.foo == bar4.1
} -run } -run
# Give lurker time to trim tail
delay 1 delay 1
varnish v1 -cliok "ban.list" varnish v1 -cliok "ban.list"
varnish v1 -expect bans == 1 varnish v1 -expect bans == 1
varnish v1 -expect bans_gone == 0 varnish v1 -expect bans_gone == 1
varnish v1 -expect bans_added == 7 varnish v1 -expect bans_req == 0
varnish v1 -expect bans_deleted == 6 varnish v1 -expect bans_obj == 1
varnish v1 -expect bans_added == 6
varnish v1 -expect bans_deleted == 5
varnish v1 -expect bans_tested == 2
varnish v1 -expect bans_tests_tested == 2
varnish v1 -expect bans_obj_killed == 1
varnish v1 -expect bans_lurker_tested == 10
varnish v1 -expect bans_lurker_tests_tested == 11
varnish v1 -expect bans_lurker_obj_killed == 4
varnish v1 -expect bans_dups == 0
varnish v1 -expect n_object == 3
...@@ -40,10 +40,10 @@ client c1 { ...@@ -40,10 +40,10 @@ client c1 {
} -run } -run
#delay 0.1 #delay 0.1
varnish v1 -expect bans_tests_tested == 0 varnish v1 -expect bans_lurker_tests_tested == 0
delay 1.0 delay 1.0
varnish v1 -expect bans_tests_tested == 1 varnish v1 -expect bans_lurker_tests_tested == 1
varnish v1 -cliok "param.set ban_lurker_sleep 5.01" varnish v1 -cliok "param.set ban_lurker_sleep 5.01"
...@@ -58,7 +58,7 @@ client c2 { ...@@ -58,7 +58,7 @@ client c2 {
} -run } -run
#delay 0.1 #delay 0.1
varnish v1 -expect bans_tests_tested == 1 varnish v1 -expect bans_lurker_tests_tested == 1
delay 1.1 delay 1.1
varnish v1 -expect bans_tests_tested == 2 varnish v1 -expect bans_lurker_tests_tested == 2
...@@ -490,6 +490,11 @@ VSC_F(bans_gone, uint64_t, 0, 'g', diag, ...@@ -490,6 +490,11 @@ VSC_F(bans_gone, uint64_t, 0, 'g', diag,
"Number of bans which are no longer active, either because they" "Number of bans which are no longer active, either because they"
" got checked by the ban-lurker or superseded by newer identical bans." " got checked by the ban-lurker or superseded by newer identical bans."
) )
VSC_F(bans_obj, uint64_t, 0, 'g', diag,
"Number of bans using obj.*",
"Number of bans which use obj.* variables. These bans can possibly"
" be washed by the ban-lurker."
)
VSC_F(bans_req, uint64_t, 0, 'g', diag, VSC_F(bans_req, uint64_t, 0, 'g', diag,
"Number of bans using req.*", "Number of bans using req.*",
"Number of bans which use req.* variables. These bans can not" "Number of bans which use req.* variables. These bans can not"
...@@ -505,20 +510,45 @@ VSC_F(bans_deleted, uint64_t, 0, 'c', diag, ...@@ -505,20 +510,45 @@ VSC_F(bans_deleted, uint64_t, 0, 'c', diag,
) )
VSC_F(bans_tested, uint64_t, 0, 'c', diag, VSC_F(bans_tested, uint64_t, 0, 'c', diag,
"Bans tested against objects", "Bans tested against objects (lookup)",
"Count of how many bans and objects have been tested against"
" each other during hash lookup."
)
VSC_F(bans_obj_killed, uint64_t, 0, 'c', diag,
"Objects killed by bans (lookup)",
"Number of objects killed by bans during object lookup."
)
VSC_F(bans_lurker_tested, uint64_t, 0, 'c', diag,
"Bans tested against objects (lurker)",
"Count of how many bans and objects have been tested against" "Count of how many bans and objects have been tested against"
" each other." " each other by the ban-lurker."
) )
VSC_F(bans_tests_tested, uint64_t, 0, 'c', diag, VSC_F(bans_tests_tested, uint64_t, 0, 'c', diag,
"Ban tests tested against objects", "Ban tests tested against objects (lookup)",
"Count of how many tests and objects have been tested against" "Count of how many tests and objects have been tested against"
" each other. 'ban req.url == foo && req.http.host == bar'" " each other during lookup."
" 'ban req.url == foo && req.http.host == bar'"
" counts as one in 'bans_tested' and as two in 'bans_tests_tested'" " counts as one in 'bans_tested' and as two in 'bans_tests_tested'"
) )
VSC_F(bans_lurker_tests_tested, uint64_t, 0, 'c', diag,
"Ban tests tested against objects (lurker)",
"Count of how many tests and objects have been tested against"
" each other by the ban-lurker."
" 'ban req.url == foo && req.http.host == bar'"
" counts as one in 'bans_tested' and as two in 'bans_tests_tested'"
)
VSC_F(bans_lurker_obj_killed, uint64_t, 0, 'c', diag,
"Objects killed by bans (lurker)",
"Number of objects killed by ban-lurker."
)
VSC_F(bans_dups, uint64_t, 0, 'c', diag, VSC_F(bans_dups, uint64_t, 0, 'c', diag,
"Bans superseded by other bans", "Bans superseded by other bans",
"Count of bans replaced by later identical bans." "Count of bans replaced by later identical bans."
) )
VSC_F(bans_lurker_contention, uint64_t, 0, 'c', diag,
"Lurker gave way for lookup",
"Number of times the ban-lurker had to wait for lookups."
)
VSC_F(bans_persisted_bytes, uint64_t, 0, 'g', diag, VSC_F(bans_persisted_bytes, uint64_t, 0, 'g', diag,
"Bytes used by the persisted ban lists", "Bytes used by the persisted ban lists",
"Number of bytes used by the persisted ban lists." "Number of bytes used by the persisted ban lists."
......
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