Skip to content

Instantly share code, notes, and snippets.

@rezan
Created November 5, 2019 00:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rezan/b1f40d26f7fee5488d408c088a74965b to your computer and use it in GitHub Desktop.
Save rezan/b1f40d26f7fee5488d408c088a74965b to your computer and use it in GitHub Desktop.
Test how accurately a shard reconfiguration will remap
# Shard reconfiguration accuracy
# Create two different shard configurations, s1 and s2
# See what percentage of URLs map the same (200) vs different (500)
vcl 4.0;
import crypto;
import directors;
backend b01 { .host = "0"; }
backend b02 { .host = "0"; }
backend b03 { .host = "0"; }
backend b04 { .host = "0"; }
backend b05 { .host = "0"; }
backend b06 { .host = "0"; }
#backend b07 { .host = "0"; }
#backend b08 { .host = "0"; }
#backend b09 { .host = "0"; }
#backend b10 { .host = "0"; }
#backend b11 { .host = "0"; }
#backend b12 { .host = "0"; }
#backend b13 { .host = "0"; }
sub vcl_init
{
new s1 = directors.shard();
s1.add_backend(b01);
s1.add_backend(b02);
s1.add_backend(b03);
s1.add_backend(b04);
#s1.add_backend(b05);
#s1.add_backend(b06);
#s1.add_backend(b07);
#s1.add_backend(b08);
#s1.add_backend(b09);
#s1.add_backend(b10);
#s1.add_backend(b11);
#s1.add_backend(b12);
s1.reconfigure();
new s2 = directors.shard();
s2.add_backend(b01);
s2.add_backend(b02);
s2.add_backend(b03);
s2.add_backend(b04);
s2.add_backend(b05);
s2.add_backend(b06);
#s2.add_backend(b07);
#s2.add_backend(b08);
#s2.add_backend(b09);
#s2.add_backend(b10);
#s2.add_backend(b11);
#s2.add_backend(b12);
#s2.add_backend(b13);
s2.reconfigure();
}
sub vcl_recv
{
set req.url = "/" + crypto.hex_encode(crypto.urandom(32));
set req.backend_hint = s1.backend(URL);
set req.http.s1 = req.backend_hint;
set req.backend_hint = s2.backend(URL);
set req.http.s2 = req.backend_hint;
# Shard mapping matches
if (req.http.s1 == req.http.s2) {
return (synth(200));
}
return (synth(500));
}
sub vcl_synth {
set resp.http.url = req.url;
set resp.http.s1 = req.http.s1;
set resp.http.s2 = req.http.s2;
return (deliver);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment