From phk at projects.linpro.no Fri Aug 1 07:46:44 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 09:46:44 +0200 (CEST) Subject: r3049 - trunk/varnish-cache/bin/varnishd Message-ID: <20080801074644.353AA1EC204@projects.linpro.no> Author: phk Date: 2008-08-01 09:46:43 +0200 (Fri, 01 Aug 2008) New Revision: 3049 Modified: trunk/varnish-cache/bin/varnishd/cache_center.c Log: Fix pass statistics counter Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-07-31 22:38:01 UTC (rev 3048) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-01 07:46:43 UTC (rev 3049) @@ -762,6 +762,7 @@ sp->step = STP_ERROR; return (0); } + sp->wrk->acct.pass++; HSH_Prealloc(sp); sp->obj = sp->wrk->nobj; sp->wrk->nobj = NULL; From phk at projects.linpro.no Fri Aug 1 08:22:41 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 10:22:41 +0200 (CEST) Subject: r3050 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080801082241.0BFFE1EC0D9@projects.linpro.no> Author: phk Date: 2008-08-01 10:22:40 +0200 (Fri, 01 Aug 2008) New Revision: 3050 Modified: trunk/varnish-cache/bin/varnishtest/vtc_client.c Log: note when the fd gets closed Modified: trunk/varnish-cache/bin/varnishtest/vtc_client.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_client.c 2008-08-01 07:46:43 UTC (rev 3049) +++ trunk/varnish-cache/bin/varnishtest/vtc_client.c 2008-08-01 08:22:40 UTC (rev 3050) @@ -86,6 +86,7 @@ assert(fd >= 0); vtc_log(vl, 3, "Connected to %s fd is %d", c->connect, fd); http_process(vl, c->spec, fd, 1); + vtc_log(vl, 3, "Closing fd %d", fd); AZ(close(fd)); vtc_log(vl, 2, "Ending"); From phk at projects.linpro.no Fri Aug 1 08:23:30 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 10:23:30 +0200 (CEST) Subject: r3051 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080801082330.4FDE21EC0D9@projects.linpro.no> Author: phk Date: 2008-08-01 10:23:30 +0200 (Fri, 01 Aug 2008) New Revision: 3051 Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c Log: Add -cliok and -clierr Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-01 08:22:40 UTC (rev 3050) +++ trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-01 08:23:30 UTC (rev 3051) @@ -301,7 +301,7 @@ */ static void -varnish_cli(struct varnish *v, const char *cli) +varnish_cli(struct varnish *v, const char *cli, unsigned exp) { enum cli_status_e u; @@ -309,6 +309,8 @@ varnish_launch(v); u = varnish_ask_cli(v, cli, NULL); vtc_log(v->vl, 2, "CLI %03u <%s>", u, cli); + if (exp != 0 && exp != u) + vtc_log(v->vl, 0, "FAIL CLI response %u expected %u", u, exp); } /********************************************************************** @@ -470,25 +472,42 @@ for (; *av != NULL; av++) { if (!strcmp(*av, "-telnet")) { + AN(av[1]); v->telnet = av[1]; av++; continue; } if (!strcmp(*av, "-accept")) { + AN(av[1]); v->accept = av[1]; av++; continue; } if (!strcmp(*av, "-arg")) { + AN(av[1]); v->args = av[1]; av++; continue; } if (!strcmp(*av, "-cli")) { - varnish_cli(v, av[1]); + AN(av[1]); + varnish_cli(v, av[1], 0); av++; continue; } + if (!strcmp(*av, "-cliok")) { + AN(av[1]); + varnish_cli(v, av[1], CLIS_OK); + av++; + continue; + } + if (!strcmp(*av, "-clierr")) { + AN(av[1]); + AN(av[2]); + varnish_cli(v, av[2], atoi(av[1])); + av += 2; + continue; + } if (!strcmp(*av, "-launch")) { varnish_launch(v); continue; @@ -498,16 +517,19 @@ continue; } if (!strcmp(*av, "-vcl+backend")) { + AN(av[1]); varnish_vclbackend(v, av[1]); av++; continue; } if (!strcmp(*av, "-badvcl")) { + AN(av[1]); varnish_vcl(v, av[1], CLIS_PARAM); av++; continue; } if (!strcmp(*av, "-vcl")) { + AN(av[1]); varnish_vcl(v, av[1], CLIS_OK); av++; continue; From phk at projects.linpro.no Fri Aug 1 08:24:23 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 10:24:23 +0200 (CEST) Subject: r3052 - trunk/varnish-cache/bin/varnishtest/tests Message-ID: <20080801082423.4A7071EC0B3@projects.linpro.no> Author: phk Date: 2008-08-01 10:24:23 +0200 (Fri, 01 Aug 2008) New Revision: 3052 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00000.vtc trunk/varnish-cache/bin/varnishtest/tests/b00001.vtc trunk/varnish-cache/bin/varnishtest/tests/b00002.vtc trunk/varnish-cache/bin/varnishtest/tests/b00003.vtc trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc trunk/varnish-cache/bin/varnishtest/tests/b00005.vtc trunk/varnish-cache/bin/varnishtest/tests/b00006.vtc trunk/varnish-cache/bin/varnishtest/tests/b00007.vtc trunk/varnish-cache/bin/varnishtest/tests/b00008.vtc trunk/varnish-cache/bin/varnishtest/tests/b00009.vtc trunk/varnish-cache/bin/varnishtest/tests/b00010.vtc trunk/varnish-cache/bin/varnishtest/tests/b00011.vtc trunk/varnish-cache/bin/varnishtest/tests/b00012.vtc trunk/varnish-cache/bin/varnishtest/tests/b00013.vtc trunk/varnish-cache/bin/varnishtest/tests/b00014.vtc trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc Log: Go over the b* series of tests: add expectes for stats counters where necessary generally polish. Modified: trunk/varnish-cache/bin/varnishtest/tests/b00000.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00000.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00000.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,23 +2,29 @@ # # $Id$ -varnish v1 -arg "-b 127.0.0.1:9080" -start +test "Does anything get through at all ?" server s1 { rxreq - txresp -hdr "Connection: close" -body "012345\n" -} + txresp -body "012345\n" +} -start -server s1 -start +varnish v1 -vcl+backend {} -start +varnish v1 -expect n_object == 0 +varnish v1 -expect client_conn == 0 +varnish v1 -expect client_req == 0 +varnish v1 -expect cache_miss == 0 + client c1 { txreq -url "/" rxresp expect resp.status == 200 -} +} -run -client c1 -run - -server s1 -wait - -varnish v1 -stop +varnish v1 -expect n_object == 1 +varnish v1 -expect client_conn == 1 +varnish v1 -expect client_req == 1 +varnish v1 -expect cache_miss == 1 +varnish v1 -expect s_sess == 1 +varnish v1 -expect s_req == 1 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00001.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00001.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00001.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -4,10 +4,8 @@ server s1 -repeat 1 { rxreq - txresp \ - -hdr "Connection: close" \ - -body "012345\n" -} + txresp -body "012345\n" +} -start varnish v1 -vcl+backend { sub vcl_recv { @@ -15,12 +13,18 @@ } } -start -server s1 -start - client c1 { txreq -url "/" rxresp expect resp.status == 200 -} +} -run -client c1 -run +# Give varnish a chance to update stats +delay .1 + +varnish v1 -expect n_object == 0 +varnish v1 -expect client_conn == 1 +varnish v1 -expect client_req == 1 +varnish v1 -expect s_sess == 1 +varnish v1 -expect s_req == 1 +varnish v1 -expect s_pipe == 1 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00002.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00002.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00002.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,12 +2,10 @@ test "Check that a pass transaction works" -server s1 -repeat 1 { +server s1 { rxreq - txresp \ - -hdr "Connection: close" \ - -body "012345\n" -} + txresp -hdr "Connection: close" -body "012345\n" +} -start varnish v1 -vcl+backend { sub vcl_recv { @@ -15,12 +13,18 @@ } } -start -server s1 -start - client c1 { txreq -url "/" rxresp expect resp.status == 200 -} +} -run -client c1 -run +# Give varnish a chance to update stats +delay .1 + +varnish v1 -expect n_object == 0 +varnish v1 -expect client_conn == 1 +varnish v1 -expect client_req == 1 +varnish v1 -expect s_sess == 1 +varnish v1 -expect s_req == 1 +varnish v1 -expect s_pass == 1 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00003.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00003.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00003.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -4,28 +4,32 @@ server s1 { rxreq - txresp \ - -hdr "Connection: close" \ - -body "012345\n" -} + txresp -hdr "Connection: close" -body "012345\n" +} -start varnish v1 -vcl+backend { } -start -server s1 -start - client c1 { txreq -url "/" rxresp expect resp.status == 200 expect resp.http.X-Varnish == "1001" -} +} -run client c2 { txreq -url "/" rxresp expect resp.status == 200 expect resp.http.X-Varnish == "1002 1001" -} +} -run -client c1 -run -client c2 -run +# Give varnish a chance to update stats +delay .1 + +varnish v1 -expect client_conn == 2 +varnish v1 -expect cache_hit == 1 +varnish v1 -expect cache_miss == 1 +varnish v1 -expect client_req == 2 +varnish v1 -expect s_sess == 2 +varnish v1 -expect s_req == 2 +varnish v1 -expect s_fetch == 1 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -8,21 +8,21 @@ varnish v1 -vcl+backend { } -varnish v1 -cli start -varnish v1 -cli start -varnish v1 -cli start +varnish v1 -cliok start +varnish v1 -clierr 300 start +varnish v1 -clierr 300 start -varnish v1 -cli stop -varnish v1 -cli stop -varnish v1 -cli stop +varnish v1 -cliok stop +varnish v1 -clierr 300 stop +varnish v1 -clierr 300 stop -varnish v1 -cli start -varnish v1 -cli stop +varnish v1 -cliok start +varnish v1 -cliok stop -varnish v1 -cli start -varnish v1 -cli stop +varnish v1 -cliok start +varnish v1 -cliok stop -varnish v1 -cli start -varnish v1 -cli stop +varnish v1 -cliok start +varnish v1 -cliok stop varnish v1 -wait Modified: trunk/varnish-cache/bin/varnishtest/tests/b00005.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00005.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00005.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,23 +2,19 @@ test "Check that -s works" -varnish v1 -arg "-s file,varnishtest_backing,10M -b 127.0.0.1:9080" -start - server s1 { rxreq txresp -hdr "Connection: close" -body "012345\n" -} +} -start -server s1 -start +varnish v1 -arg "-s file,varnishtest_backing,10M" -vcl+backend {} -start client c1 { txreq -url "/" rxresp expect resp.status == 200 -} +} -run -client c1 -run - server s1 -wait varnish v1 -stop Modified: trunk/varnish-cache/bin/varnishtest/tests/b00006.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00006.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00006.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,23 +2,15 @@ test "Check that -s malloc works" -varnish v1 -arg "-s malloc -b 127.0.0.1:9080" -start - server s1 { rxreq txresp -hdr "Connection: close" -body "012345\n" -} +} -start -server s1 -start +varnish v1 -arg "-s malloc" -vcl+backend {} -start client c1 { txreq -url "/" rxresp expect resp.status == 200 -} - -client c1 -run - -server s1 -wait - -varnish v1 -stop +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/b00007.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00007.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00007.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,8 +2,6 @@ test "Check chunked encoding from backend works" -varnish v1 -arg "-s malloc -b 127.0.0.1:9080" -start - server s1 { rxreq expect req.url == "/bar" @@ -21,9 +19,9 @@ send "00000004\r\n1234\r\n" chunked "1234" chunked "" -} +} -start -server s1 -start +varnish v1 -vcl+backend {} -start client c1 { txreq -url "/bar" @@ -34,6 +32,4 @@ rxresp expect resp.status == 200 expect resp.http.content-length == "8" -} - -client c1 -run +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/b00008.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00008.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00008.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,20 +2,20 @@ test "Test CLI help and parameter functions" -varnish v1 -arg "-b localhost:9080" +varnish v1 -arg "-b 127.0.0.2:9080" -varnish v1 -cli "help" +varnish v1 -cliok "help" -varnish v1 -cli "param.show" +varnish v1 -cliok "param.show" -varnish v1 -cli "param.show diag_bitmap" +varnish v1 -cliok "param.show diag_bitmap" -varnish v1 -cli "param.set diag_bitmap 0x40" +varnish v1 -cliok "param.set diag_bitmap 0x40" -varnish v1 -cli "param.set diag_bitmap 0x0" +varnish v1 -cliok "param.set diag_bitmap 0x0" varnish v1 -start -varnish v1 -cli "help" +varnish v1 -cliok "help" -varnish v1 -cli "stats" +varnish v1 -cliok "stats" Modified: trunk/varnish-cache/bin/varnishtest/tests/b00009.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00009.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00009.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,23 +2,15 @@ test "Check poll acceptor" -varnish v1 -arg "-p acceptor=poll -b 127.0.0.1:9080" -start - server s1 { rxreq txresp -hdr "Connection: close" -body "012345\n" -} +} -start -server s1 -start +varnish v1 -arg "-p acceptor=poll" -vcl+backend {} -start client c1 { txreq -url "/" rxresp expect resp.status == 200 -} - -client c1 -run - -server s1 -wait - -varnish v1 -stop +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/b00010.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00010.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00010.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,14 +2,12 @@ test "Check simple list hasher" -varnish v1 -arg "-h simple_list -b 127.0.0.1:9080" -start - server s1 { rxreq txresp -hdr "Connection: close" -body "012345\n" -} +} -start -server s1 -start +varnish v1 -arg "-h simple_list" -vcl+backend {} -start client c1 { txreq -url "/" @@ -19,10 +17,4 @@ rxresp expect resp.status == 200 expect resp.http.x-varnish == "1002 1001" -} - -client c1 -run - -server s1 -wait - -varnish v1 -stop +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/b00011.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00011.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00011.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,23 +2,19 @@ test "Check HTTP/1.0 EOF transmission" -varnish v1 -arg "-h simple_list -b 127.0.0.1:9080" -start - server s1 { rxreq txresp -hdr "Connection: close" send "Body line 1\n" send "Body line 2\n" send "Body line 3\n" -} +} -start -server s1 -start +varnish v1 -vcl+backend {} -start client c1 { txreq -url "/" rxresp expect resp.status == 200 expect resp.http.content-length == 36 -} - -client c1 -run +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/b00012.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00012.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00012.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,8 +2,6 @@ test "Check pipelining" -varnish v1 -arg "-h simple_list -b 127.0.0.1:9080" -start - server s1 { rxreq expect req.url == "/foo" @@ -11,9 +9,9 @@ rxreq expect req.url == "/bar" txresp -body "foobar" -} +} -start -server s1 -start +varnish v1 -vcl+backend {} -start client c1 { send "GET /foo HTTP/1.1\n\nGET /bar HTTP/1.1\n\nGET /bar HTTP/1.1\n\n" @@ -29,6 +27,6 @@ expect resp.status == 200 expect resp.http.content-length == 6 expect resp.http.x-varnish == "1003 1002" -} +} -run -client c1 -run +varnish v1 -expect sess_pipeline == 2 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00013.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00013.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00013.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,8 +2,6 @@ test "Check read-head / partial pipelining" -varnish v1 -arg "-h simple_list -b 127.0.0.1:9080" -start - server s1 { rxreq expect req.url == "/foo" @@ -11,9 +9,9 @@ rxreq expect req.url == "/bar" txresp -body "foobar" -} +} -start -server s1 -start +varnish v1 -vcl+backend {} -start client c1 { send "GET /foo HTTP/1.1\n\nGET " @@ -31,6 +29,6 @@ expect resp.status == 200 expect resp.http.content-length == 6 expect resp.http.x-varnish == "1003 1002" -} +} -run -client c1 -run +varnish v1 -expect sess_readahead == 2 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00014.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00014.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00014.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -3,7 +3,7 @@ test "Check -f command line arg" shell "echo 'backend foo { .host = \"127.0.0.1\"; .port = \"9080\"; }' > /tmp/_b00014.vcl" -varnish v1 -arg "-h simple_list -f /tmp/_b00014.vcl" -start +varnish v1 -arg "-f /tmp/_b00014.vcl" -start server s1 { rxreq @@ -19,7 +19,7 @@ rxresp } -run -varnish v1 -cli "vcl.load foo /tmp/_b00014.vcl" -cli "vcl.use foo" +varnish v1 -cliok "vcl.load foo /tmp/_b00014.vcl" -cliok "vcl.use foo" client c1 { txreq -url /bar Modified: trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc 2008-08-01 08:23:30 UTC (rev 3051) +++ trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc 2008-08-01 08:24:23 UTC (rev 3052) @@ -2,7 +2,6 @@ test "Check synthetic error page caching" - # First test that an internally generated error is not cached varnish v1 -vcl { @@ -41,8 +40,6 @@ expect resp.http.X-varnish == "1003" } -run -server s1 -wait - client c1 { txreq -url "/" rxresp @@ -64,7 +61,7 @@ set obj.ttl = 10m; } } - } +} client c1 { txreq -url "/2" @@ -73,8 +70,6 @@ expect resp.http.X-varnish == "1005" } -run -server s1 -wait - client c1 { txreq -url "/2" rxresp From phk at projects.linpro.no Fri Aug 1 09:22:22 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 11:22:22 +0200 (CEST) Subject: r3053 - in trunk/varnish-cache/bin/varnishtest: . tests Message-ID: <20080801092222.3D3431ECCFA@projects.linpro.no> Author: phk Date: 2008-08-01 11:22:21 +0200 (Fri, 01 Aug 2008) New Revision: 3053 Modified: trunk/varnish-cache/bin/varnishtest/tests/c00001.vtc trunk/varnish-cache/bin/varnishtest/tests/c00002.vtc trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc trunk/varnish-cache/bin/varnishtest/tests/c00004.vtc trunk/varnish-cache/bin/varnishtest/tests/c00005.vtc trunk/varnish-cache/bin/varnishtest/vtc_client.c trunk/varnish-cache/bin/varnishtest/vtc_varnish.c Log: Be much more explicit about localhost. Force varnish instance into /tmp/__${name} Modified: trunk/varnish-cache/bin/varnishtest/tests/c00001.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00001.vtc 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/tests/c00001.vtc 2008-08-01 09:22:21 UTC (rev 3053) @@ -8,7 +8,7 @@ -hdr "Foobar: _barf_" \ -hdr "Connection: close" \ -body "012345\n" -} +} -start varnish v1 -vcl+backend { sub vcl_fetch { @@ -26,8 +26,6 @@ } } -start -server s1 -start - client c1 { txreq -url "/" rxresp @@ -41,6 +39,4 @@ expect resp.http.snafu5 == "_barffra\p_" # NB: have to escape the \\ in the next line expect resp.http.snafu6 == "_f&rap\\_" -} - -client c1 -run +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/c00002.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00002.vtc 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/tests/c00002.vtc 2008-08-01 09:22:21 UTC (rev 3053) @@ -2,25 +2,21 @@ # # $Id$ -test "Check that multiple thread pools all get started" +test "Check that all thread pools all get started and get minimum threads" -varnish v1 -arg "-b 127.0.0.1:9080 -p thread_pools=9" -start - server s1 { rxreq txresp -hdr "Connection: close" -body "012345\n" -} +} -start -server s1 -start +varnish v1 -arg "-p thread_pool_min=2 -p thread_pools=4" -vcl+backend {} -start +delay 1 +varnish v1 -expect n_wrk_create == 8 + client c1 { txreq -url "/" rxresp expect resp.status == 200 -} +} -run -client c1 -run - -server s1 -wait - -varnish v1 -stop Modified: trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc 2008-08-01 09:22:21 UTC (rev 3053) @@ -2,21 +2,20 @@ # # $Id$ -test "Check that we start if one listen address works" +test "Check that we start if at least one listen address works" -varnish v1 -accept ":9081 127.0.0.2:9082" -arg "-b 127.0.0.1:9080" -start - server s1 { rxreq txresp -hdr "Connection: close" -body "012345\n" } -start +varnish v1 -cliok "param.set listen_address 127.0.0.2:9082" +varnish v1 -vcl+backend {} -clierr 300 start +varnish v1 -cliok "param.set listen_address :9081,127.0.0.2:9082" +varnish v1 -start + client c1 { txreq -url "/" rxresp expect resp.status == 200 } -run - -server s1 -wait - -varnish v1 -stop Modified: trunk/varnish-cache/bin/varnishtest/tests/c00004.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00004.vtc 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/tests/c00004.vtc 2008-08-01 09:22:21 UTC (rev 3053) @@ -49,6 +49,4 @@ expect resp.http.X-Varnish == "1005 1001" expect resp.http.snafu == "1" -} - -client c1 -run +} -run Modified: trunk/varnish-cache/bin/varnishtest/tests/c00005.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00005.vtc 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/tests/c00005.vtc 2008-08-01 09:22:21 UTC (rev 3053) @@ -1,6 +1,6 @@ # $Id$ -test "Test simple ACL (May fail on Linux)" +test "Test simple ACL" server s1 { rxreq @@ -27,10 +27,8 @@ txreq -url "foo" rxresp expect resp.status == 200 -} +} -run -client c1 -run - varnish v1 -vcl+backend { acl acl1 { ! "localhost"; Modified: trunk/varnish-cache/bin/varnishtest/vtc_client.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_client.c 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/vtc_client.c 2008-08-01 09:22:21 UTC (rev 3053) @@ -112,7 +112,7 @@ exit (1); } - c->connect = ":9081"; + c->connect = "127.0.0.1:9081"; VTAILQ_INSERT_TAIL(&clients, c, list); return (c); } Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-01 08:24:23 UTC (rev 3052) +++ trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-01 09:22:21 UTC (rev 3053) @@ -148,8 +148,8 @@ } v->args = ""; - v->telnet = ":9001"; - v->accept = ":9081"; + v->telnet = "127.0.0.1:9001"; + v->accept = "127.0.0.1:9081"; v->cli_fd = -1; VTAILQ_INSERT_TAIL(&varnishes, v, list); return (v); @@ -191,7 +191,7 @@ vsb = vsb_newauto(); AN(vsb); vsb_printf(vsb, "cd ../varnishd &&"); - vsb_printf(vsb, " ./varnishd -d -d -n %s", v->name); + vsb_printf(vsb, " ./varnishd -d -d -n /tmp/__%s", v->name); vsb_printf(vsb, " -a '%s' -T %s", v->accept, v->telnet); vsb_printf(vsb, " %s", v->args); vsb_finish(vsb); @@ -235,8 +235,12 @@ } vtc_log(v->vl, 3, "CLI connection fd = %d", v->cli_fd); assert(v->cli_fd >= 0); - v->stats = VSL_OpenStats(v->name); - + vsb = vsb_newauto(); + vsb_printf(vsb, "/tmp/__%s", v->name); + vsb_finish(vsb); + AZ(vsb_overflowed(vsb)); + v->stats = VSL_OpenStats(vsb_data(vsb)); + vsb_delete(vsb); } /********************************************************************** From phk at projects.linpro.no Fri Aug 1 09:24:08 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 11:24:08 +0200 (CEST) Subject: r3054 - trunk/varnish-cache/bin/varnishd Message-ID: <20080801092408.5F6CB1EC10F@projects.linpro.no> Author: phk Date: 2008-08-01 11:24:08 +0200 (Fri, 01 Aug 2008) New Revision: 3054 Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c Log: Report back to CLI if we cannot start the child due to non-bindable sockets Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-01 09:22:21 UTC (rev 3053) +++ trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-01 09:24:08 UTC (rev 3054) @@ -226,7 +226,7 @@ /*--------------------------------------------------------------------*/ static void -start_child(void) +start_child(struct cli *cli) { pid_t pid; unsigned u; @@ -238,10 +238,15 @@ return; if (open_sockets() != 0) { + child_state = CH_STOPPED; + if (cli != NULL) { + cli_result(cli, CLIS_CANT); + cli_out(cli, "Could not open sockets"); + return; + } REPORT0(LOG_ERR, "Child start failed: could not open sockets"); - child_state = CH_STOPPED; - return; /* XXX ?? */ + return; } child_state = CH_STARTING; @@ -451,7 +456,7 @@ REPORT0(LOG_DEBUG, "Child cleanup complete"); if (child_state == CH_DIED && params->auto_restart) - start_child(); + start_child(NULL); else if (child_state == CH_DIED) { child_state = CH_STOPPED; } else if (child_state == CH_STOPPING) @@ -531,9 +536,11 @@ if (!dflag && !mgt_has_vcl()) REPORT0(LOG_ERR, "No VCL loaded yet"); - else if (!dflag) - start_child(); - else + else if (!dflag) { + start_child(NULL); + if (child_state == CH_STOPPED) + exit(2); + } else fprintf(stderr, "Debugging mode, enter \"start\" to start child\n"); @@ -556,9 +563,9 @@ if (priv != NULL && child_state == CH_RUNNING) mgt_stop_child(); else if (priv == NULL && child_state == CH_STOPPED) { - if (mgt_has_vcl()) - start_child(); - else { + if (mgt_has_vcl()) { + start_child(cli); + } else { cli_result(cli, CLIS_CANT); cli_out(cli, "No VCL available"); } From phk at projects.linpro.no Fri Aug 1 09:50:28 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 11:50:28 +0200 (CEST) Subject: r3055 - in trunk/varnish-cache/bin/varnishtest: . tests Message-ID: <20080801095029.012911EC0D9@projects.linpro.no> Author: phk Date: 2008-08-01 11:50:28 +0200 (Fri, 01 Aug 2008) New Revision: 3055 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc trunk/varnish-cache/bin/varnishtest/vtc_varnish.c Log: Actually wait for the varnish child to stop in "varnish -stop". Update test-case Modified: trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc 2008-08-01 09:24:08 UTC (rev 3054) +++ trunk/varnish-cache/bin/varnishtest/tests/b00004.vtc 2008-08-01 09:50:28 UTC (rev 3055) @@ -8,6 +8,15 @@ varnish v1 -vcl+backend { } +varnish v1 -start +varnish v1 -stop + +varnish v1 -start +varnish v1 -stop + +varnish v1 -start +varnish v1 -stop + varnish v1 -cliok start varnish v1 -clierr 300 start varnish v1 -clierr 300 start @@ -16,13 +25,4 @@ varnish v1 -clierr 300 stop varnish v1 -clierr 300 stop -varnish v1 -cliok start -varnish v1 -cliok stop - -varnish v1 -cliok start -varnish v1 -cliok stop - -varnish v1 -cliok start -varnish v1 -cliok stop - varnish v1 -wait Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-01 09:24:08 UTC (rev 3054) +++ trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-01 09:50:28 UTC (rev 3055) @@ -268,11 +268,19 @@ static void varnish_stop(struct varnish *v) { + char *r; if (v->cli_fd < 0) varnish_launch(v); vtc_log(v->vl, 2, "Stop"); (void)varnish_ask_cli(v, "stop", NULL); + while (1) { + (void)varnish_ask_cli(v, "status", &r); + if (!strcmp(r, "Child in state stopped")) + break; + free(r); + sleep (1); + } } /********************************************************************** From phk at projects.linpro.no Fri Aug 1 10:06:57 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 12:06:57 +0200 (CEST) Subject: r3056 - trunk/varnish-cache/bin/varnishtest/tests Message-ID: <20080801100657.080B41ECCFA@projects.linpro.no> Author: phk Date: 2008-08-01 12:06:56 +0200 (Fri, 01 Aug 2008) New Revision: 3056 Modified: trunk/varnish-cache/bin/varnishtest/tests/v00010.vtc Log: Longer delay for panic to complete. Modified: trunk/varnish-cache/bin/varnishtest/tests/v00010.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/v00010.vtc 2008-08-01 09:50:28 UTC (rev 3055) +++ trunk/varnish-cache/bin/varnishtest/tests/v00010.vtc 2008-08-01 10:06:56 UTC (rev 3056) @@ -26,7 +26,7 @@ txreq -url "/foo" # Don't expect answer, the server crashed. sema r1 sync 2 - delay 1.5 + delay 2.5 } -run server s1 { From phk at projects.linpro.no Fri Aug 1 10:50:36 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 12:50:36 +0200 (CEST) Subject: r3057 - in trunk/varnish-cache: bin/varnishd include Message-ID: <20080801105036.89D421ED0A4@projects.linpro.no> Author: phk Date: 2008-08-01 12:50:36 +0200 (Fri, 01 Aug 2008) New Revision: 3057 Modified: trunk/varnish-cache/bin/varnishd/cache_panic.c trunk/varnish-cache/include/libvarnish.h Log: Add WRONG(expl) macro for panicing from places we just shouldn't get to. Dump the handling value from the last VCL method on panic Modified: trunk/varnish-cache/bin/varnishd/cache_panic.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_panic.c 2008-08-01 10:06:56 UTC (rev 3056) +++ trunk/varnish-cache/bin/varnishd/cache_panic.c 2008-08-01 10:50:36 UTC (rev 3057) @@ -194,7 +194,7 @@ static void pan_sess(const struct sess *sp) { - const char *stp; + const char *stp, *hand; vsb_printf(vsp, "sp = %p {\n", sp); vsb_printf(vsp, @@ -210,10 +210,24 @@ /*lint -restore */ default: stp = NULL; } + switch (sp->handling) { +/*lint -save -e525 */ +#define VCL_RET_MAC(l, u, b, v) case VCL_RET_##u: hand = #u; break; +#define VCL_RET_MAC_E(l, u, b, v) case VCL_RET_##u: hand = #u; break; +#include "vcl_returns.h" +#undef VCL_RET_MAC +#undef VCL_RET_MAC_E +/*lint -restore */ + default: stp = NULL; + } if (stp != NULL) vsb_printf(vsp, " step = %s,\n", stp); else vsb_printf(vsp, " step = 0x%x,\n", sp->step); + if (stp != NULL) + vsb_printf(vsp, " handling = %s,\n", hand); + else + vsb_printf(vsp, " handling = 0x%x,\n", sp->handling); if (sp->err_code) vsb_printf(vsp, " err_code = %d, err_reason = %s,\n", sp->err_code, @@ -247,6 +261,10 @@ const struct sess *sp; switch(xxx) { + case 3: + vsb_printf(vsp, + "Wrong turn:\n%s\n", cond); + break; case 2: vsb_printf(vsp, "Panic from VCL:\n%s\n", cond); Modified: trunk/varnish-cache/include/libvarnish.h =================================================================== --- trunk/varnish-cache/include/libvarnish.h 2008-08-01 10:06:56 UTC (rev 3056) +++ trunk/varnish-cache/include/libvarnish.h 2008-08-01 10:50:36 UTC (rev 3057) @@ -98,3 +98,7 @@ #define XXXAZ(foo) do { xxxassert((foo) == 0); } while (0) #define XXXAN(foo) do { xxxassert((foo) != 0); } while (0) #define diagnostic(foo) assert(foo) +#define WRONG(expl) \ +do { \ + lbv_assert(__func__, __FILE__, __LINE__, expl, errno, 3); \ +} while (0) From phk at projects.linpro.no Fri Aug 1 11:08:00 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 13:08:00 +0200 (CEST) Subject: r3058 - trunk/varnish-cache/bin/varnishd Message-ID: <20080801110800.36FCE1ED157@projects.linpro.no> Author: phk Date: 2008-08-01 13:07:58 +0200 (Fri, 01 Aug 2008) New Revision: 3058 Modified: trunk/varnish-cache/bin/varnishd/cache_center.c Log: Make explicit what is missing and what is asserts in the state-engine. Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-01 10:50:36 UTC (rev 3057) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-01 11:07:58 UTC (rev 3058) @@ -165,8 +165,11 @@ switch (sp->handling) { case VCL_RET_DELIVER: break; + case VCL_RET_RESTART: + INCOMPL(); + break; default: - INCOMPL(); + WRONG("Illegal action in vcl_deliver{}"); } sp->director = NULL; @@ -337,6 +340,7 @@ http_PutResponse(w, sp->fd, h, http_StatusMessage(sp->err_code)); VCL_error_method(sp); + assert(sp->handling == VCL_RET_DELIVER); sp->err_code = 0; sp->err_reason = NULL; sp->step = STP_DELIVER; @@ -410,20 +414,15 @@ sp->bereq = NULL; switch (sp->handling) { - case VCL_RET_ERROR: case VCL_RET_RESTART: sp->obj->ttl = 0; sp->obj->cacheable = 0; HSH_Unbusy(sp); HSH_Deref(sp->obj); sp->obj = NULL; - if (sp->handling == VCL_RET_ERROR) - sp->step = STP_ERROR; - else { - sp->director = NULL; - sp->restarts++; - sp->step = STP_RECV; - } + sp->director = NULL; + sp->restarts++; + sp->step = STP_RECV; return (0); case VCL_RET_PASS: sp->obj->pass = 1; @@ -431,7 +430,7 @@ case VCL_RET_DELIVER: break; default: - INCOMPL(); + WRONG("Illegal action in vcl_fetch{}"); } sp->obj->cacheable = 1; @@ -534,17 +533,20 @@ HSH_Deref(sp->obj); sp->obj = NULL; - if (sp->handling == VCL_RET_PASS) { + switch(sp->handling) { + case VCL_RET_PASS: sp->step = STP_PASS; return (0); - } - - if (sp->handling == VCL_RET_ERROR) { + case VCL_RET_ERROR: sp->step = STP_ERROR; return (0); + case VCL_RET_RESTART: + INCOMPL(); + return (0); + default: + WRONG("Illegal action in vcl_hit{}"); + return (0); } - - INCOMPL(); } @@ -603,7 +605,7 @@ sp->hashptr = (void*)p; VCL_hash_method(sp); - /* XXX check error */ + assert(sp->handling == VCL_RET_HASH); } o = HSH_Lookup(sp); @@ -686,7 +688,8 @@ VBE_SelectBackend(sp); http_FilterHeader(sp, HTTPH_R_FETCH); VCL_miss_method(sp); - if (sp->handling == VCL_RET_ERROR) { + switch(sp->handling) { + case VCL_RET_ERROR: sp->obj->cacheable = 0; HSH_Unbusy(sp); HSH_Deref(sp->obj); @@ -695,8 +698,7 @@ sp->bereq = NULL; sp->step = STP_ERROR; return (0); - } - if (sp->handling == VCL_RET_PASS) { + case VCL_RET_PASS: sp->obj->cacheable = 0; HSH_Unbusy(sp); HSH_Deref(sp->obj); @@ -705,12 +707,16 @@ VBE_free_bereq(sp->bereq); sp->bereq = NULL; return (0); - } - if (sp->handling == VCL_RET_FETCH) { + case VCL_RET_FETCH: sp->step = STP_FETCH; return (0); + case VCL_RET_RESTART: + INCOMPL(); + return (0); + default: + WRONG("Illegal action in vcl_miss{}"); + return (0); } - INCOMPL(); } @@ -762,6 +768,7 @@ sp->step = STP_ERROR; return (0); } + assert(sp->handling == VCL_RET_PASS); sp->wrk->acct.pass++; HSH_Prealloc(sp); sp->obj = sp->wrk->nobj; @@ -812,6 +819,7 @@ if (sp->handling == VCL_RET_ERROR) INCOMPL(); + assert(sp->handling == VCL_RET_PIPE); PipeSession(sp); sp->step = STP_DONE; From phk at projects.linpro.no Fri Aug 1 11:24:49 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 13:24:49 +0200 (CEST) Subject: r3059 - trunk/varnish-cache/bin/varnishd Message-ID: <20080801112449.ABDE81ED0A4@projects.linpro.no> Author: phk Date: 2008-08-01 13:24:48 +0200 (Fri, 01 Aug 2008) New Revision: 3059 Modified: trunk/varnish-cache/bin/varnishd/cache_center.c Log: Use WRONG instead of INCOMPL Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-01 11:07:58 UTC (rev 3058) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-01 11:24:48 UTC (rev 3059) @@ -487,7 +487,7 @@ sp->step = STP_DONE; break; default: - INCOMPL(); + WRONG("Illegal return from HTC_Rx"); } return (0); } @@ -884,7 +884,8 @@ sp->step = STP_ERROR; return (0); default: - INCOMPL(); + WRONG("Illegal action in vcl_recv{}"); + return (0); } } @@ -1008,7 +1009,8 @@ break; #include "steps.h" #undef STEP - default: INCOMPL(); + default: + WRONG("State engine misfire"); } CHECK_OBJ_ORNULL(w->nobj, OBJECT_MAGIC); CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC); From phk at projects.linpro.no Fri Aug 1 12:44:54 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 1 Aug 2008 14:44:54 +0200 (CEST) Subject: r3060 - in trunk/varnish-cache: bin/varnishtest/tests lib/libvcl Message-ID: <20080801124454.A2C581EC0D9@projects.linpro.no> Author: phk Date: 2008-08-01 14:44:53 +0200 (Fri, 01 Aug 2008) New Revision: 3060 Modified: trunk/varnish-cache/bin/varnishtest/tests/v00007.vtc trunk/varnish-cache/lib/libvcl/vcc_dir_random.c trunk/varnish-cache/lib/libvcl/vcc_dir_round_robin.c Log: The compiler should not care about field order in director decls. Modified: trunk/varnish-cache/bin/varnishtest/tests/v00007.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/v00007.vtc 2008-08-01 11:24:48 UTC (rev 3059) +++ trunk/varnish-cache/bin/varnishtest/tests/v00007.vtc 2008-08-01 12:44:53 UTC (rev 3060) @@ -12,7 +12,7 @@ varnish v1 -vcl+backend { director foo random { { .backend = s1; .weight = 1; } - { .backend = s1; .weight = 1; } + { .weight = 1; .backend = s1; } } sub vcl_recv { Modified: trunk/varnish-cache/lib/libvcl/vcc_dir_random.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_dir_random.c 2008-08-01 11:24:48 UTC (rev 3059) +++ trunk/varnish-cache/lib/libvcl/vcc_dir_random.c 2008-08-01 12:44:53 UTC (rev 3060) @@ -56,6 +56,7 @@ int nbh, nelem; struct fld_spec *fs; unsigned u; + const char *first; fs = vcc_FldSpec(tl, "!backend", "!weight", NULL); @@ -64,6 +65,7 @@ PF(t_dir)); for (nelem = 0; tl->t->tok != '}'; nelem++) { /* List of members */ + first = ""; t_be = tl->t; vcc_ResetFldSpec(fs); nbh = -1; @@ -78,7 +80,7 @@ if (vcc_IdIs(t_field, "backend")) { vcc_ParseBackendHost(tl, &nbh, t_dir, t_policy, nelem); - Fc(tl, 0, " .host = &bh_%d,", nbh); + Fc(tl, 0, "%s .host = &bh_%d", first, nbh); ERRCHK(tl); } else if (vcc_IdIs(t_field, "weight")) { ExpectErr(tl, CNUM); @@ -92,13 +94,14 @@ vcc_ErrWhere(tl, tl->t); return; } - Fc(tl, 0, " .weight = %u", u); + Fc(tl, 0, "%s .weight = %u", first, u); vcc_NextToken(tl); ExpectErr(tl, ';'); vcc_NextToken(tl); } else { ErrInternal(tl); } + first = ", "; } vcc_FieldsOk(tl, fs); if (tl->err) { Modified: trunk/varnish-cache/lib/libvcl/vcc_dir_round_robin.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_dir_round_robin.c 2008-08-01 11:24:48 UTC (rev 3059) +++ trunk/varnish-cache/lib/libvcl/vcc_dir_round_robin.c 2008-08-01 12:44:53 UTC (rev 3060) @@ -54,6 +54,7 @@ struct token *t_field, *t_be; int nbh, nelem; struct fld_spec *fs; + const char *first; fs = vcc_FldSpec(tl, "!backend", NULL); @@ -62,6 +63,7 @@ PF(t_dir)); for (nelem = 0; tl->t->tok != '}'; nelem++) { /* List of members */ + first = ""; t_be = tl->t; vcc_ResetFldSpec(fs); nbh = -1; @@ -76,11 +78,12 @@ if (vcc_IdIs(t_field, "backend")) { vcc_ParseBackendHost(tl, &nbh, t_dir, t_policy, nelem); - Fc(tl, 0, " .host = &bh_%d,", nbh); + Fc(tl, 0, "%s .host = &bh_%d", first, nbh); ERRCHK(tl); } else { ErrInternal(tl); } + first = ", "; } vcc_FieldsOk(tl, fs); if (tl->err) { From phk at projects.linpro.no Mon Aug 4 20:13:30 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 4 Aug 2008 22:13:30 +0200 (CEST) Subject: r3061 - trunk/varnish-cache/bin/varnishd Message-ID: <20080804201330.DBC0D1EC40A@projects.linpro.no> Author: phk Date: 2008-08-04 22:13:30 +0200 (Mon, 04 Aug 2008) New Revision: 3061 Added: trunk/varnish-cache/bin/varnishd/default.vcl Modified: trunk/varnish-cache/bin/varnishd/Makefile.am trunk/varnish-cache/bin/varnishd/mgt_vcc.c Log: Move the default VCL code into its own text file. Generate "default_vcl.h" from this using sed(1) in the Makefile. Include default_vcl.h in mgt_vcc.c Modified: trunk/varnish-cache/bin/varnishd/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-01 12:44:53 UTC (rev 3060) +++ trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-04 20:13:30 UTC (rev 3061) @@ -60,6 +60,7 @@ cache_backend.h \ cache_acceptor.h \ common.h \ + default_vcl.h \ hash_slinger.h \ heritage.h \ mgt.h \ @@ -77,3 +78,13 @@ $(top_builddir)/lib/libvarnishcompat/libvarnishcompat.la \ $(top_builddir)/lib/libvcl/libvcl.la \ ${DL_LIBS} ${PTHREAD_LIBS} ${NET_LIBS} ${LIBM} + +# +# Turn the default.vcl file into a C-string we can include in the program. +# +default_vcl.h: default.vcl Makefile + sed -e 's/"/\\"/g' -e 's/$$/\\n"/' -e 's/^/ "/' default.vcl > $@ + +# Explicitly record dependency +mgt_vcc.${OBJEXT}: default_vcl.h + Added: trunk/varnish-cache/bin/varnishd/default.vcl =================================================================== --- trunk/varnish-cache/bin/varnishd/default.vcl (rev 0) +++ trunk/varnish-cache/bin/varnishd/default.vcl 2008-08-04 20:13:30 UTC (rev 3061) @@ -0,0 +1,143 @@ +/*- + * Copyright (c) 2006 Verdens Gang AS + * Copyright (c) 2006-2008 Linpro AS + * All rights reserved. + * + * Author: Poul-Henning Kamp + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + * + * The default VCL code. + * + * NB! You do NOT need to copy & paste all of this into your won vcl code, + * if you do not handle one of the functions, the compiler will automaticall + * fall back to the default code. + * + * This code will be prefixed with a backend declaration built from the + * -b argument. + */ + +sub vcl_recv { + if (req.request != "GET" && + req.request != "HEAD" && + req.request != "PUT" && + req.request != "POST" && + req.request != "TRACE" && + req.request != "OPTIONS" && + req.request != "DELETE") { + /* Non-RFC2616 or CONNECT which is weird. */ + pipe; + } + if (req.http.Expect) { + /* Expect is just too hard at present. */ + pipe; + } + if (req.request != "GET" && req.request != "HEAD") { + /* We only deal with GET and HEAD by default */ + pass; + } + if (req.http.Authorization || req.http.Cookie) { + /* Not cacheable by default */ + pass; + } + lookup; +} + +sub vcl_pipe { + pipe; +} + +sub vcl_pass { + pass; +} + +sub vcl_hash { + set req.hash += req.url; + if (req.http.host) { + set req.hash += req.http.host; + } else { + set req.hash += server.ip; + } + hash; +} + +sub vcl_hit { + if (!obj.cacheable) { + pass; + } + deliver; +} + +sub vcl_miss { + fetch; +} + +sub vcl_fetch { + if (!obj.cacheable) { + pass; + } + if (obj.http.Set-Cookie) { + pass; + } + set obj.prefetch = -30s; + deliver; +} + +sub vcl_deliver { + deliver; +} + +sub vcl_discard { + discard; +} + +sub vcl_prefetch { + fetch; +} + +sub vcl_timeout { + discard; +} + +sub vcl_error { + set obj.http.Content-Type = "text/html; charset=utf-8"; + synthetic {" + + + + + "} obj.status " " obj.response {" + + +

Error "} obj.status " " obj.response {"

+

"} obj.response {"

+

Guru Meditation:

+

XID: "} req.xid {"

+
Varnish
+ + +"}; + deliver; +} Property changes on: trunk/varnish-cache/bin/varnishd/default.vcl ___________________________________________________________________ Name: svn:keywords + Id Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-01 12:44:53 UTC (rev 3060) +++ trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-04 20:13:30 UTC (rev 3061) @@ -79,104 +79,7 @@ * Keep this in synch with man/vcl.7 and etc/default.vcl! */ static const char *default_vcl = - "sub vcl_recv {\n" - " if (req.request != \"GET\" &&\n" - " req.request != \"HEAD\" &&\n" - " req.request != \"PUT\" &&\n" - " req.request != \"POST\" &&\n" - " req.request != \"TRACE\" &&\n" - " req.request != \"OPTIONS\" &&\n" - " req.request != \"DELETE\") {\n" - " /* Non-RFC2616 or CONNECT which is weird. */\n" - " pipe;\n" - " }\n" - " if (req.http.Expect) {\n" - " /* Expect is just too hard at present. */\n" - " pipe;\n" - " }\n" - " if (req.request != \"GET\" && req.request != \"HEAD\") {\n" - " /* We only deal with GET and HEAD by default */\n" - " pass;\n" - " }\n" - " if (req.http.Authorization || req.http.Cookie) {\n" - " /* Not cacheable by default */\n" - " pass;\n" - " }\n" - " lookup;\n" - "}\n" - "\n" - "sub vcl_pipe {\n" - " pipe;\n" - "}\n" - "\n" - "sub vcl_pass {\n" - " pass;\n" - "}\n" - "\n" - "sub vcl_hash {\n" - " set req.hash += req.url;\n" - " if (req.http.host) {\n" - " set req.hash += req.http.host;\n" - " } else {\n" - " set req.hash += server.ip;\n" - " }\n" - " hash;\n" - "}\n" - "\n" - "sub vcl_hit {\n" - " if (!obj.cacheable) {\n" - " pass;\n" - " }\n" - " deliver;\n" - "}\n" - "\n" - "sub vcl_miss {\n" - " fetch;\n" - "}\n" - "\n" - "sub vcl_fetch {\n" - " if (!obj.cacheable) {\n" - " pass;\n" - " }\n" - " if (obj.http.Set-Cookie) {\n" - " pass;\n" - " }\n" - " set obj.prefetch = -30s;" - " deliver;\n" - "}\n" - "sub vcl_deliver {\n" - " deliver;\n" - "}\n" - "sub vcl_discard {\n" - " discard;\n" - "}\n" - "sub vcl_prefetch {\n" - " fetch;\n" - "}\n" - "sub vcl_timeout {\n" - " discard;\n" - "}\n" - "sub vcl_error {\n" - " set obj.http.Content-Type = \"text/html; charset=utf-8\";" - " synthetic {\"\n" - "\n" - "\n" - "\n" - " \n" - " \"} obj.status \" \" obj.response {\"\n" - " \n" - " \n" - "

Error \"} obj.status \" \" obj.response {\"

\n" - "

\"} obj.response {\"

\n" - "

Guru Meditation:

\n" - "

XID: \"} req.xid {\"

\n" - "
Varnish
\n" - " \n" - "\n" - "\"};\n" - " deliver;\n" - "}\n" +#include "default_vcl.h" "" ; /* From petter at projects.linpro.no Tue Aug 5 07:59:11 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Tue, 5 Aug 2008 09:59:11 +0200 (CEST) Subject: r3062 - trunk/varnish-cache/bin/varnishd Message-ID: <20080805075911.9A87A1EC10A@projects.linpro.no> Author: petter Date: 2008-08-05 09:59:11 +0200 (Tue, 05 Aug 2008) New Revision: 3062 Modified: trunk/varnish-cache/bin/varnishd/Makefile.am Log: Fixed makefile depedency. default_vcl.h is now generated as a depdency of mgt_vcc.c Modified: trunk/varnish-cache/bin/varnishd/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-04 20:13:30 UTC (rev 3061) +++ trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-05 07:59:11 UTC (rev 3062) @@ -86,5 +86,5 @@ sed -e 's/"/\\"/g' -e 's/$$/\\n"/' -e 's/^/ "/' default.vcl > $@ # Explicitly record dependency -mgt_vcc.${OBJEXT}: default_vcl.h +mgt_vcc.c: default_vcl.h From phk at projects.linpro.no Tue Aug 5 09:38:28 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 5 Aug 2008 11:38:28 +0200 (CEST) Subject: r3063 - trunk/varnish-logo/logo Message-ID: <20080805093828.BA7211EC0E8@projects.linpro.no> Author: phk Date: 2008-08-05 11:38:28 +0200 (Tue, 05 Aug 2008) New Revision: 3063 Added: trunk/varnish-logo/logo/varnish-logo.eps Log: Add an .eps version Added: trunk/varnish-logo/logo/varnish-logo.eps =================================================================== --- trunk/varnish-logo/logo/varnish-logo.eps (rev 0) +++ trunk/varnish-logo/logo/varnish-logo.eps 2008-08-05 09:38:28 UTC (rev 3063) @@ -0,0 +1,1648 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: varnish-logo.eps +%%CreationDate: Tue Aug 5 09:37:52 2008 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 420 125 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 110.64 translate +405.60000000000002 -110.64 scale +% Image geometry +1690 461 8 +% Transformation matrix +[ 1690 0 0 461 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 1690 string def +/gstr 1690 string def +/bstr 1690 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 82851 ASCII Bytes +colorimage +a8ZMGnC4e(CJ6K)%gIRbJH16$JH16$JH16$JH16$JH16$JH53?$3h"^1/)JCZdeLDa8^Y~> +a8ZMGnCG4ENeE"=NK\p]JXM(WJXM(WJXM(WJXM(WJXM(WJXQ%r$BpI(JqT/W]@QKNa8^Y~> +a8ZJEl,/m&6miWR!eC?&!.b-$!.b-$!.b-$!.b-$!.b-$!:Kmo!XKGe6tr%+l2A[&J,~> +bPq\,ZZ.OI!.b-$!.b-$!.b-$!.b-$!.b-$!.b.)!!=clZf]I2J,~> +bPq\-]9._sR=UcWR=UcWR=UcWR=UcWR=UcWR=Ud\R0/)(]B at B;J,~> +bPq\"QqJ!A!.b-$!.b-$!.b-$!.b-$!.b-$!.b.)!! +ci4(3W_nu_ci8L~> +ci4(4["X(!JXM(WJXM(WJXM(WJXM(WJXM(WJXOoR!en#Ici8L~> +ci4(+N%BM[JH16$JH16$JH16$JH16$JH16$JH4't!\B;ici8L~> +df0C-M&q3JJH16$JH16$JH16$JH16$JH16$JH3jn!Zm3Wdf4g~> +df0C.Sq_faJXM(WJXM(WJXM(WJXM(WJXM(WJXO]L!f!<+df4g~> +df0C!AdEqfJH16$JH16$JH16$JH16$JH16$JH3jn!XNDgdf4g~> +ec,^?Ql^eYJH16$JH16$JH16$JH16$JH16$JH3Xh!Zm`uec1.~> +ec,^?VhTbjJXM(WJXM(WJXM(WJXM(WJXM(WJXOKF!f!WBec1.~> +ec,^8G6ia"JH16$JH16$JH16$JH16$JH16$JH3Xh!XO#7ec1.~> +fDblr;1S^u!.b-$!.b-$!.b-$!.b-$!.b-$!5AL7;9d_mJ,~> +fDbm!Kn5YCR=UcWR=UcWR=UcWR=UcWR=UcWRD5-jL!eNPJ,~> +fDbl_/:deP!.b-$!.b-$!.b-$!.b-$!.b-$!5AL7/@sI5J,~> +gA_6RZQk#$JH16$JH16$JH16$JH16$JH16$JH3:^![G&NgAc[~> +gA_6R]7kg(JXM(WJXM(WJXM(WJXM(WJXM(WJXO- +gA_6QQjSBEJH16$JH16$JH16$JH16$JH16$JH3:^!Xb=ngAc[~> +h#@HTWXjX\JH16$JH16$JH16$JH16$JH16$JH3.Z!Y;=1h#Dm~> +h#@HT[#KX)JXM(WJXM(WJXM(WJXM(WJXM(WJXO!8!faSdh#Dm~> +h#@HSMunP1JH16$JH16$JH16$JH16$JH16$JH3.Z!Wn>Zh#Dm~> +h>[Ma'S-78!.b-$!.b-$!.b-$!.b-$!.b-$!4)Y+'XlitJ,~> +h>[MhMLh1HR=UcWR=UcWR=UcWR=UcWR=UcWRBr:^MS7jGJ,~> +h>[MF"G$Q(!.b-$!.b-$!.b-$!.b-$!.b-$!4)Y+"In6IJ,~> +hu<`,14]FV!.b-$!.b-$!.b-$!.b-$!.b-$!3ZA'1=Y4]J,~> +hu<`.Jq9>@R=UcWR=UcWR=UcWR=UcWR=UcWRBN"ZK%AiZJ,~> +hu<_p'7g.7!.b-$!.b-$!.b-$!.b-$!.b-$!3ZA''>r`-J,~> +iVrrOCOlJ:!.b-$!.b-$!.b-$!.b-$!.b-$!36)#C\?ZdJ,~> +iVrrONe*ULR=UcWR=UcWR=UcWR=UcWR=UcWRB)_VNqMB2J,~> +iVrrK7"G>h!.b-$!.b-$!.b-$!.b-$!.b-$!36)#7.K79J,~> +ir9"eJH16$JH16$JH16$JH16$JH16$JH16$VZ6_*ir=N~> +ir9"lJXM(WJXM(WJXM(WJXM(WJXM(WJXM(WVjROuir=N~> +ir9"JJH16$JH16$JH16$JH16$JH16$JH16$VZ6^dir=N~> +jSo8R>Ccd*!.b-$!.b-$!.b-$!.b-$!.b-$!2TYr>P7(WJ,~> +jSo8RLk1tFR=UcWR=UcWR=UcWR=UcWR=UcWRAH;PM"Tj/J,~> +jSo8N21YaY!.b-$!.b-$!.b-$!.b-$!.b-$!2TYr2=]c-J,~> +jo5A(#(Zc*!.b-$!.b-$!.b-$!.b-$!.b-$!2BMp#0Q'-J,~> +jo5A+PC]-QR=UcWR=UcWR=UcWR=UcWR=UcWRA6/NPKi4hJ,~> +jo5=gJH16$JH16$JH16$JH16$JH16$JH16$T`>)#jo9i~> +k5PF at JH16$JH16$JH16$JH16$JH16$JH16$T)\kNk5Tr~> +k5PFSJXM(WJXM(WJXM(WJXM(WJXM(WJXM(WT:#\Pk5Tr~> +k5PEqJH16$JH16$JH16$JH16$JH16$JH16$T)\k*k5Tr~> +kl1\Y;1S^u!.b-$!.b-$!.b-$!.b-$!.b-$!1a)j;>BATJ,~> +kl1\YKn5YCR=UcWR=UcWR=UcWR=UcWR=UcWR at T`HL%sm3J,~> +kl1\V/:deP!.b-$!.b-$!.b-$!.b-$!.b-$!1a)j/G86,J,~> +l2LeH*e= +l2LeIL4PbDR=UcWR=UcWR=UcWR=UdNRHFO#R=UcWRHg1 at L?Ih$J,~> +l2Le>#_;u,!.b-$!.b-$!.b-$!.b-p!9X<4!.b-$!9sOb#i+\EJ,~> +lMgk3JH16$JH16$JH16$JH16$JH47$ec11#JH16$mJm77lMlA~> +lMgk6JXM(WJXM(WJXM(WJXM(WJXP)Wec12gJXM(Wm[4()lMlA~> +lMgk"JH16$JH16$JH16$JH16$JH47$ec11#JH16$mJm7&lMlA~> +li-t!JH16$JH16$JH16$JH16$JH4@'bl<4oJH16$nc/[(li2J~> +li-t'JXM(WJXM(WJXM(WJXM(WJXP2Zbl<6^JXM(WnsKKrli2J~> +li-s^JH16$JH16$JH16$JH16$JH4@'bl<4oJH16$nc/Zeli2J~> +m/I'lJH16$JH16$JH16$JH16$JH4I*_uG8fJH16$p&G*!m/MS~> +m/I'tJXM(WJXM(WJXM(WJXM(WJXP;]_uG:UJXM(Wp6bomm/MS~> +m/I'QJH16$JH16$JH16$JH16$JH4I*_uG8fJH16$p&G)[m/MS~> +mJd0hJH16$JH16$JH16$JH16$JH4R-]DmE^JH16$q#CDtmJh\~> +mJd0qJXM(WJXM(WJXM(WJXM(WJXPD`]DmGMJXM(Wq3_5lmJh\~> +mJd0LJH16$JH16$JH16$JH16$JH4R-]DmE^JH16$q#CDXmJh\~> +mf*9nJH16$JH16$JH16$JH16$JH4[0[/Y[Wp]0FUJH2>C!42+nJ,~> +mf*:!JXM(WJXM(WJXM(WJXM(WJXPMc[/Y]FpmL7DJXN1!!5%\!J,~> +mf*9SJH16$JH16$JH16$JH16$JH4[0[/Y[Wp]0FUJH2>C!1<3SJ,~> +n,EC%JH16$JH16$JH16$JH16$JH4d3XoEqP!!(aQJH2MH!5 at q%J,~> +n,EC+JXM(WJXM(WJXM(WJXM(WJXPVfXoEs?!1DR at JXN@&!6"@+J,~> +n,EBbJH16$JH16$JH16$JH16$JH4d3XoEqP!!(aQJH2MH!2f5bJ,~> +nG`L9JH16$JH16$JH16$JH16$JH4g4W;hYRd/SXsW;lqGnGe"~> +nG`L +nG`L(JH16$JH16$JH16$JH16$JH4g4W;hYRd/SXsW;lq6nGe"~> +nc&UOJH16$JH16$JH16$JH16$JH4m6UAp8SaT$ekX8i7_nc++~> +nc&UPJXM(WJXM(WJXM(WJXM(WJXP_iUAp:BaT$gZXI0(Onc++~> +nc&UEJH16$JH16$JH16$JH16$JH4m6UAp8SaT$ekX8i7Unc++~> +o)Aac*e= +o)AacL4PbDR=UcWR=UcWR=UcWR=UdkR at aGCRDSuTRBN"ZLA:?>J,~> +o)Aa`#_;u,!.b-$!.b-$!.b-$!.b.8!1s4T!5ebe!3ZA'#kdcgJ,~> +o)A\eJH16$JH16$JH16$JH16$JH5!9RfAcU]`3N_YlFc$o)F4~> +o)A]DJXM(WJXM(WJXM(WJXM(WJXPhlRfAeD]`3PNZ'bTGo)F4~> +o)A\@JH16$JH16$JH16$JH16$JH5!9RfAcU]`3N_YlFbTo)F4~> +oD\fMJH16$JH16$JH16$JH16$JH5$:QN*NV[f:mYZN'uboDa=~> +oD\f`JXM(WJXM(WJXM(WJXM(WJXPkmQN*PE[f:oHZ^CfdoDa=~> +oD\f)JH16$JH16$JH16$JH16$JH5$:QN*NV[f:mYZN'u>oDa=~> +o`"p6JH16$JH16$JH16$JH16$JH5* +o`"p9JXM(WJXM(WJXM(WJXM(WJXPqoOT2,EZ2]BC[$^p=o`'F~> +o`"p!JH16$JH16$JH16$JH16$JH5* +p&>'c#(Zc*!.b-$!.b-$!.b-$!.b.>!0$rV!3H3O!4Mq/#5.ZhJ,~> +p&>'cPC]-QR=UcWR=UcWR=UcWR=UdqR>h0ERB6F>RCARbPP+VKJ,~> +p&>$^JH16$JH16$JH16$JH16$JH5-=N;ogVXT*hO[K$ +p&>"rJH16$JH16$JH16$JH16$JH53?M#XOVW;hDK\,ZM5p&BO~> +p&>#JJXM(WJXM(WJXM(WJXM(WJXQ%rM#XQEW;hF:\=!>Qp&BO~> +p&>"LJH16$JH16$JH16$JH16$JH53?M#XOVW;hDK\,ZLdp&BO~> +pAY-$JH16$JH16$JH16$JH16$JH56 at L&\=VV#PuG\GuW +pAY-+JXM(WJXM(WJXM(WJXM(WJXQ(sL&\?EV#Q"6\X +pAY,^JH16$JH16$JH16$JH16$JH56 at L&\=VV#PuG\GuW!pA]X~> +p\t6dJH16$JH16$JH16$JH16$JH59AJcE%VT`9QC\c;a'p]#a~> +p\t6dJXM(WJXM(WJXM(WJXM(WJXQ+tJcE'ET`9S2\sWQkp]#a~> +p\t6`JH16$JH16$JH16$JH16$JH59AJcE%VT`9QC\c;a#p]#a~> +p\t5/JH16$JH16$JH16$JH16$JH5 +p\t5RJXM(WJXM(WJXM(WJXM(WJXQ.uJcG`L\!`cdJXO0=!06gRJ,~> +p\t4]JH16$JH16$JH16$JH16$JH5 +q#:?DJH16$JH16$JH16$JH16$JH5?CJcGTH])\9!JH3=_!7^fDJ,~> +q#:?FJXM(WJXM(WJXM(WJXM(WJXQ2!JcGTH]:#)eJXO0=!7prFJ,~> +q#:?3JH16$JH16$JH16$JH16$JH5?CJcGTH])\9!JH3=_!5nU3J,~> +q#:=LJH16$JH16$JH16$JH16$JH5BDJcGNF]`=AuJH3Ca!&F?LJ,~> +q#:>GJXM(WJXM(WJXM(WJXM(WJXQ5"JcGNF]pY2dJXO6?!.t"GJ,~> +q#:=-JH16$JH16$JH16$JH16$JH5BDJcGNF]`=AuJH3Ca!#,/-J,~> +q>UH'JH16$JH16$JH16$JH16$JH5EEJcGBB_#TYuJH3Fb!4M_'J,~> +q>UH.JXM(WJXM(WJXM(WJXM(WJXQ8#JcGBB_3pJdJXO9@!584.J,~> +q>UGaJH16$JH16$JH16$JH16$JH5EEJcGBB_#TYuJH3Fb!1WfaJ,~> +qYpTq'S-78!.b-$!.b-$!.b-$!.b.F!.k1?s24o!s+(0c!!*f5qYu'~> +qYpTqMLh1HR=UcWR=UcWR=UcWR=Ue$R=YD.s2:=es+-TRR/r3EqYu'~> +qYpTp"G$Q(!.b-$!.b-$!.b-$!.b.F!.k1?s24o!s+(0c!!*6$qYu'~> +qYpPqJH16$JH16$JH16$JH16$JH5KGJcG0<`rM(uJH3Ld!35nqJ,~> +qYpQ&JXM(WJXM(WJXM(WJXM(WJXQ>%JcG0 +qYpPSJH16$JH16$JH16$JH16$JH5KGJcG0<`rM(uJH3Ld!0$dSJ,~> +qu6]r%tO_3!.b-$!.b-$!.b-$!.b.H!.k1:s2k=us+(0e!!*W0qu;0~> +qu6]rNIdLKR=UcWR=UcWR=UcWR=Ue&R=YD)s2pads+-TTR/r +qu6]q!eC?&!.b-$!.b-$!.b-$!.b.H!.k1:s2k=us+(0e!!*0"qu;0~> +qu6Z&JH16$JH16$JH16$JH16$JH5QIJcG!7bQ*FuJH3Oe!42S&J,~> +qu6Z.JXM(WJXM(WJXM(WJXM(WJXQD'JcG!7baF7dJXOBC!5&..J,~> +qu6Y`JH16$JH16$JH16$JH16$JH5QIJcG!7bQ*FuJH3Oe!1 +qu6X at JH16$JH16$JH16$JH16$JH5TJJcFm4cN&XuJH3Ug!$hC at J,~> +qu6YMJXM(WJXM(WJXM(WJXM(WJXQG(JcFm4c^BIdJXOHE!/:=MJ,~> +qu6X'JH16$JH16$JH16$JH16$JH5TJJcFm4cN&XuJH3Ug!"/W'J,~> +r;QcAJH16$JH16$JH16$JH16$JH5WKJcFd1d/\duJH3Ug!6tHAJ,~> +r;QcEJXM(WJXM(WJXM(WJXM(WJXQJ)JcFd1d@#UdJXOHE!7C`EJ,~> +r;Qc.JH16$JH16$JH16$JH16$JH5WKJcFd1d/\duJH3Ug!4r+.J,~> +r;QaoJH16$JH16$JH16$JH16$JH5ZLJcF^/e,Y("s8RWM`;fm8r;V9~> +r;QbNJXM(WJXM(WJXM(WJXM(WJXQM*JcF^/e +r;QaJJH16$JH16$JH16$JH16$JH5ZLJcF^/e,Y("s8RWM`;flhr;V9~> +rVlleJH16$JH16$JH16$JH16$JH5ZLJcFU,f)UC%r;V +rVlleJXM(WJXM(WJXM(WJXM(WJXQM*JcFU,f9q3ir;V>9`gHhrrVqB~> +rVll^JH16$JH16$JH16$JH16$JH5ZLJcFU,f)UC%r;V +rVlkbJH16$JH16$JH16$JH16$JH5]MJcFO*f`6U'qYu*H`rH+,rVqB~> +rVlkqJXM(WJXM(WJXM(WJXM(WJXQP+JcFO*fpREkqYu,7a-cq*rVqB~> +rVlkAJH16$JH16$JH16$JH16$JH5]MJcFO*f`6U'qYu*H`rH*`rVqB~> +rVlj=JH16$JH16$JH16$JH16$JH,ZMJcFI(gAlg)q#>mFa8c2]rVqB~> +rVlkPJXM(WJXM(WJXM(WJXM(WJXHM+JcFI(gR3Wmq#>o5aI*$_rVqB~> +rVlj'JH16$JH16$JH16$JH16$JH,ZMJcFI(gAlg)q#>mFa8c2GrVqB~> +rr2uWJH16$JH16$JH16$JH16$JH,ZMJcFC&h#N$+pA][Da8c5!rr7K~> +rr2uXJXM(WJXM(WJXM(WJXM(WJXHM+JcFC&h3iiopA]]3aI*%frr7K~> +rr2uKJH16$JH16$JH16$JH16$JH,ZMJcFC&h#N$+pA][Da8c4jrr7K~> +rr2tTJH16$JH16$JH16$JH16$JH19$f)OY.JcG?AJH3dl!/^^TJ,~> +rr2tiJXM(WJXM(WJXM(WJXM(WJXM)hf)OZrJcG?AJXOWJ!1s2iJ,~> +rr2t1JH16$JH16$JH16$JH16$JH19$f)OY.JcG?AJH3dl!+u61J,~> +rr2s>JH16$JH16$JH16$JH16$JcLB%eGnM.JcG9?JH3gm!$;.>J,~> +rr2tQJXM(WJXM(WJXM(WJXM(WJsh2ieGnNrJcG9?JXOZK!/CLQJ,~> +rr2s(JH16$JH16$JH16$JH16$JcLB%eGnM.JcG9?JH3gm!!rT(J,~> +s8N)aJH16$JH16$JH16$JH16$K)gK&dJr8-JcG3=JH3gm!p]gcJ,~> +s8N)bJXM(WJXM(WJXM(WJXM(WK:.;jdJr9qJcG3=JXOZK!pfmdJ,~> +s8N)YJH16$JH16$JH16$JH16$K)gK&dJr8-JcG3=JH3gm!oj7[J,~> +s8N)!JH16$JH16$JH16$JH16$KE-T'cN!&-JcG-;JH3jn!il;#J,~> +s8N)+JXM(WJXM(WJXM(WJXM(WKUIDkcN!'qJcG-;JXO]L!jr"-J,~> +s8N(XJH16$JH16$JH16$JH16$KE-T'cN!&-JcG-;JH3jn!f[0ZJ,~> +s8N'rJH16$JH16$JH16$JH16$K`H](bl?l,JcG*:JH3mo!`B!tJ,~> +s8N(QJXM(WJXM(WJXM(WJXM(WKpdMlbl?mpJcG*:JXO`M!ep[SJ,~> +s8N'MJH16$JH16$JH16$JH16$K`H](bl?l,JcG*:JH3mo!\FBOJ,~> +s8RWMJH16$JH16$JH16$JH1B(JcEmml2ZD8lMlD8bQ.\CJ,~> +s8RY +s8RWMJH16$JH16$JH16$JH1B(JcEmml2ZD8lMlD8bQ.\CJ,~> +!WV;5!.b-$!.b-$!.b-$!.b-)!.k0ks6K`:s60K6!6kKEk5Tr~> +!WV>6R=UcWR=UcWR=UcWR=Uc\R=YCZs6Q/)s60K6RE_-#kPp&~> +!WUr+!.b-$!.b-$!.b-$!.b-)!.k0ks6K`:s60K6!6kKEh#Dm~> +!WTKW!.b-$!.b-$!.b-$!.b-*!.k0is6]lO~> +!WTc_R=UcWR=UcWR=UcWR=Uc]R=YCXs6c;+s5s?4REh3$]DmB~> +!WSO +!WR.j!.b-$!.b-$!.b-$!.b-+!.k0gs6p#>s5a32!7(WGEW:O~> +!WS:5R=UcWR=UcWR=UcWR=Uc^R=YCVs6uG-s5a32REq9%OoKq~> +!WPfD!.b-$!.b-$!.b-$!.b-+!.k0gs6p#>s5a32!7(WG9E0M~> +!WO^%!.b-$!.b-$!.b-$!.b-,!.k0es7-/@s5O'0!71]H/H:5~> +!WRe'R=UcWR=UcWR=UcWR=Uc_R=YCTs72S/s5O'0RF%?&KE$H~> +!WN^^!.b-$!.b-$!.b-$!.b-,!.k0es7-/@s5O'0!71]H&H at 7~> +!<.NLJH16$JH16$JH16$JH1N,JcERdo)O at Ai;\?.ci=(FJ,~> +!<.P;JXM(WJXM(WJXM(WJXM at _JcERdo9k10i;\@rd$Xn5J,~> +!<%HKJH16$JH16$JH16$JH1N,JcERdo)O at Ai;\?.ci=(EJ,~> +!:YO>JH16$JH16$JH16$JH1N,JcEOco`0RChuA6-ci=(8J,~> +!:YQ-JXM(WJXM(WJXM(WJXM at _JcEOcopLC2huA7qd$Xn'J,~> +!9o%7JH16$JH16$JH16$JH1N,JcEOco`0RChuA6-ci=(1J,~> +!7ZQ"JH16$JH16$JH16$JH1Q-JcEIap&K[DhZ&-,d/X0rJ,~> +!7l^hJXM(WJXM(WJXM(WJXMC`JcEIap6gL3hZ!QUJXOrS!7lZ~> +!5j?fJH16$JH16$JH16$JH1Q-JcEIap&K[DhZ&-,d/X0aJ,~> +!4.4VJH16$JH16$JH16$JH1T.JcEC_p],mFh#Dp*dJs9RJ,~> +!5!fMJXM(WJXM(WJXM(WJXMFaJcEC_pmH^5h#@?SJXOuT!5!a~> +!18<;JH16$JH16$JH16$JH1T.JcEC_p],mFh#Dp*dJs97J,~> +!0)O0JH16$JH16$JH16$JH1W/JcE=]q>c*HgAc^(df9B-J,~> +!2+n2JXM(WJXM(WJXM(WJXMIbJcE=]qO)p7gA_-QJXP#U!2+i~> +!,6uaJH16$JH16$JH16$JH1W/JcE=]q>c*HgAc^(df9A^J,~> +!,I,cJH16$JH16$JH16$JH1Z0JcE7[quD +!02VuJXM(WJXM(WJXM(WJXMLcJcE7[r0`-9g&M'PJXP&V!02R~> +!(;A +!).qDJH16$JH16$JH16$JH1Z0JcE7[quD +!/,okJXM(WJXM(WJXM(WJXMLcJcE7[!!)tcJcFC&rr at V +!%3 +!&B**JH16$JH16$JH16$JH1]1JcE1YrW%NLf)L:$eGoS)J,~> +!.ociJXM(WJXM(WJXM(WJXMOdJcE1Y!W\XVJcF=$rr at V +!#'n`JH16$JH16$JH16$JH1]1JcE1YrW%NLf)L:$eGoR_J,~> +!$6[kJH16$JH16$JH16$JH1`2JcE+W!!%TMec11#eGoRjJ,~> +!/?&mJXM(WJXM(WJXM(WJXMReJcE+W!!%TMec5UKJXP/Y!/?"~> +!!n,UJH16$JH16$JH16$JH1`2JcE+W!!%TMec11#eGoRTJ,~> +!"XV\JH16$JH16$JH16$JH1c3JcC<$L&Z](ec5[\J,~> +!0)PtJXM(WJXM(WJXM(WJXMUfJcC<$L&_,PJXP2Z!0)L~> +!!7]OJH16$JH16$JH16$JH1c3JcC<$L&Z](ec5[OJ,~> +!![uSJH16$JH16$JH16$JH1f4JcC<$KE$K&f)PdTJ,~> +!0_u%JXM(WJXM(WJXM(WJXMXgJcC<$KE(oNJXP5[!0_p~> +JH16$JH16$JH16$JH16$O8sk3JcCB&JH47$J,~> +JH16$JH16$JH16$JH16$O8sk3JcCB&JH47$J,~> +JXM(WJXM(WJXM(WJXM(WOI:\"JcCB&r;_D:g6mH~> +JH16$JH16$JH16$JH16$O8sk3JcCB&JH47$J,~> +JH16$JH16$JH16$JH16$OT9t4JcC<$JH4:%J,~> +JXM(WJXM(WJXM(WJXM(WOdUe#JcC<$r;_D:gR3Q~> +JH16$JH16$JH16$JH16$OT9t4JcC<$JH4:%J,~> +JH16$JH16$JH16$JH16$OoU(5JcC<$!<7TMf)U=~> +JXM(WJXM(WJXM(WJXM(WP*pn$JcC<$!<;rsJXP;]J,~> +JH16$JH16$JH16$JH16$OoU(5JcC<$!<7TMf)U=~> +JH16$JH16$JH16$JH16$P5p16JcC<$rr7NLfDpF~> +JXM(WJXM(WJXM(WJXM(WPF7"%JcC<$rr;lrJXP>^J,~> +JH16$JH16$JH16$JH16$P5p16JcC<$rr7NLfDpF~> +JH16$JH16$JH16$JH16$P5p16JcC<$rVqEKf`6O~> +JXM(WJXM(WJXM(WJXM(WPF7"%JcC<$rVucqJXPA_J,~> +JH16$JH16$JH16$JH16$P5p16JcC<$rVqEKf`6O~> +JH16$JH16$JH16$JH16$PQ6:7JcC<$r;V +JXM(WJXM(WJXM(WJXM(WPaR+&JcC<$r;ZWoJXPD`J,~> +JH16$JH16$JH16$JH16$PQ6:7JcC<$r;V +JH16$JH16$JH16$JH16$PQ6:7JcC<$qu;3Ig&QX~> +JXM(WJXM(WJXM(WJXM(WPaR+&JcC<$qu?QoJXPD`J,~> +JH16$JH16$JH16$JH16$PQ6:7JcC<$qu;3Ig&QX~> +JH16$JH16$JH16$JH16$PlQC8JcC<$qYu*Hg&QX~> +JXM(WJXM(WJXM(WJXM(WQ'm4'JcC<$qZ$EmJXPGaJ,~> +JH16$JH16$JH16$JH16$PlQC8JcC<$qYu*Hg&QX~> +JH16$JH16$JH16$JH16$Q2lL9JcC<$q#>mFgAla~> +JXM(WJXM(WJXM(WJXM(WQC3=(JcC<$q#C3kJXPJbJ,~> +JH16$JH16$JH16$JH16$Q2lL9JcC<$q#>mFgAla~> +JH16$JH16$JH16$JH16$Q2lL9JcC<$q#>mFgAla~> +JXM(WJXM(WJXM(WJXM(WQC3=(JcC<$q#C0jJXPMcJ,~> +JH16$JH16$JH16$JH16$Q2lL9JcC<$q#>mFgAla~> +JH16$JH16$JH16$JH16$QN2U:JcC<$pA][Dg]2j~> +JXM(WJXM(WJXM(WJXM(WQ^NF)JcC<$pAb!iJXPMcJ,~> +JH16$JH16$JH16$JH16$QN2U:JcC<$pA][Dg]2j~> +JH16$JH16$JH16$JH16$QN2U:JcC<$pA][Dg]2j~> +JXM(WJXM(WJXM(WJXM(WQ^NF)JcC<$pAashJXPPdJ,~> +JH16$JH16$JH16$JH16$QN2U:JcC<$pA][Dg]2j~> +JH16$JH16$JH16$JH16$QiM^;JcC<$o`'IBh#Ms~> +JXM(WJXM(WJXM(WJXM(WR$iO*JcC<$o`+afJXPSeJ,~> +JH16$JH16$JH16$JH16$QiM^;JcC<$o`'IBh#Ms~> +JH16$JH16$JH16$JH16$QiM^;JcC<$o`'IBh#Ms~> +JXM(WJXM(WJXM(WJXM(WR$iO*JcC<$o`+afJXPSeJ,~> +JH16$JH16$JH16$JH16$QiM^;JcC<$o`'IBh#Ms~> +JH16$JH16$JH16$JH16$R/hgi'~> +JXM(WJXM(WJXM(WJXM(WR@/X+JcC<$o)JOdJXPVfJ,~> +JH16$JH16$JH16$JH16$R/hgi'~> +JH16$JH16$JH16$JH16$RK.p=JcC<$nc+.?h>i'~> +JXM(WJXM(WJXM(WJXM(WR[Ja,JcC<$nc/CbJXPYgJ,~> +JH16$JH16$JH16$JH16$RK.p=JcC<$nc+.?h>i'~> +JH16$JH16$JH16$JH16$RK.p=JcC<$nc+.?h>i'~> +JXM(WJXM(WJXM(WJXM(WR[Ja,JcC<$nc/CbJXPYgJ,~> +JH16$JH16$JH16$JH16$RK.p=JcC<$nc+.?h>i'~> +JH16$JH16$JH16$JH16$RfJ$>JcC<$n,Iq=hZ/0~> +JXM(WJXM(WJXM(WJXM(WS!ej-JcC<$n,N1`JXP\hJ,~> +JH16$JH16$JH16$JH16$RfJ$>JcC<$n,Iq=hZ/0~> +JH16$JH16$JH16$JH16$RfJ$>JcC<$n,Iq=hZ/0~> +JXM(WJXM(WJXM(WJXM(WS!ej-JcC<$n,N1`JXP\hJ,~> +JH16$JH16$JH16$JH16$RfJ$>JcC<$n,Iq=hZ/0~> +JH16$JH16$JH16$JH16$S,e]Oo)O at AJcG*:JH4R-J,~> +JXM(WJXM(WJXM(WJXM(WS=,N>o)O at AJcG*:p],l5ka?r~> +JH16$JH16$JH16$JH16$S,e]Oo)O at AJcG*:JH4R-J,~> +JH16$JH16$JH16$JH16$S,eoUjoBu4JcG<@JH4U.J,~> +JXM(WJXM(WJXM(WJXM(WS=,`DjoBu4JcG<@p],l5l'[&~> +JH16$JH16$JH16$JH16$S,eoUjoBu4JcG<@JH4U.J,~> +JH16$JH16$JH16$JH16$SH,)XhuJ?.JcGECJH4U.J,~> +JXM(WJXM(WJXM(WJXM(WSXGoGhuJ?.JcGECp],l5l'[&~> +JH16$JH16$JH16$JH16$SH,)XhuJ?.JcGECJH4U.J,~> +JH16$JH16$JH16$JH16$SH,5\f`6U'JcGKEJH4X/J,~> +JXM(WJXM(WJXM(WJXM(WSXH&Kf`6U'JcGKEp],l5lC!/~> +JH16$JH16$JH16$JH16$SH,5\f`6U'JcGKEJH4X/J,~> +JH16$JH16$JH16$JH16$ScGD_df=t!JcGTHJH4X/J,~> +JXM(WJXM(WJXM(WJXM(WSsc5Ndf=t!JcGTHp],l5lC!/~> +JH16$JH16$JH16$JH16$ScGD_df=t!JcGTHJH4X/J,~> +JH16$JH16$JH16$JH16$ScGJacN&OrJcGZJJH4X/J,~> +JXM(WJXM(WJXM(WJXM(WSsc;PcN&OrJcGZJpAfc4l^<8~> +JH16$JH16$JH16$JH16$ScGJacN&OrJcGZJJH4X/J,~> +JH16$JH16$JH16$JH16$ScGMbbQ*4oJcG`LJH4X/J,~> +JXM(WJXM(WJXM(WJXM(WSsc>QbQ*4oJcG`LpAfc4l^<8~> +JH16$JH16$JH16$JH16$ScGMbbQ*4oJcG`LJH4X/J,~> +JH16$JH16$JH16$JH16$T)bYda8gekJcGcMJH4[0J,~> +JXM(WJXM(WJXM(WJXM(WT:)JSa8gekJcGcMpAfc4m$WA~> +JH16$JH16$JH16$JH16$T)bYda8gekJcGcMJH4[0J,~> +JH16$JH16$JH16$JH16$T)b_f_uPAgJcC9$iW+K~> +JXM(WJXM(WJXM(WJXM(WT:)PU_uPAgJcGHEJXPkmJ,~> +JH16$JH16$JH16$JH16$T)b_f_uPAgJcC9$iW+K~> +JH16$JH16$JH16$JH16$T)beh^]8rcKE$K&iW+K~> +JXM(WJXM(WJXM(WJXM(WT:)VW^]8rcKE(WFJXPnnJ,~> +JH16$JH16$JH16$JH16$T)beh^]8rcKE$K&iW+K~> +JH16$JH16$JH16$JH16$TE(qj]` +JXM(WJXM(WJXM(WJXM(WTUDbY]` +JH16$JH16$JH16$JH16$TE(qj]` +JH16$JH16$JH16$JH16$TE(tk])[E^K`?T'irFT~> +JXM(WJXM(WJXM(WJXM(WTUDeZ])[E^K`C`GJXPqoJ,~> +JH16$JH16$JH16$JH16$TE(tk])[E^K`?T'irFT~> +JH16$JH16$JH16$JH16$TE)"l\,_*[nc/:_U&TZDirFT~> +JXM(WJXM(WJXM(WJXM(WTUDh[\,_*[nc/:_U&XfdJXPqoJ,~> +JH16$JH16$JH16$JH16$TE)"l\,_*[nc/:_U&TZDirFT~> +JH16$JH16$JH16$JH16$T`D+m[K(mYp&FL]V#PuGirFT~> +JXM(WJXM(WJXM(WJXM(WTp_q\[K(mYp&FL]V#U,gJXPqoJ,~> +JH16$JH16$JH16$JH16$T`D+m[K(mYp&FL]V#PuGirFT~> +JH16$JH16$JH16$JH16$T`D.nZiG[Wq>]^[VZ22Ij8a]~> +JXM(WJXM(WJXM(WJXM(WTp_t]ZiG[Wq>]^[VZ6>iJXPtpJ,~> +JH16$JH16$JH16$JH16$T`D.nZiG[Wq>]^[VZ22Ij8a]~> +JH16$JH16$JH16$JH16$U&_:pYlK at Tr;YmZW;hDKj8a]~> +JXM(WJXM(WJXM(WJXM(WU7&+_YlK at Tr;YmZW;lPkJXPtpJ,~> +JH16$JH16$JH16$JH16$U&_:pYlK at Tr;YmZW;hDKj8a]~> +JH16$JH16$JH16$JH16$U&_=qXoO%Qs8V-[WW.MLj8a]~> +JXM(WJXM(WJXM(WJXM(WU7&.`cN*R)mJqh +JH16$JH16$JH16$JH16$U&_=qXoO%Qs8V-[WW.MLj8a]~> +JH16$JH16$JH16$JH16$U&_ at rX8mkPhuKhXJH4a2J,~> +JXM(WJXM(WJXM(WJXM(WU7&1ae,\X!oDjLChuKhXo`0Q2n +JH16$JH16$JH16$JH16$U&_ at rX8mkPhuKhXJH4a2J,~> +JH16$JH16$JH16$JH16$UB%IsWW7_Ph>jYWJH4a2J,~> +JXM(WJXM(WJXM(WJXM(WURA:bec=Wrp&KdGh>jYWo`0Q2n +JH16$JH16$JH16$JH16$UB%IsWW7_Ph>jYWJH4a2J,~> +JH16$JH16$JH16$JH16$UB%LtW;qYPg]4JVJH4a2J,~> +JXM(WJXM(WJXM(WJXM(WURA=cf`9]nq#H-Kg]4JVoDjH1nX4n~> +JH16$JH16$JH16$JH16$UB%LtW;qYPg]4JVJH4a2J,~> +JH16$JH16$JH16$JH16$UB%OuVZ;MPg&S8TJH4d3J,~> +JXM(WJXM(WJXM(WJXM(WURA at dgAo]jqZ)EOg&S8To`0Q2nX4n~> +JH16$JH16$JH16$JH16$UB%OuVZ;MPg&S8TJH4d3J,~> +JH16$JH16$JH16$JH16$U]@UuV>uJQfDr)SJH4d3J,~> +JXM(WJXM(WJXM(WJXM(WUm\Fdh#PchquDTRfDr)So`0Q2nX4n~> +JH16$JH16$JH16$JH16$U]@UuV>uJQfDr)SJH4d3J,~> +JH3OeJcC<$JcC<$JcC<$JcCo5U]?>Qec;oRJH4d3J,~> +JXOBCJcC<$JcC<$JcC<$JcCo5h#PZer;_cUec;oRo`0Q2nX4n~> +JH3OeJcC<$JcC<$JcC<$JcCo5U]?>Qec;oRJH4d3J,~> +JH3akJcC<$JcC<$JcC<$JcC`0U&^2Qe,Z`QJH4d3J,~> +JXOTIJcC<$JcC<$JcC<$JcC`0h>kWbrW%rXe,Z`QoDjH1nsP"~> +JH3akJcC<$JcC<$JcC<$JcC`0U&^2Qe,Z`QJH4d3J,~> +JH4!rJcC<$JcC<$JcC<$JcCN*TE(&QdK$QPJH4d3J,~> +JXOiPJcC<$JcC<$JcC<$JcCN*hZ1T_rrA,[dK$QPoDjH1nsP"~> +JH4!rJcC<$JcC<$JcC<$JcCN*TE(&QdK$QPJH4d3J,~> +JH4.!JcC<$JcC<$JcC<$JcCE'T)arPdK$QPJH4d3J,~> +JXOuTJcC<$JcC<$JcC<$JcCE'huLQ\O8mW.Z2aFrJXQ(sJ,~> +JH4.!JcC<$JcC<$JcC<$JcCE'T)arPdK$QPJH4d3J,~> +JH47$JcC<$JcC<$JcC<$JcC?%SH+fPciCBOJH4d3J,~> +JXP)WJcC<$JcC<$JcC<$JcC?%i;gQZOoNc.ZN'LrJXQ+tJ,~> +JH47$JcC<$JcC<$JcC<$JcC?%SH+fPciCBOJH4d3J,~> +JH4C(JcC<$JcC<$JcC<$JcC<$rr8JgP5il/ZN#IUjT'f~> +JXP5[JcC<$JcC<$JcC<$JcC<$rr:sX]:"i^ciCBOo)O?0o9k+~> +JH4C(JcC<$JcC<$JcC<$JcC<$rr8JgP5il/ZN#IUjT'f~> +JH4L+JcC<$JcC<$JcC<$JcC<$r;W5dPQ/o.Zi>RVjT'f~> +JXP>^JcC<$JcC<$JcC<$JcC<$r;YaV\s\c^h#R/:r;a2(o)O?0o9k+~> +JH4L+JcC<$JcC<$JcC<$JcC<$r;W5dPQ/o.Zi>RVjT'f~> +JH4U.JcC<$JcC<$JcC<$JcC<$q>Zl`PlK#/Zi>RVjT'f~> +JXPGaJcC<$JcC<$JcC<$JcC<$q>]IT\=&T]huN87!!'A*o)O?0o9k+~> +JH4U.JcC<$JcC<$JcC<$JcC<$q>Zl`PlK#/Zi>RVjT'f~> +JH4^1JcC<$JcC<$JcC<$JcC<$p]$W]Q2f&.[/Y[WjT'f~> +JXPPdJcC<$JcC<$JcC<$JcC<$p]'7R\!`N]iW/;4[/][sJXQ.uJ,~> +JH4^1JcC<$JcC<$JcC<$JcC<$p]$W]Q2f&.[/Y[WjT'f~> +JH4d3JcC<$JcC<$JcC<$JcC<$p&CBZQN,//Zi>RVjoBo~> +JXPVfJcC<$JcC<$JcC<$JcC<$p&F+R[$d6[j8eG4ZiBUsJXQ.uJ,~> +JH4d3JcC<$JcC<$JcC<$JcC<$p&CBZQN,//Zi>RVjoBo~> +JH4m6JcC<$JcC<$JcC<$JcC<$oDb-WQN,//Zi>RVjoBo~> +JXP_iJcC<$JcC<$JcC<$JcC<$oDdnPZ^I-ZjT+M4ZiBUsJXQ.uJ,~> +JH4m6JcC<$JcC<$JcC<$JcC<$oDb-WQN,//Zi>RVjoBo~> +JH4s8JcC<$JcC<$JcC<$JcC<$nc+mTQiG80Zi>RVjoBo~> +JXPekJcC<$JcC<$JcC<$JcC<$nc._OZ'gsYk5aY4ZiBUsJXQ.uJ,~> +JH4s8JcC<$JcC<$JcC<$JcC<$nc+mTQiG80Zi>RVjoBo~> +JH5$:JcC<$JcC<$JcC<$JcC<$nGe^QRK(D0[/Y[WjoBo~> +JXPkmJcC<$JcC<$JcC<$JcC<$nGhVNYF1gYk5aS2[/]^tJXQ.uJ,~> +JH5$:JcC<$JcC<$JcC<$JcC<$nGe^QRK(D0[/Y[WjoBo~> +JH5* +JXPqoJcC<$JcC<$JcC<$JcC<$mf2GMY*k^XkQ'Y2[/]^tJXQ.uJ,~> +JH5* +JH50>JcC<$JcC<$JcC<$JcC<$mJi=LRfCM1[/Y[WjoBo~> +JXQ"qJcC<$JcC<$JcC<$JcC<$mJl>LXI5OWklB_2[/][sJXQ2!J,~> +JH50>JcC<$JcC<$JcC<$JcC<$mJi=LRfCM1[/Y[WjoBo~> +JH56 at JcC<$JcC<$JcC<$JcC<$li3+JRfCM1[/Y[WjoBo~> +JXQ(sJcC<$JcC<$JcC<$JcC<$li6,JXI5OWl2]e2[/][sJXQ2!J,~> +JH56 at JcC<$JcC<$JcC<$JcC<$li3+JRfCM1[/Y[WjoBo~> +JH59AJcC<$JcC<$JcC<$JcC<$li3(IRfCM1[/Y[WjoBo~> +JXQ+tJcC<$JcC<$JcC<$JcC<$li6,JX-oFVlN#k2[/][sJXQ2!J,~> +JH59AJcC<$JcC<$JcC<$JcC<$li3(IRfCM1[/Y[WjoBo~> +JH5?CJcC<$JcC<$JcC<$JcC<$l2QhFS,^V2[/Y[WjoBo~> +JXQ2!JcC<$JcC<$JcC<$JcC<$l2TrIWL97Uli>q2[/][sJXQ2!J,~> +JH5?CJcC<$JcC<$JcC<$JcC<$l2QhFS,^V2[/Y[WjoBo~> +JH5EEJcC<$JcC<$JcC<$JcC<$kPpVDS,^V2[/Y[WjoBo~> +JXQ8#JcC<$JcC<$JcC<$JcC<$kPscHW0s.Tm/Z"2[/][sJXQ2!J,~> +JH5EEJcC<$JcC<$JcC<$JcC<$kPpVDS,^V2[/Y[WjoBo~> +JH5HFJcC<$JcC<$JcC<$JcC<$kPpSCS,^V2[JtdXjT'f~> +JXQ;$JcC<$JcC<$JcC<$JcC<$kPscHVjX%Sm/Z"2[K#asJXQ2!J,~> +JH5HFJcC<$JcC<$JcC<$JcC<$kPpSCS,^V2[JtdXjT'f~> +JH5NHJcC<$JcC<$JcC<$JcC<$jo:>@SH$_3[K$4+s8RWMl2Z>~> +JXQA&JcC<$JcC<$JcC<$JcC<$jo=TGV4!kRmJu(2[K$4+s8VcmJXQ2!J,~> +JH5NHJcC<$JcC<$JcC<$JcC<$jo:>@SH$_3[K$4+s8RWMl2Z>~> +JH5TJJcC<$JcC<$JcC<$JcC<$j8Y,>SH$_3[K$4+rVqEKli;P~> +JXQG(JcC<$JcC<$JcC<$JcC<$j8\BEV4!kRmJu(2[K$4+rVuWmJXQ2!J,~> +JH5TJJcC<$JcC<$JcC<$JcC<$j8Y,>SH$_3[K$4+rVqEKli;P~> +JH5WKJcC<$JcC<$JcC<$JcC<$j8Y)=SH$_3[K$4+r;V +JXQJ)JcC<$JcC<$JcC<$JcC<$j8\BEUm[bQmf;.2[K$4+r;ZQmJXQ2!J,~> +JH5WKJcC<$JcC<$JcC<$JcC<$j8Y)=SH$_3[K$4+r;V +JH5ZLJcC<$JcC<$JcC<$JcC<$ir=u +JXQM*JcC<$JcC<$JcC<$JcC<$irA9DUm[_Pn,V73[K$4+qZ$EmJXQ2!J,~> +JH5ZLJcC<$JcC<$JcC<$JcC<$ir=u +JH,ZMJcC<$JcC<$JcC<$JcC<$i;\`9SH$e5[/^+*q>Z!Gn,Rt~> +JXHM+JcC<$JcC<$JcC<$JcC<$i;`*CU7%POnGq at 4[/^+*q>^?mJXQ2!J,~> +JH,ZMJcC<$JcC<$JcC<$JcC<$i;\`9SH$e5[/^+*q>Z!Gn,Rt~> +JH19$JcC<$JcC<$JcC<$JcFX-Mu]CJbQ,$MrW)`nJH53?J,~> +JXM)hJcC<$JcC<$JcC<$JcFX-lN!ZISH&*ZgmPPLrW)`nquD;9p6gF~> +JH19$JcC<$JcC<$JcC<$JcFX-Mu]CJbQ,$MrW)`nJH53?J,~> +JcLB%JcC<$JcC<$JcC<$JcFX-MZB:IbQ,$MrW)ZlJH59AJ,~> +Jsh2iJcC<$JcC<$JcC<$JcFX-lN!WHSH&*ZgmPPLrW)ZlrW%M;p6gF~> +JcLB%JcC<$JcC<$JcC<$JcFX-MZB:IbQ,$MrW)ZlJH59AJ,~> +KE-T'JcC<$JcC<$JcC<$JcFR+MZB7Hc2b3NrrD]kJH5 +KUIDkJcC<$JcC<$JcC<$JcFR+lN!WHS,`$Zh3kVLrrD]krr at V +KE-T'JcC<$JcC<$JcC<$JcFR+MZB7Hc2b3NrrD]kJH5 +K`H](JcC<$JcC<$JcC<$JcFO*M?'1Hc2b3NrrDZjJH5?CJ,~> +KpdMlJcC<$JcC<$JcC<$JcFO*li +K`H](JcC<$JcC<$JcC<$JcFO*M?'1Hc2b3NrrDZjJH5?CJ,~> +L&cf)JcC<$JcC<$JcC<$JcFL)M?'.GciCBOrrDThJH5EEJ,~> +L7*VmJcC<$JcC<$JcC<$JcFL)li +L&cf)JcC<$JcC<$JcC<$JcFL)M?'.GciCBOrrDThJH5EEJ,~> +LB)o*JcC<$JcC<$JcC<$JcFI(M?'.GciCEPrW)HfJH5HFJ,~> +LRE_nJcC<$JcC<$JcC<$JcFI(m/W`GS,`*\h3kVLrW)HfJXQ;$J,~> +LB)o*JcC<$JcC<$JcC<$JcFI(M?'.GciCEPrW)HfJH5HFJ,~> +L]E#+JcC<$JcC<$JcC<$JcFF'M?'+FdK$TQrW)EeJH5KGJ,~> +Lm`hoJcC<$JcC<$JcC<$JcFF'm/W`GRfE$\hO1\LrW)EeJXQ>%J,~> +L]E#+JcC<$JcC<$JcC<$JcFF'M?'+FdK$TQrW)EeJH5KGJ,~> +M#`,,JcC<$JcC<$JcC<$JcFC&M?'+FdK$TQrW)BdJH5NHJ,~> +M4&qpJcC<$JcC<$JcC<$JcFC&mJrfGRfE$\hO1\LrW)BdJXQA&J,~> +M#`,,JcC<$JcC<$JcC<$JcFC&M?'+FdK$TQrW)BdJH5NHJ,~> +MZA>.JcC<$JcC<$JcC<$JcF=$M?'.GdK$QPrW)?cJH5QIJ,~> +Mj].rJcC<$JcC<$JcC<$JcF=$mJrfGS,`*\hjLbLrW)?cJXQD'J,~> +MZA>.JcC<$JcC<$JcC<$JcF=$M?'.GdK$QPrW)?cJH5QIJ,~> +Mu\G/JcC<$JcC<$JcC<$JcF:#M?'1HdK$NOrrDBbJH5TJJ,~> +N1#7sJcC<$JcC<$JcC<$JcF:#mJrfGSH&0\i0ghLrrDBbJXQG(J,~> +Mu\G/JcC<$JcC<$JcC<$JcF:#M?'1HdK$NOrrDBbJH5TJJ,~> +N<"P0JcC<$JcC<$JcC<$JcF:#M#a.Id/^BMrrD?aJH5WKJ,~> +NL>@tJcC<$JcC<$JcC<$JcF:#mJrcFT)\<\iL-nLrrD?aJXQJ)J,~> +N<"P0JcC<$JcC<$JcC<$JcF:#M#a.Id/^BMrrD?aJH5WKJ,~> +NW=Y1JcC<$JcC<$JcC<$JcF7"M#a1JciC +NgYIuJcC<$JcC<$JcC<$JcF7"mJrcFTE"B\iL-qMrW)3_JXQM*J,~> +NW=Y1JcC<$JcC<$JcC<$JcF7"M#a1JciC +NrXb2JcC<$JcC<$JcC<$JcF4!M#a4KciC9LrW)0^JH5]MJ,~> +O-tS!JcC<$JcC<$JcC<$JcF4!mJrcFT`=H\igI"MrW)0^JXQP+J,~> +NrXb2JcC<$JcC<$JcC<$JcF4!M#a4KciC9LrW)0^JH5]MJ,~> +O8sk3JcC<$JcC<$]`6^dJcF=$a8hq6M#a7LpAk3mh#OVXrW)-]JH,ZMJ,~> +OI:\"JcC<$JcC<$]`6^dJcF=$a8hq6mf8iFU&Xierr;iqj-d(MrW)-]JXHM+J,~> +O8sk3JcC<$JcC<$]`6^dJcF=$a8hq6M#a7LpAk3mh#OVXrW)-]JH,ZMJ,~> +OT9t4JcC<$JcC<$^&Q[aJcFF'a8hn5M#a=Np&P$jhuKkYrW)*\JH13~> +OdUe#JcC<$JcC<$^&Q[aJcFF'a8hn5mf8iFU]:#fr;ZWok*`=NrW)*\JXM#~> +OT9t4JcC<$JcC<$^&Q[aJcFF'a8hn5M#a=Np&P$jhuKkYrW)*\JH13~> +OoU(5JcC<$JcC<$^Al[_JcFL)`rMe4M#a at Op&OpgirH1\r;bsZJcL<~> +P*pn$JcC<$JcC<$^Al[_JcFL)`rMe4mf8iFV#U,gq>^BnkF&FOr;bsZJsh,~> +OoU(5JcC<$JcC<$^Al[_JcFL)`rMe4M#a at Op&OpgirH1\r;bsZJcL<~> +P5p16JcC<$JcC<$^&QR^JcFL)`rMb3M?'LQp&OjejoDF]rW)!YK)gE~> +PF7"%JcC<$JcC<$^&QR^JcFL)`rMb3n,SrGV>p5hp](3ml'\ROrW)!YK:.5~> +P5p16JcC<$JcC<$^&QR^JcFL)`rMb3M?'LQp&OjejoDF]rW)!YK)gE~> +P5p16JcC<$JcC<$^AlX^JcFL)`rMb3M?'ORpAjgbkl@^_rW(sXKE-N~> +PF7"%JcC<$JcC<$^AlX^JcFL)`rMb3nGo#GVZ6AjoD\djlC"XOrW(sXKUI>~> +P5p16JcC<$JcC<$^AlX^JcFL)`rMb3M?'ORpAjgbkl@^_rW(sXKE-N~> +PQ6:7JcC<$JcC<$^&QR^JcFI(a8hh3M?'RSpAja`m/X$`rW(pWK`HW~> +PaR+&JcC<$JcC<$^&QR^JcFI(a8hh3nGo#GVuQJknc&Rhm[9sPrW(pWKpdG~> +PQ6:7JcC<$JcC<$^&QR^JcFI(a8hh3M?'RSpAja`m/X$`rW(pWK`HW~> +PlQC8JcC<$JcC<$^&QO]JcFF'aT.q4M?'XUp&OCXp&LogrW(jUL&c`~> +Q'm4'JcC<$JcC<$^&QO]JcFF'aT.q4nGo#GWW2YllMpRGV#UDohuAG!J,~> +PlQC8JcC<$JcC<$^&QO]JcFF'aT.q4M?'XUp&OCXp&LogrW(jUL&c`~> +Q2lL9JcC<$JcC<$]`6F\JcF@%b5e.6M?'[Vp&K[DrW(jUL&c`~> +QC3=(JcC<$JcC<$]`6F\JcF@%b5e.6nGo#GWrMbmJcG]Lhu +Q2lL9JcC<$JcC<$]`6F\JcF@%b5e.6M?'[Vp&K[DrW(jUL&c`~> +QN2U:JcC<$JcC<$]Dp@\JcF$qe,Z'>M?'^WpAfdEs8W&uhZ&?2J,~> +Q^NF)JcC<$JcC<$]Dp@\JcF$qe,Z'>nGo#GX8hnoJcGcMrW(gT!!%hCJ,~> +QN2U:JcC<$JcC<$]Dp@\JcF$qe,Z'>M?'^WpAfdEs8W&uhZ&?2J,~> +QiM^;JcC<$JcC<$]Dp=[JcF'rdf>s=MZBgXpAfdEs8W&uh#E01J,~> +R$iO*JcC<$JcC<$]Dp=[JcF'rdf>s=nGo&HX8hnoJcGcMrW(aR!!%kDJ,~> +QiM^;JcC<$JcC<$]Dp=[JcF'rdf>s=MZBgXpAfdEs8W&uh#E01J,~> +R/hgs=MZBjYpAfdErr;rtg]**1J,~> +R@/X+JcC<$JcC<$])U4ZJcF'rdf>s=nGo&HXT/"pJcG`LrW(^Q!!%nEJ,~> +R/hgs=MZBjYpAfdErr;rtg]**1J,~> +R/hgs=MZBp[p&K[DrVuisgAd$1J,~> +R@/X+JcC<$JcC<$])U4ZJcF'rdf>s=nGo&HY5e1qJcG]KrW([P!!%qFJ,~> +R/hgs=MZBp[p&K[DrVuisgAd$1J,~> +RK.p=JcC<$JcC<$\c:.ZJcF$qe,Z! +R[Ja,JcC<$JcC<$\c:.ZJcF$qe,Z! +RK.p=JcC<$JcC<$\c:.ZJcF$qe,Z! +RfJ$>JcC<$JcC<$\c:+YJcF'rdf>m;Mu^*^pAfdEqu?Wqf`-j0J,~> +S!ej-JcC<$JcC<$\c:+YJcF'rdf>m;o)P5IYlFFtJcGWIrW(UNrrA%HJ,~> +RfJ$>JcC<$JcC<$\c:+YJcF'rdf>m;Mu^*^pAfdEqu?Wqf`-j0J,~> +S,e-?JcC<$JcC<$\Gt"XJcF'rdf>m;N<$3_pAfdEqu?TpfDgd0J,~> +S=+s.JcC<$JcC<$\Gt"XJcF'rdf>m;o)P8JYlFFtJcGWIr;bILrrA(IJ,~> +S,e-?JcC<$JcC<$\Gt"XJcF'rdf>m;N<$3_pAfdEqu?TpfDgd0J,~> +S,e-?JcC<$JcC<$\Gt%YJcF$qe,Yp:NW?Bbp&K[DqZ$Npec1U/J,~> +S=+s.JcC<$JcC<$\Gt%YJcF$qe,Yp:oDkAKZN'UuJcGTHrW(LKrrA+JJ,~> +S,e-?JcC<$JcC<$\Gt%YJcF$qe,Yp:NW?Bbp&K[DqZ$Npec1U/J,~> +SH+6 at JcC<$JcC<$\Gt"XJcF'rdf>g9NW?Ecp&K[Dq>^Eoec1U/J,~> +SXG'/JcC<$JcC<$\Gtamm$WG)ci<_>h3j]2oDkAKZiB_!JcGQGrW(LKrW&%JJ,~> +SH+6 at JcC<$JcC<$\Gt"XJcF'rdf>g9NW?Ecp&K[Dq>^Eoec1U/J,~> +ScF?AJcC<$JcC<$\,XnWJcF'rdf>g9NrZNdp&K[Dq>^BneGkO/J,~> +Ssb00JcC<$JcC<$\,Y^nlC!5'ci +ScF?AJcC<$JcC<$\,XnWJcF'rdf>g9NrZNdp&K[Dq>^BneGkO/J,~> +ScF?AJcC<$JcC<$\,XqXJcF$qdf>g9NrZQepAfdEp](3mdf5 at .J,~> +Ssb00JcC<$JcC<$\,Ydpl'[,&cN!\?gR4K0oDkDL[/]k#JcGKErW(CHrW&+LJ,~> +ScF?AJcC<$JcC<$\,XqXJcF$qdf>g9NrZQepAfdEp](3mdf5 at .J,~> +T)aHBJcC<$JcC<$\,XnWJcF$qe,Yj8O8u]gpAfdEp](0ldf5 at .J,~> +T:(91JcC<$JcC<$\,Yaol'[,&cN!\?gmON/oDkGM[K#t$JcGKEr;b:Gr;`%LJ,~> +T)aHBJcC<$JcC<$\,XnWJcF$qe,Yj8O8u]gpAfdEp](0ldf5 at .J,~> +TE'QCJcC<$JcC<$[f=eVJcF'rdf>a7O8ucip&K[DpAb'kdJo:.J,~> +TUCB2JcC<$JcC<$[f>[oka@#%ci +TE'QCJcC<$JcC<$[f=eVJcF'rdf>a7O8ucip&K[DpAb'kdJo:.J,~> +TE'QCJcC<$JcC<$[f=eVJcF'rdf>a7OT;ljp&K[DpAb$jd/T4.J,~> +TUCB2JcC<$JcC<$[f>[oka@#%ci +TE'QCJcC<$JcC<$[f=eVJcF'rdf>a7OT;ljp&K[DpAb$jd/T4.J,~> +T`BZDJcC<$JcC<$[K"_VJcF$qe,Yd6OoW#lp&K[Dp&Fsjci9+-J,~> +Tp^K3JcC<$JcC<$[K#Uoka@#%cN!V=hO0Z/o`1SO\Gu7&JcGECr;b1DquE%NJ,~> +T`BZDJcC<$JcC<$[K"_VJcF$qe,Yd6OoW#lp&K[Dp&Fsjci9+-J,~> +T`BZDJcC<$JcC<$[f=eVJcF'rdf>[5OoW&mpAfdEo`+jic2Wq,J,~> +Tp^K3JcC<$JcC<$[f>[oka@#%ci +T`BZDJcC<$JcC<$[f=eVJcF'rdf>[5OoW&mpAfdEo`+jic2Wq,J,~> +U&]cEJcC<$JcC<$[K"\UJcF'rdf>X4PQ88opAfdEoDeahbl +U7$T4JcC<$JcC<$[K#Rnka@#%ci<>3ka@\8p&L_Q\c;C(JcG?Ar;b(Ar;`1PJ,~> +U&]cEJcC<$JcC<$[K"\UJcF'rdf>X4PQ88opAfdEoDeahbl +UB#lFJcC<$JcC<$[/\VUJcF$qdf>X4P5r8qp&K[DoDeahbQ!b+J,~> +UR?]5JcC<$JcC<$[/]Lnka@#%cN!83kF%S7p&L\P]`7[*JcG?Ar;b%@quE+PJ,~> +UB#lFJcC<$JcC<$[/\VUJcF$qdf>X4P5r8qp&K[DoDeahbQ!b+J,~> +UB#lFJcC<$JcC<$[K"\UJcF$qe,Y[3OoW8sp&K[Do)JXgb5[\+J,~> +UR?]5JcC<$JcC<$[K#Rnka@#%cN!83ka at V6pAg_O^]4!-JcG<@r;b"?quE.QJ,~> +UB#lFJcC<$JcC<$[K"\UJcF$qe,Y[3OoW8sp&K[Do)JXgb5[\+J,~> +U]>uGJcC<$JcC<$[/\STJcF'rdf>R2O9!/tpAfdEnc/Ofao at S*J,~> +UmZf6JcC<$JcC<$[/]Imka@#%ci<>3ka at V6pAgYM_Z0?1JcG9?r;at>qZ*(QJ,~> +U]>uGJcC<$JcC<$[/\STJcF'rdf>R2O9!/tpAfdEnc/Ofao at S*J,~> +U]>uGJcC<$JcC<$[/\VUJcF$qdf>O1Nr[0!pAfdEnGiFeaT%M*J,~> +UmZf6JcC<$JcC<$[/]Iml'[,&cN!52ka at S5pAgVL`W,Z4JcG6>r;aq=qZ*+RJ,~> +U]>uGJcC<$JcC<$[/\VUJcF$qdf>O1Nr[0!pAfdEnGiFeaT%M*J,~> +V#Z)HJcC<$JcC<$[/\STJcF$qdf>O1N<%'"pAfdEnGiFea8_D)J,~> +V3uo7JcC<$JcC<$[/]Imka@#%cN!83kF%J4pAgPJaT(u7JcG6>r;an +V#Z)HJcC<$JcC<$[/\STJcF$qdf>O1N<%'"pAfdEnGiFea8_D)J,~> +V#Z)HJcC<$JcC<$[/\STJcF'rdf>I/Mu_*%p&K[DnGiCd`rD>)J,~> +V3uo7JcC<$JcC<$[/]Imka@#%ci<>3ka at M3p]-SIbl at A:JcG6>quFb:qZ*.SJ,~> +V#Z)HJcC<$JcC<$[/\STJcF'rdf>I/Mu_*%p&K[DnGiCd`rD>)J,~> +V>u2IJcC<$JcC<$ZiAMTJcF$qdf>I/RfNKgnc7#9p&K[Dn,N=d`W)5(J,~> +VO<#8JcC<$JcC<$ZiB at ll'[,&cN!52ka at M3pAh%Xs8VYXci<\=JcG3=r;ah:q>d(SJ,~> +V>u2IJcC<$JcC<$ZiAMTJcF$qdf>I/RfNKgnc7#9p&K[Dn,N=d`W)5(J,~> +V>u2IJcC<$JcC<$ZiAPUJcF!pdf>F.S,iNfnc7, +VO<#8JcC<$JcC<$ZiBCml'[,&c2[/2kF%A1p]..YrVuGVdf9%AJcG0 +V>u2IJcC<$JcC<$ZiAPUJcF!pdf>F.S,iNfnc7, +VZ=R5aT0Ze`;kJhJcC<$QiGY;JcEsoe,YI-ScJWenc75?pAfdEmJm+b_uH&'J,~> +VjYC$aT0Ze`;kJhJcC<$QiHIRlC!5'bl@&1ka at D0q#I:[qZ$,Sec5 at DJcG-;r;ab8q>d+TJ,~> +VZ=R5aT0Ze`;kJhJcC<$QiGY;JcEsoe,YI-ScJWenc75?pAfdEmJm+b_uH&'J,~> +VZ=U6a8jTe_Z58fJcC<$QiGb>JcEpndf>@,T)eWcnc7ACp&K[DmJm(a_Z,u'J,~> +VjYF%a8jTe_Z58fJcC<$QiHLSm$WG)bQ$o/ka at D0q#I=\p]'iQ!!(^Pp&K[DmJm(a_Z0H4T:(3~> +VZ=U6a8jTe_Z58fJcC<$QiGb>JcEpndf>@,T)eWcnc7ACp&K[DmJm(a_Z,u'J,~> +VuX^7`rOKd_>o/eJcC<$JcC<$]Dp=[MuTINo`+I^h#I'JJcG-;quFS5QiMX~> +W0tO&`rOKd_>o/eJcC<$JcC<$]Dq3tka at A/q#IC^o`+TPrW(aRp&K[DmJm(a_>j?3T:(3~> +VuX^7`rOKd_>o/eJcC<$JcC<$]Dp=[MuTINo`+I^h#I'JJcG-;quFS5QiMX~> +VuX^7`rONe_#T&dJcC<$JcC<$]Dp=[MZ9FOnc/.[huEBMJcG-;qZ+G3R/ha~> +W0tO&`rONe_#T&dJcC<$JcC<$]Dq6ukF%5-q>dO`nc/?OquGXSp&K[DmJm%`_#O62TUC<~> +VuX^7`rONe_#T&dJcC<$JcC<$]Dp=[MZ9FOnc/.[huEBMJcG-;qZ+G3R/ha~> +W;sd7`rONe_#T&dJcC<$JcC<$]`6F\M#X7Nn,MqYoDeUdq#C'gJcG'9quFM3R/ha~> +WL:U&`rONe_#T&dJcC<$JcC<$]`7 +W;sd7`rONe_#T&dJcC<$JcC<$]`6F\M#X7Nn,MqYoDeUdq#C'gJcG'9quFM3R/ha~> +W;sd7`rOQf_#T&dJcC<$JcC<$]Dp=[L]=4Om/QVVp]'mdqu?BjJcG'9qZ+A1RK.j~> +WL:U&`rOQf_#T&dJcC<$JcC<$]Dq3tka at 5+qZ*^cm/R!OpAjsfo`4mhpAfdEli6h^^An$0Tp^E~> +W;sd7`rOQf_#T&dJcC<$JcC<$]Dp=[L]=4Om/QVVp]'mdqu?BjJcG'9qZ+A1RK.j~> +WW9g6a8jZg_#T&dJcC<$JcC<$]Dp=[LB"1Pl2U;Squ?0ds8VcmJcG'9qZ+>0RK.j~> +WgUX%a8jZg_#T&dJcC<$JcC<$]Dq6ukF%))quEjel2UaNo`4mhnGrUhp&K[Dli6h^^&Rm.U7$N~> +WW9g6a8jZg_#T&dJcC<$JcC<$]Dp=[LB"1Pl2U;Squ?0ds8VcmJcG'9qZ+>0RK.j~> +WW9a4aoKoj_>o/eJcC<$JcC<$\c:.ZL&\+Pk5XuPrr;$ZJcG'9qZ+8.RfIs~> +WgUR#aoKoj_>o/eJcC<$JcC<$\c;$ska@/)qZ*gfk5XuPrr;$ZJcG'9qZ+8.q#I1XJ,~> +WW9a4aoKoj_>o/eJcC<$JcC<$\c:.ZL&\+Pk5XuPrr;$ZJcG'9qZ+8.RfIs~> +WrTL+df at ntblE=pJcC<$JcC<$Y5crNK`A(Qj8[X0JcG$8qZ+8.RfIs~> +X-p +WrTL+df at ntblE=pJcC<$JcC<$Y5crNK`A(Qj8[X0JcG$8qZ+8.RfIs~> +WrTL+df at ntc2`FqJcC<$JcC<$XoHiMKE&"QiW%R2JcG!7qZ+2,S,e'~> +X-p +WrTL+df at ntc2`FqJcC<$JcC<$XoHiMKE&"QiW%R2JcG!7qZ+2,S,e'~> +WrTL+df at quc2`FqJcC<$JcC<$XT-`LK)`"Sh>c71JcG!7qZ+/+S,e'~> +X-pc71JcG!7qZ+/+q#I4YJ,~> +WrTL+df at quc2`FqJcC<$JcC<$XT-`LK)`"Sh>c71JcG!7qZ+/+S,e'~> +X8oR+df at quc2`FqJcC<$JcC<$XT-cMJc>`MYlNMXhZ/6-l2UV\\,VruJ,~> +XI6Bodf at quc2`FqJcC<$JcC<$XT.Yfka@#%!<;ut[@,bKhZ/6-l2UV\\,Z4'V3ui~> +X8oR+df at quc2`FqJcC<$JcC<$XT-cMJc>`MYlNMXhZ/6-l2UV\\,VruJ,~> +X8oR+df at u!c2`FqJcC<$JcC<$XT-`LJcG`LZiJ_XiW+Q0l2US[[f;luJ,~> +XI6Bodf at u!c2`FqJcC<$JcC<$XT.Veka@#%rr;uu[[GbIiW+Q0l2US[[f?.'V3ui~> +X8oR+df at u!c2`FqJcC<$JcC<$XT-`LJcG`LZiJ_XiW+Q0l2US[[f;luJ,~> +X8oR+df at u!c2`FqJcC<$JcC<$XT-`LJcG]K[fFqXirFZ1lMp\\[JuctJ,~> +XI6Bodf at u!c2`FqJcC<$JcC<$XT.YfkF$o$rVult\XCtIirFZ1lMp\\[K$"%VO;r~> +X8oR+df at u!c2`FqJcC<$JcC<$XT-`LJcG]K[fFqXirFZ1lMp\\[JuctJ,~> +XT5X+dfA#"c2c/ikl?;7JcEC_i;eH/JcFL)dfAS2iW-Cd\H(%WjT'l3li6e][/ZZsJ,~> +XdQHodfA#"c2c/ikl?;7JcEC_i;eH/JcFL)m/Z=;kPsNA[Jp4,\s^tGjT'l3li6e][/]n$VO;r~> +XT5X+dfA#"c2c/ikl?;7JcEC_i;eH/JcFL)dfAS2iW-Cd\H(%WjT'l3li6e][/ZZsJ,~> +XT5X+dfA&#blH;of`6U'\c;$sVZ56JJcC<$iW%@,m/PZ;\c98Ad/W2-JcG*:q>di$ScF9~> +XdQHodfA&#blH;of`6U'\c;$sVZ56JJcC<$iW&6EkaCf;f)WA]!!'["d/X-6k5^)5m/Qn^ZN'\" +VjW&~> +XT5X+dfA&#blH;of`6U'\c;$sVZ56JJcC<$iW%@,m/PZ;\c98Ad/W2-JcG*:q>di$ScF9~> +XT5X+dfA&#c2cJrd/`Y8dfA>+a8k)skQ(5SaT1c/d/_MmaT0fiVZ> +XdQHoqZ,<;f`1.8kF's%d/`Y8dfA>+a8k)skQ(5SaT1c/d/_MmhuN&1e,Qs-_=9 +])TL4ci +XT5X+dfA&#c2cJrd/`Y8dfA>+a8k)skQ(5SaT1c/d/_MmaT0fiVZ> +XoP^+dfA)$c2cPtaoM&5dfAA,`rP3#iW/WNa8kc1bQ-,l`rO`kUB&mFdfAt=bQ,9T_#Va[jT'l3 +mf3(_Z2^BqJ,~> +Y*lNoquGB;g&L79kF($'aoM&5dfAA,`rP3#iW/WNa8kc1bQ-,lh#Qc/fDhTGf)P+;kF(o at r0bq4 +]Do^8c2[[/lMuM9mf3(_Z2aOuW0r/~> +XoP^+dfA)$c2cPtaoM&5dfAA,`rP3#iW/WNa8kc1bQ-,l`rO`kUB&mFdfAt=bQ,9T_#Va[jT'l3 +mf3(_Z2^BqJ,~> +XoP^+dfA)$c2cZ"`;oT2e,\J-`W53%hZ3?L`rP`2aT0ija8jlmU&`aDe,]+?a8ijP_uS$]jT'l3 +n,N1`YQ(3pJ,~> +Y*lNor;bH;g&L79kF(-*`;oT2e,\J-`W53%hZ3?L`rP`2aT0ija8jlmU&`aDm/Z@ +XoP^+dfA)$c2cZ"`;oT2e,\J-`W53%hZ3?L`rP`2aT0ija8jlmU&`aDe,]+?a8ijP_uS$]jT'l3 +n,N1`YQ(3pJ,~> +XoP^+dfA,%c2c]#_#X91dfAA,`rP?'h#R-J`rPf4`;nNi`rOinTE*RCdfB(@`;mLLa8jB_jT'l3 +nGi:aY5b*oJ,~> +Y*lNor;bH;gAg@:kF(0+s-^b)q#AeCiW$pukl9H=p&E&4p&Du2fDikkgAdfGf)P(:kaD,DpmKD- +])Tj>b5_4(mf7q=nGi:aY5e4rWL88~> +XoP^+dfA,%c2c]#_#X91dfAA,`rP?'h#R-J`rPf4`;nNi`rOinTE*RCdfB(@`;mLLa8jB_jT'l3 +nGi:aY5b*oJ,~> +Y5kd+dfA,%c2cc%^&\!/dfAA,`rPH*gApmGa8kr6_>r6g`rOloT)dIBdfB.B_>q.HbQ,]`joBu4 +nc/@aY5b*oJ,~> +YF2Tor;bH;gAg@:kF(6-rL(M&q>\nDiW$puli5]>o`)u4pA_u0f`/tlg]*lGf)P+;kF))EpR05* +\c9mAa8bk$o)SfYJcG9?p].JspAh1\J,~> +Y5kd+dfA,%c2cc%^&\!/dfAA,`rPH*gApmGa8kr6_>r6g`rOloT)dIBdfB.B_>q.HbQ,]`joBu4 +nc/@aY5b*oJ,~> +Y5kd+dfA/&c2cf&])_^-dfAA,`rPN,f`:[Ea8l#8^Aupda8k#qT)dFAdfB1C^AthEd/_,bjoBu4 +o)JLcX8egmJ,~> +YF2Tor;bH;g]-I;kF(9.r0b>#qZ#"EiW$pumJki>o`)u4q#A)/f`0"mh#EuHec5":kF),Fp6j&' +\c:'F`;fItpAk/[JcG<@q#IJqpAh4]J,~> +Y5kd+dfA/&c2cf&])_^-dfAA,`rPN,f`:[Ea8l#8^Aupda8k#qT)dFAdfB1C^AthEd/_,bjoBu4 +o)JLcX8egmJ,~> +Y5kd+dfA2'blH`&\H)O,e,\D+aT1f0ec>=AaT2/:]`?acaT1,rScI at AdfB4D]`>PAeH!Jdk5^)5 +o)JLcWrJ^lJ,~> +YF2ToquGB;h#HO;kF(.GhuCdun,Lr=oDco4q>\,.g&K.oh#ErGf)P(:kaD8HoU3i% +\,Y!H_Z01pqZ-P^JcG<@q#IGppAh4]J,~> +Y5kd+dfA2'blH`&\H)O,e,\D+aT1f0ec>=AaT2/:]`?acaT1,rScI at AdfB4D]`>PAeH!Jdk5^)5 +o)JLcWrJ^lJ,~> +Y5kd+dfA2'c2ci'\,cI,dfA8)aoLr2ec>7?aoM>=\cCC_b5g>tScI at AdfB7E])]8=gAntfkQ$26 +oDeUdWW/UkJ,~> +YF2Toq>f6;h#HRnc-`3qu=5-f`0+ph#ErGf)P(:kaD;IoU3c# +[K#!L^Ae05nsTIWqjE$8oDeUdWW2YlX-nJ~> +Y5kd+dfA2'c2ci'\,cI,dfA8)aoLr2ec>7?aoM>=\cCC_b5g>tScI at AdfB7E])]8=gAntfkQ$26 +oDeUdWW/UkJ,~> +YQ1j+dfA5(c2ci'[K-:+df at qudfAt=e,\b5dfB:F\H("VdfA5(ScI=@dfB=G\,`l8huLFikQ$26 +p&FdeW;iLjJ,~> +YaMZonGqU;h>c[=kF(U`rNIG +i0h7XrW)8PJcGECp].8mp&M.]J,~> +YQ1j+dfA5(c2ci'[K-:+df at qudfAt=e,\b5dfB:F\H("VdfA5(ScI=@dfB=G\,`l8huLFikQ$26 +p&FdeW;iLjJ,~> +YQ1j+dfA5(c2cl([/g1*e,\"udfB%?dK&P3dfB=G[fFhUdfA5(ScI=@e,]FH[K*T4k5`!kl2ZD8 +p&FdeVZ3=iJ,~> +YaMZonGqU;h>c[=kF(?0[/g1*e,\"udfB%?dK&P3dfB=G[fFhUdfA5(ScI=@m/Z@ +YQ1j+dfA5(c2cl([/g1*e,\"udfB%?dK&P3dfB=G[fFhUdfA5(ScI=@e,]FH[K*T4k5`!kl2ZD8 +p&FdeVZ3=iJ,~> +YQ1j+dfA8)c2cl(ZN1%*df at nte,]. at d/`G2dfB at H[K+_Te,\>)SH.7 at dfB@H[/d6,p&M;rlMuM9 +p&FdeV>m4hJ,~> +YaMZonGqU;hZ)d>kF(?0ZN1%*df at nte,]. at d/`G2dfB at H[K+_Te,\>)SH.7 at li?7;rVuAT`W3%= +p6i,aqZ-/SJcGECp]./jp&M1^J,~> +YQ1j+dfA8)c2cl(ZN1%*df at nte,]. at d/`G2dfB at H[K+_Te,\>)SH.7 at dfB@H[/d6,p&M;rlMuM9 +p&FdeV>m4hJ,~> +YQ1j+dfA8)c2co)Z2jq)df at qudfB+AciE;0e,]IIZiJSTdfA5(ScI=@dfBCIZiG[Wbl@&1JcGHD +pAh#hT`BT~> +YaMZonGqU;hZ)d>kF(B1Z2jq)df at qudfB+AciE;0e,]IIZiJSTdfA5(ScI=@li?7;rr;JU`;kJh +bl at M>oU1:1pAajeV#U,gXI4S~> +YQ1j+dfA8)c2co)Z2jq)df at qudfB+AciE;0e,]IIZiJSTdfA5(ScI=@dfBCIZiG[Wbl@&1JcGHD +pAh#hT`BT~> +YlLp+dfA;*c2cl(Z2jq)df at qudfB1Cc2d,/dfBCIZN/JSdfA8)SH.4?dfBCIZN,RVbl@,3JcGHD +pAgugT`BT~> +Z'h`onGqU;huDm?kF(?0Z2jq)df at qudfB1Cc2d,/dfBCIZN/JSdfA8)SH.4?m/Z=;rr;JU_uPAg +bl at J=pR-U4pAajeU]9ueXdO\~> +YlLp+dfA;*c2cl(Z2jq)df at qudfB1Cc2d,/dfBCIZN/JSdfA8)SH.4?dfBCIZN,RVbl@,3JcGHD +pAgugT`BT~> +YlLp+dfA>+blHf(YQ+\'e,\"ue,]:DblI#.dfBFJYlN;Re,\>)SH.7 at dfBCIZ2fIUb5_#4JcGKE +p&LieT`BT~> +Z'h`onGqU;i;_s?kF(B1YQ+\'e,\"ue,]:DblI#.dfBFJYlN;Re,\>)SH.7 at li?7;rr;GT_uPAg +b5_; +YlLp+dfA>+blHf(YQ+\'e,\"ue,]:DblI#.dfBFJYlN;Re,\>)SH.7 at dfBCIZ2fIUb5_#4JcGKE +p&LieT`BT~> +YlLp+dfA>+c2co)JH47#dfB7Eb5gf,df9CJYQ35RdfA5(ScI=@dfBFJYlK at TaoD#6JcGHDp&Lcc +U&]]~> +Z'h`onGqU;i;`!@kF(B1dfAX#`rOZidfB7Eb5gf,df9CJe,\Hqr;bCJdfA5(ScI=@li?7;s8VMT +k5aM0r;_EKaoD/:rL&6:pAagdT`=]cXdO\~> +YlLp+dfA>+c2co)JH47#dfB7Eb5gf,df9CJYQ35RdfA5(ScI=@dfBFJYlK at TaoD#6JcGHDp&Lcc +U&]]~> +YlLp+dfAA,blHf(JH47#dfB:Fb5gc+e,]OKYQ35RdfA8)SH.4?df9CJYQ07SaoD)8JcGHDo`1Wa +U&]]~> +Z'h`onGqU;iW&*Ak*b90g&TfociDVrdfB:Fb5gc+e,]OKf`9Zmec4(uhZ',Hec5":kEu>Mm[ +YlLp+dfAA,blHf(JH47#dfB:Fb5gc+e,]OKYQ35RdfA8)SH.4?df9CJYQ07SaoD)8JcGHDo`1Wa +U&]]~> +Z2h!+dfAA,c2co)JH44"dfB=GaoL]+JH,ZMec4(uhZ',Hec11#JcEmmq>c*Ho`+O`T)YMbJ,~> +ZC.fonGqU;iW&*AkF(B1g]5`imf;R>eGo:DgmS*?nsS>7r0cgLpAi='mJte*ec5 at Dh3m."iW-WZ +ec5":e!]Y)eX;!gb5_; +Z2h!+dfAA,c2co)JH44"dfB=GaoL]+JH,ZMec4(uhZ',Hec11#JcEmmq>c*Ho`+O`T)YMbJ,~> +Z2h!+dfAD-c2cl(JH44"e,]FHaT1T*JH,ZMec4,!h>a&Hec11#!!%TMb5_; +ZC.fonGqU;irA3BkF(?0hZ1feo)S!BeGo=EgmS*?nX8G[db5_; +Z2h!+dfAD-c2cl(JH44"e,]FHaT1T*JH,ZMec4,!h>a&Hec11#!!%TMb5_; +Z2h!+dfAD-c2co)JH,ZMec4(urVst>kl626!!(UMdfA5(ScI=@JH,ZMJcEmmq>c*Hp]'mdRfB)^ +J,~> +ZC.fonGqU;irA3BkF(B1i;gibo`43Dec5FFgR8$?noU4qCq#JI'o)R.*f)PLFgmR!ukQ&)[ +ec4t9e=#n.d$]Ibb5_; +Z2h!+dfAD-c2co)JH,ZMec4(urVst>kl626!!(UMdfA5(ScI=@JH,ZMJcEmmq>c*Hp]'mdRfB)^ +J,~> +Z2h!+dfAG.c2co)JH5]Mec4(us8U+>l2Q;7!!(RLdfA8)SH.4?JH,ZMJcEmmq>c*Hq>^'eR/`o] +J,~> +ZC.fonGqU;j8\nsSbBp]/@&o`3=+ec5FFgR6puklA,Z +ec5":e!]k/cC'7`b5_; +Z2h!+dfAG.c2co)JH5]Mec4(us8U+>l2Q;7!!(RLdfA8)SH.4?JH,ZMJcEmmq>c*Hq>^'eR/`o] +J,~> +Z2h!+dfAG.c2co)JH,ZMeGmtt!<:%=l2Q;7!!(RLe,\>)SH.7 at JH5]MJcEmmq>c*Hqu?9gQN*][ +J,~> +ZC.fonGqU;j8\ +Z2h!+dfAG.c2co)JH,ZMeGmtt!<:%=l2Q;7!!(RLe,\>)SH.7 at JH5]MJcEmmq>c*Hqu?9gQN*][ +J,~> +Z2h!+dfAJ/c2co)JH5]Mec1p8l2Q;7!!(UMdfA5(ScI=@JH5]MJcEpnq>c*Hr;Z?gQ2dTZJ,~> +ZC.fonGqU;jT"EDkF(B1jT)o\q>f`Iec5CEa-l;pm@!5=p]/C'p]/L*f)PIEh3m+!lN";[ec4t9 +e!]t2bF*q]bQ%D=JcGZJo)P'UoDl+`J,~> +Z2h!+dfAJ/c2co)JH5]Mec1p8l2Q;7!!(UMdfA5(ScI=@JH5]MJcEpnq>c*Hr;Z?gQ2dTZJ,~> +Z2h!+dfAM0blHf(JH5]Mec1s9kl626!!(UMdfA8)SH.4?JH,ZMJcEmmq>c*Hrr;QiPQ.BXJ,~> +ZC.fonGqU;jo=NEk*b90joDr[qZ,iJec5 at DadMStl^?u:pAi='q#JR*f)PIEh3m."lN"8Zec5": +e!^"3b*dh\b5_; +Z2h!+dfAM0blHf(JH5]Mec1s9kl626!!(UMdfA8)SH.4?JH,ZMJcEmmq>c*Hrr;QiPQ.BXJ,~> +ZN.'+dfAM0c2co)JH5]MeGkj8l2Q;7!!(RLdfA8)SH.4?JH,ZMJcEmmq>c*Hnc4gPUB#f~> +Z^IlonGqU;jo=NEkF(B1joDoZquGrKeGo4Bb*h`!lC$o:o`3.&qZ+a+ec5:BhjN@$lN"8Zec5": +e!^%4adI_[b5_; +ZN.'+dfAM0c2co)JH5]MeGkj8l2Q;7!!(RLdfA8)SH.4?JH,ZMJcEmmq>c*Hnc4gPUB#f~> +ZN.'+dfAP1c2cl(JH5]MeGkj8l2Q;7!!(RLe,\>)eGu3 at JH5]MJcEmmq>c3Kn,SRMUB#f~> +Z^IlonGqU;k5XWFkF(?0k5_rYr;c&LeGnn9e!]b,kaC]8m/YV'qZ+^*ec5":kaC9,li?==T)\-W +e!^+6a-hMYb5_; +ZN.'+dfAP1c2cl(JH5]MeGkj8l2Q;7!!(RLe,\>)eGu3 at JH5]MJcEmmq>c3Kn,SRMUB#f~> +ZN.'+dfAP1c2co)JH5ZLec1p8l2Q;7!!(UMdfA8)eGu0?JH,ZMJcEmmq#H3Mmf8CJUB#f~> +Z^IlonGqU;k5XWFkF(B1k5_oXr;c&Lec4t9e!]h.k*bK6m/YV'quFd*f)P(:kaC<-lN$7=ScA$V +e=$47a-hMYb5_8;L]?fCNrS\NZ'g+~> +ZN.'+dfAP1c2co)JH5ZLec1p8l2Q;7!!(UMdfA8)eGu0?JH,ZMJcEmmq#H3Mmf8CJUB#f~> +ZN.'+dfAS2c2cl(JH5ZLec1s9l2Q;7rrCXMdfA8)eGu0?JH,ZMJcEmmq>cBPmJr1FU]>o~> +Z^IlonGqU;kPs`GkF(?0kQ%rWrrD5Mec4t9e=#q/k*bK6li>M&r;aj*f)P(:kaC<-li?==ScA'W +e!^.7`gMDXb5_;uuDMuWDLZ'g+~> +ZN.'+dfAS2c2cl(JH5ZLec1s9l2Q;7rrCXMdfA8)eGu0?JH,ZMJcEmmq>cBPmJr1FU]>o~> +ZN.'+dfAS2c2co)JH5ZLeGkj8l2Q;7!!(RLe,\>)ec;9 at JH5]MJcEmmq>cNTm/VtBU]>o~> +Z^IlonGqU;kPs`GkF(B1kQ%oVrrD8NeGnn9e!]n0jI,94li>P'r;aj*ec5":kaC9,li?@>ScA$V +e!^18`L2;Wb5_; +ZN.'+dfAS2c2co)JH5ZLeGkj8l2Q;7!!(RLe,\>)ec;9 at JH5]MJcEmmq>cNTm/VtBU]>o~> +ZN.'+dfAV3c2cl(JH5ZLec1p8l2Q;7!!(UMdfA8)eGu0?JH5]MJcEmmq>cZXli;b>U]>o~> +Z^IlonGqU;kl9iHkF(?0kQ%oVrrD8Nec4t9e!]t2igK'2m/YV'rW'p*f)P(:kaC<-li?==ScA$V +e!^18`L2;Wb5_; +ZN.'+dfAV3c2cl(JH5ZLec1p8l2Q;7!!(UMdfA8)eGu0?JH5]MJcEmmq>cZXli;b>U]>o~> +ZN.'+dfAY4blHf(JH5WKec1s9kl8p.li5',f)O2!hZ)++Sc?t8lMo!,JcEjlq>dr'rrD3]kQ$57 +U]>o~> +Z^IlonGqU;l2TrIk*b90kQ%iT!!)5Nec4t9e=$(3igK$1m/Z.6li5(pf)P(:kaC<-li?==ScA'W +igK*3b*dh\aoD2;[K$7,k5XWFK)bHCZ'g+~> +ZN.'+dfAY4blHf(JH5WKec1s9kl8p.li5',f)O2!hZ)++Sc?t8lMo!,JcEjlq>dr'rrD3]kQ$57 +U]>o~> +ZN.'+dfAY4c2cl(JH5ZLeGkj8l2T-2jT!I)ec4(uhZ)++Sc@(;jT!I)JcEmmq>dl%o)Jdjh#N$+ +!<8hpJ,~> +Z^IlonGqU;l2TrIkF(?0kl@$;eGnn9e!^%4i0ij0li?19jT!Jmec5":kF(3,li?==ScA'WjdG30 +c'a._b5_;`Mo)Q(aJ,~> +ZN.'+dfAY4c2cl(JH5ZLeGkj8l2T-2jT!I)ec4(uhZ)++Sc@(;jT!I)JcEmmq>dl%o)Jdjh#N$+ +!<8hpJ,~> +ZN.'+dfA\5c2cl(aT1N(cN)JpQN6:MdK&8+cN)Mqe,\A*eGu0?dK&8+c2`Fqb5_;QJcG]K +U]>o~> +Z^IlonGqU;lMp&JkF(?0kQ'V1kPrkreGnn9e!^(5hjNa/li?4:iW%5lec5":kaC<-li?==ScA$V +kF(QJcG]Ko)Q(aJ,~> +ZN.'+dfA\5c2cl(aT1N(cN)JpQN6:MdK&8+cN)Mqe,\A*eGu0?dK&8+c2`Fqb5_;QJcG]K +U]>o~> +ZN.'+dfA\5c2cl(bQ-Z&d/__sQ2p1LdfA;*ciDYsdfA8)eGu0?dfA;*ciAXsaoD2;Z2`MXJcGHD +U]>o~> +Z^IlonGqU;lMp&JkF(?0klBe4ir at Doec4t9e!^+6hO3X.m/Z=;huD&kf)P(:kaC<-li?==ScA$V +kaC?.d$]IbaoD2;Z2`MXJcGHDo)Q(aJ,~> +ZN.'+dfA\5c2cl(bQ-Z&d/__sQ2p1LdfA;*ciDYsdfA8)eGu0?dfA;*ciAXsaoD2;Z2`MXJcGHD +U]>o~> +ZiI-+dfA_6c2ci'c2cc%dK%htQN6:MdfA5(d/_btdfA8)eGu0?dfA8)d/\ataoD2;Z2aFrpAash +JcG0o~> +[$dronGqU;li6/KkF(bljf)P(:kaC<-li?==ScA'W +kF(3,d@#RcaoD2;Z2aFrpAashJcG0 +ZiI-+dfA_6c2ci'c2cc%dK%htQN6:MdfA5(d/_btdfA8)eGu0?dfA8)d/\ataoD2;Z2aFrpAash +JcG0o~> +ZiI-+dfA_6c2cl(c2c`$df at ntQN6:MdfA5(dK%hte,\A*e,Z'>e,\;(dK"juaoD2;YlF at rJcFO* +U]>o~> +[$dronGqU;li6/KkF(?0klBk6hZ)&meGnn9e!^.7h3mO-li?7;h>bokec5":kaC<-lN$4[daoD2;YlF at rJcFO*o)Q(aJ,~> +ZiI-+dfA_6c2cl(c2c`$df at ntQN6:MdfA5(dK%hte,\A*e,Z'>e,\;(dK"juaoD2;YlF at rJcFO* +U]>o~> +ZiI-+dfAb7c2ci'ciDl$df at quQ2p1Le,\8'df at u!dfA8)e,Z*?dfA2'dK"jub5_;o~> +[$dronGqU;m/Q8LkF([db5_; +ZiI-+dfAb7c2ci'ciDl$df at quQ2p1Le,\8'df at u!dfA8)e,Z*?dfA2'dK"jub5_;o~> +ZiI-+dfAe8blHc'ciDi#df at quQN67Le,\8'df at u!dfA8)e,Z*?dfA/&e,Y("aoD2;XoJ%oJcFU, +U]>o~> +[$dronGqU;mJl>LkF(?0klBq8g],`jec4t9e!U19gR7:*m/Z@ +ZiI-+dfAe8blHc'ciDi#df at quQN67Le,\8'df at u!dfA8)e,Z*?dfA/&e,Y("aoD2;XoJ%oJcFU, +U]>o~> +ZiI-+dfAe8c2ci'd/_o#e,\"u`W5'!n,V_QdfA/&df at u!dfA8)e,Z*?e,\5&e,Y("aoD2;XoJ%o +JcFU,U]>o~> +[$dronGqU;mJlAMkF( +ZiI-+dfAe8c2ci'd/_o#e,\"u`W5'!n,V_QdfA/&df at u!dfA8)e,Z*?e,\5&e,Y("aoD2;XoJ%o +JcFU,U]>o~> +ZiI-+dfAh9c2cf&dK%u#e,\"ublH8np]0RYdfA,%eH"/"e,\A*dK#s?dfA,%e,Y("aoD2;XT.qn +JcFX-U]>o~> +[$dronGqU;mf2JNkF(9.l2^(:g&KQieGnn9iL/3qpmLCHli?7;gAf]kec5":kaC<-li?4:T`=?Y +kaC0)e +ZiI-+dfAh9c2cf&dK%u#e,\"ublH8np]0RYdfA,%eH"/"e,\A*dK#s?dfA,%e,Y("aoD2;XT.qn +JcFX-U]>o~> +ZiI-+dfAh9c2ci'dK%r"e,\&!ciD5grW)3_e,\2%eH"2#dfA8)U&`R?dfA,%e,Y("aoD2;X8hkn +JcFX-U]>o~> +[$dronGqU;mf2JNkF( +ZiI-+dfAh9c2ci'dK%r"e,\&!ciD5grW)3_e,\2%eH"2#dfA8)U&`R?dfA,%e,Y("aoD2;X8hkn +JcFX-U]>o~> +ZiI-+dfAk:c2cf&dK%u#df at qudK$HMdfA)$eH"2#dfA8)ScI:?e,\2%eGt1#aoD2;WrM_lJcF[. +U]>o~> +[$dronGqU;n,MSOkF(9.l2^(:g&KNhec4t9kF&LQli?7;g&KTjf)P(:kaC<-li>S(hZ21+m/Z@< +g&KTjJcEjlq>dPqo`0RCi;`?JZ^H=~> +ZiI-+dfAk:c2cf&dK%u#df at qudK$HMdfA)$eH"2#dfA8)ScI:?e,\2%eGt1#aoD2;WrM_lJcF[. +U]>o~> +ZiI-+dfAk:c2cf&dfA&#e,\"udf?NMdfA)$ec=8#e,\>)RfM(?e,\2%eGt1#aoD2;WW2VkJcF^/ +U]>o~> +[$dronGqU;n,MSOkF(9.lN$1;f`0HheGnn9kF&IPli?7;g&KWkec5":kaC9,m/Y\)gAok*m/Z@< +g&KTjJcEjlq>dMpo`0RCiW&HKZ^H=~> +ZiI-+dfAk:c2cf&dfA&#e,\"udf?NMdfA)$ec=8#e,\>)RfM(?e,\2%eGt1#aoD2;WW2VkJcF^/ +U]>o~> +ZiI-+dfAn;c2cf&dK%r"e,\&!df?KLe,\2%eH"2#dfA8)QiPk?dfA)$eGt1#aoD2;W;lPkJcF^/ +U]>o~> +[$dronGqU;nGh\PkF(9.l2^(:f`0Hhec4t9kaAOPm/Z@S(f`9b+li?7; +g&KTjJcEjlq>dJop&K[DiW&EJ[$cF~> +ZiI-+dfAn;c2cf&dK%r"e,\&!df?KLe,\2%eH"2#dfA8)QiPk?dfA)$eGt1#aoD2;W;lPkJcF^/ +U]>o~> +ZiI-+dfAqo~> +[$dronGqU;nc.bPkF(9.lN$1;fDj?gec4t9kaAOPm/Z@V)f)XS*m/Z@< +f`0NjJcEgkq>dGnp&K[DirANK[$cF~> +ZiI-+dfAqo~> +ZiI-+dfAqo~> +[$dronGqU;nc.eQkF(6-lN$1;fDjBheGnn9kaAOPli?7;g&KTjf)P+;kF(3,m/Y\)ec=M*m/Z@< +f`0NjJcEjlq#I>mo`0RCj8\WL[$cF~> +ZiI-+dfAqo~> +ZiI-+dfAt=blH]%dK%r"e,\"ue,ZTMdfA)$ec=8#e,\>)PlT\@dfA)$eGt1#aoD2;V>p5hJcFd1 +U]>o~> +[$dronGqU;o)A]XklBk6i;`*CkaC*'e="hdm/Z@ec5":kaC9,m/Y\)eH"J+ +li?7;g&LgIhO/rpaoD2;V>pJos-`cbJcFd1nGoqaJ,~> +ZiI-+dfAt=blH]%dK%r"e,\"ue,ZTMdfA)$ec=8#e,\>)PlT\@dfA)$eGt1#aoD2;V>p5hJcFd1 +U]>o~> +ZiI-+dfAt=c2cc%dfA#"e,\&!df?KLe,\/$ec=;$dfA5(PlT\@dfA)$eGt1#aoD2;V#U,gJcFg2 +U]>o~> +[$dronGqU;o)A]XklBn7huE!Bl'^0'e="keli?7;XT.YfkaC*'p&O'>f)P(:kaC9,m/Y\)eH"J+ +li?7;g&L^FiL,8saoD2;V#UAnqO)p7jT"`M[$cF~> +ZiI-+dfAt=c2cc%dfA#"e,\&!df?KLe,\/$ec=;$dfA5(PlT\@dfA)$eGt1#aoD2;V#U,gJcFg2 +U]>o~> +ZiI-+dfB">c2c`$dfA#"e,\&!e,ZTMdfA)$eH"2#dfA5(PlT\@e,\/$ec::$aT)):V#U,gJcFg2 +U]>o~> +[$dronGqU;oDeiYl2^"8hZ)pBkaC'&nc7^cmCeX=ne +hZ)sCkaC*'oDmp>JcEgkq>d>kquHV^JcFg2nGoqaJ,~> +ZiI-+dfB">c2c`$dfA#"e,\&!e,ZTMdfA)$eH"2#dfA5(PlT\@e,\/$ec::$aT)):V#U,gJcFg2 +U]>o~> +ZN.'+dfB">c2cc%dK%r"e,\"ue,ZTMdfA)$ec=8#e,\;(PlT\@e,\2%eGt1#aT)):U]:#fJcFj3 +U]>o~> +Z^IlonGqU;oDeiYl2^"8huE!BkaC*'mf;Ld;jquHV^JcFj3nGoqaJ,~> +ZN.'+dfB">c2cc%dK%r"e,\"ue,ZTMdfA)$ec=8#e,\;(PlT\@e,\2%eGt1#aT)):U]:#fJcFj3 +U]>o~> +ZN.'+dfB%?c2c`$dfA#"e,\&!df?KLe,\/$ec=;$dfA2'PlT_AdfA)$eGt1#aoD2;UAsldJcFm4 +U]>o~> +Z^IlonGqU;o`+oYlN$+9hZ)mAl'^0'mJuFd8iquHS]JcFm4nGoqaJ,~> +ZN.'+dfB%?c2c`$dfA#"e,\&!df?KLe,\/$ec=;$dfA2'PlT_AdfA)$eGt1#aoD2;UAsldJcFm4 +U]>o~> +ZN.'+dfB%?c2c`$dfA#"e,\&!df?KLe,\2%eH"2#dfA2'PlT_Ae,\/$ec::$aT)):U&XfdJcFm4 +U]>o~> +Z^IlonGqU;o`+oYlN$+9hZ)pBkaC'&mJuFo~> +ZN.'+dfB(@c2c`$dK%o!e,\&!e,ZTMdfA)$eH"2#dfA/&Q2ohBe,\/$ec::$aT)):U&XccJcFp5 +U]>o~> +Z^IlonGqU;p&FuYli?4:hZ)mAkaC'&mJuFJcEgkq>d5hqZ-M]JcFp5nGoqaJ,~> +ZN.'+dfB(@c2c`$dK%o!e,\&!e,ZTMdfA)$eH"2#dfA/&Q2ohBe,\/$ec::$aT)):U&XccJcFp5 +U]>o~> +ZN.'+dfB+AblHW#dK%r"e,\"ue,ZTMdfA)$ec=8#e,\5&Q2okCdfA)$eGt1#aT)):T`=]cJcFp5 +U]>o~> +Z^IlonGqU;pAb&Ym/Z::hZ)pBkF(!&m/Z@o~> +ZN.'+dfB+Ac2c]#dfA#"e,\&!df?KLe,\2%eH"2#dfA)$QN5tDe,\/$eGt1#aT)):T`=ZbJcFs6 +U]>o~> +Z^IlonGqU;pAb&Ym/Z=;h>cgAkaC'&m/Z@o~> +ZN.'+dfB.Bc2cZ"dfA#"e,\&!e,ZTMdfA)$eH"2#dfA&#QiQ(Ee,\/$ec::$aT)):T)\KaJcFs6 +U]>o~> +Z^IlonGqU;p](,YmJuFl'^-&li?7;f`1OCd[AVc +i;`0EkaC*'mJuL>JcEgkq>d,eqZ-P^JcFs6nGoqaJ,~> +ZN.'+dfB.Bc2cZ"dfA#"e,\&!e,ZTMdfA)$eH"2#dfA&#QiQ(Ee,\/$ec::$aT)):T)\KaJcFs6 +U]>o~> +ZN.'+dfB.Bc2c]#dK%o!eH",!e,ZTMdfA)$ec=8#e,\)"R/l1Fe,\2%eGt1#aT)):T)\H`JcG!7 +U]>o~> +Z^IlonGqU;p](,YmJuFcgAkF's%m/ZC=eGnn9kaAOPli?7;g&LF>lC$3&m/Z@l'[,&aT)):T)\Wer0`-9l2U8R[$cF~> +ZN.'+dfB.Bc2c]#dK%o!eH",!e,ZTMdfA)$ec=8#e,\)"R/l1Fe,\2%eGt1#aT)):T)\H`JcG!7 +U]>o~> +ZN.'+dfB1Cc2cZ"dfA#"e,\&!df?KLe,\/$ec=;$df at ntRfMFIdfA)$eGt1#aT)):T)\H`JcG$8 +UB#f~> +Z^IlonGqU;q#C2Ymf;O=h#H^@kaC'&m/Z@l'[,&aT)):T)\Wer0`-9lMp>R[$cF~> +ZN.'+dfB1Cc2cZ"dfA#"e,\&!df?KLe,\/$ec=;$df at ntRfMFIdfA)$eGt1#aT)):T)\H`JcG$8 +UB#f~> +ZN.'+dfB1Cc2cZ"dfA#"e,\&!df?KLe,\2%eH"2#df at eqScIaLe,\/$ec::$a8bu9ScA?_JcG'9 +UB#f~> +Z^IlonGqU;q#C2Ymf;O=h#H^@kaC'&m/Z@ +ZN.'+dfB1Cc2cZ"dfA#"e,\&!df?KLe,\2%eH"2#df at eqScIaLe,\/$ec::$a8bu9ScA?_JcG'9 +UB#f~> +ZN.'+dfB4Dc2cW!dfA#"e,\&!e,ZTMdfA)$eH"2#df?0CblH]%e,\/$ec::$a8bu9ScA?_JcG'9 +UB#f~> +Z^IlonGqU;q>^8Yn,VX>g]-X at kF's%m/Z@l'^-&m/Z=;U]8T,i;`0E +kaC*'m/ZF>JcEdjq>d)dq#LA]JcG'9n,Th`J,~> +ZN.'+dfB4Dc2cW!dfA#"e,\&!e,ZTMdfA)$eH"2#df?0CblH]%e,\/$ec::$a8bu9ScA?_JcG'9 +UB#f~> +Z2h!+dfB7EblHQ!dK%r"e,\"ue,ZTMdfA)$ec=8#e,Z0AcN)r(dfA)$eGt1#aT)):S,`0^JcG'9 +UB#f~> +ZC.fonGqU;qZ$>YnGq^>h#H^@kF(!&li?:lC$3&m/Z@d#bq#LD^JcG'9n,Th`J,~> +Z2h!+dfB7EblHQ!dK%r"e,\"ue,ZTMdfA)$ec=8#e,Z0AcN)r(dfA)$eGt1#aT)):S,`0^JcG'9 +UB#f~> +Z2h!+dfB7Ec2cW!dfA#"e,\&!df?KLe,\2%eH"2#df?$?ciE&)dfA)$eGt1#aT)):S,`-]JcG*: +UB#f~> +ZC.fonGqU;qZ$>YnGqa?g]-U?kaC'&li?:d#bq#LA]JcG*:n,Th`J,~> +Z2h!+dfB7Ec2cW!dfA#"e,\&!df?KLe,\2%eH"2#df?$?ciE&)dfA)$eGt1#aT)):S,`-]JcG*: +UB#f~> +Z2h!+dfB:Fc2cSudfA#"e,\&!e,ZTMdfA)$eH"2#df?$?ciE&)e,\/$ec::$a8bu9RfE']JcG*: +UB#f~> +ZC.fonGqU;qu?DYnc7j at gAgO?kF's%m/Z@JcEdjq>cuaq#LD^JcG*:n,Th`J,~> +Z2h!+dfB:Fc2cSudfA#"e,\&!e,ZTMdfA)$eH"2#df?$?ciE&)e,\/$ec::$a8bu9RfE']JcG*: +UB#f~> +Z2h!+dfB:Fc2cSudfA&#e,\"ue,ZTMdfA)$eH"2#e,Z*?ciE&)e,\2%eGt1#a8bu9RfE$\JcG-; +UB#f~> +ZC.fonGqU;qu?DYnc7j at gAgO?kF(!&li?:cuap]1;]JcG-;n,Th`J,~> +Z2h!+dfB:Fc2cSudfA&#e,\"ue,ZTMdfA)$eH"2#e,Z*?ciE&)e,\2%eGt1#a8bu9RfE$\JcG-; +UB#f~> +Z2h!+dfB=Gc2cSudK%r"e,\"ue,ZTMe,\2%eH"2#df?!>d/`/*dfA)$eGt1#aT)&9RK)s\JcG0< +U&]]~> +ZC.fonGqU;r;ZJYo)RsAgAgL>kF(!&li?: +Z2h!+dfB=Gc2cSudK%r"e,\"ue,ZTMe,\2%eH"2#df?!>d/`/*dfA)$eGt1#aT)&9RK)s\JcG0< +U&]]~> +Z2h!+dfB=Gc2cSudK%r"e,\&!df?KLe,\2%eH"2#df?!>d/`/*e,\/$eGt1#aT)):R/cgZJcG3= +U&]]~> +ZC.fonGqU;r;ZJYo)RsAgAgO?k*am%m/Z@co_p]1;]JcG3=mf9__J,~> +Z2h!+dfB=Gc2cSudK%r"e,\&!df?KLe,\2%eH"2#df?!>d/`/*e,\/$eGt1#aT)):R/cgZJcG3= +U&]]~> +YlLp+dfB at Hc2cPtdK%r"e,\&!e,ZTMdfA)$eH"2#df?!>d/`/*e,\2%eGt1#a8bu9QiHaZJcG3= +U&]]~> +Z'h`onGqU;rVuPYoDn'Bg&LF>k*am%m/Z@cl^q#LD^JcG3=mf9__J,~> +YlLp+dfB at Hc2cPtdK%r"e,\&!e,ZTMdfA)$eH"2#df?!>d/`/*e,\2%eGt1#a8bu9QiHaZJcG3= +U&]]~> +YlLp+dfBCIblHGsdK%u#e,\"ue,ZTMdfA)$ec=8#e,Z'>d/`/*e,\2%eGt1#a8bu9QiHaZJcG3= +U&]]~> +Z'h`onGqU;rr;VYoDn'Bg&LF>k*ap&li?:lC$3&m/Z@cl^p]1>^JcG3=mf9__J,~> +YlLp+dfBCIblHGsdK%u#e,\"ue,ZTMdfA)$ec=8#e,Z'>d/`/*e,\2%eGt1#a8bu9QiHaZJcG3= +U&]]~> +YlLp+dfBCIc2cMsdK%u#e,\&!df?KLe,\2%eH"2#df?!>d/`/*dfA)$eGt1#a8bu9QiH^YJcG6> +U&]]~> +Z'h`onGqU;rr;VYo`40Cf`1@>jdFg%li?:cl^p]1;]JcG6>mf9__J,~> +YlLp+dfBCIc2cMsdK%u#e,\&!df?KLe,\2%eH"2#df?!>d/`/*dfA)$eGt1#a8bu9QiH^YJcG6> +U&]]~> +YlLp+dfBFJc2cMsd/_l"e,\&!e,ZTMdfA)$eH"2#df?!>d/`/*e,\/$ec::$e,Sh9Q2gOXJcG9? +T`BT~> +Z'h`onGqU;s8V\Yp&O9Df`1==jdFg%m/Z@JcF4!mJrOPp]1>^JcG9?mJsV^J,~> +YlLp+dfBFJc2cMsd/_l"e,\&!e,ZTMdfA)$eH"2#df?!>d/`/*e,\/$ec::$e,Sh9Q2gOXJcG9? +T`BT~> +YlLp+dfBFJc2cMsd/_o#e,\"ue,ZTMdfA)$eH"2#e,Z'>d/`/*e,\2%eGt1#f`119Q2gLWJcG<@ +T`BT~> +Z'h`onGqU;s8V\Yp&O9Df`1==jdFj&li?:l'^-&m/Z@ +YlLp+dfBFJc2cMsd/_o#e,\"ue,ZTMdfA)$eH"2#e,Z'>d/`/*e,\2%eGt1#f`119Q2gLWJcG<@ +T`BT~> +YQ1j+df9CJc2cJrciDi#e,\"ue,ZTMe,\2%eH"2#df?!>d/`/*dfA)$eGt1#g]-=7QiH^YJcG<@ +T`BT~> +YaMZonGqU;!<;VXpAjBEfDk4 +YQ1j+df9CJc2cJrciDi#e,\"ue,ZTMe,\2%eH"2#df?!>d/`/*dfA)$eGt1#g]-=7QiH^YJcG<@ +T`BT~> +YQ1j+T)dLCcN)f$df at qudf?KLe,\2%eH"2#df?!>d/`/*e,\/$eGt1#hZ)I5RK)mZJcG?AT`BT~> +YaMZonGq%+pAjBEfDk7=igJX&lN$1;ec4t9kaAOPm/Z@ +YQ1j+T)dLCcN)f$df at qudf?KLe,\2%eH"2#df?!>d/`/*e,\/$eGt1#hZ)I5RK)mZJcG?AT`BT~> +YQ1j+TE*RCcN)f$df at que,ZTMdfA)$eH"2#df?!>d/`/*e,\2%eGt1#huDC1S,`-]JcGBBTE'K~> +YaMZonGq%+p]0KFf)P. +YQ1j+TE*RCcN)f$df at que,ZTMdfA)$eH"2#df?!>d/`/*e,\2%eGt1#huDC1S,`-]JcGBBTE'K~> +YQ1j+TE*UDblHZ$df at nte,ZTMdfA)$ec=8#e,Z*?ciE&)e,\2%eGt1#iW%L0SH&6^JcGBBTE'K~> +YaMZonGq%+p]0KFfDk4lC$3&m/Z@ +YQ1j+TE*UDblHZ$df at nte,ZTMdfA)$ec=8#e,Z*?ciE&)e,\2%eGt1#iW%L0SH&6^JcGBBTE'K~> +Y5kd+T`E[Db5gT&d/__sdf?KLe,\2%eH"2#df?$?ciE&)dfA)$eGt1#ir at L.T)\H`JcGBBTE'K~> +YF2TonGq%+q#KTGf)P+;hjNO)klBt9ec4t9kaAOPm/Z@ +Y5kd+T`E[Db5gT&d/__sdf?KLe,\2%eH"2#df?$?ciE&)dfA)$eGt1#ir at L.T)\H`JcGBBTE'K~> +Y5kd+U&`aDaT1Q)c2cDpdf?NMdfA)$eH"2#df?$?ciE&)e,\2%eGt1#j8[I+TE"QaJcGECTE'K~> +YF2TonGq%+q>f]Hec5%;gmRC+k5a_6ec4t9kaARQli?7;g&LC=lC$6'li?7;TE" +Y5kd+U&`aDaT1Q)c2cDpdf?NMdfA)$eH"2#df?$?ciE&)e,\2%eGt1#j8[I+TE"QaJcGECTE'K~> +Y5kd+U&`aDJH5ZLeGn"uXT-`Lg&KS&f)O5"T`<:;iW%C-g&KS&JcFg2c2aO;o`0RCpA^`bJ,~> +YF2TonGq%+q>f]Hec5%;e!\efl'^'$m/Z@ +Y5kd+U&`aDJH5ZLeGn"uXT-`Lg&KS&f)O5"T`<:;iW%C-g&KS&JcFg2c2aO;o`0RCpA^`bJ,~> +Y5kd+UB&gDJH5ZLeGn"uXT-cMg&KS&f)O2!hZ&] +YF2TonGq%+qZ,fIeGnq:e!\efl'^'$m/Z@ +Y5kd+UB&gDJH5ZLeGn"uXT-cMg&KS&f)O2!hZ&] +XoP^+UB&gDJH5ZLec4(uXT-cMg&KS&f)O2!hZ&] +Y*lNonGq%+qZ,fIeGnq:e!\hgkaC!$li?7;XT.YfkaC-(li?==f)P(:kaC<-XT7INiW&6EkaC-( +m/ZC=JcFp5blI^1UAsoe!1AE +XoP^+UB&gDJH5ZLec4(uXT-cMg&KS&f)O2!hZ&] +XoP^+U]AmDJH5ZLec4,!XT-`Lg&KS&f)O2!huAc +Y*lNonGq%+quGoJe,Sk:d[A_fkaC!$li?: +XoP^+U]AmDJH5ZLec4,!XT-`Lg&KS&f)O2!huAc +XoP^+U]ApEJH5ZLeGn"uXT-`LgAf\'ec4,!hZ&Z;iW%C-g&KS&JcFs6_uQV5o`0RCq#?ocJ,~> +Y*lNonGq%+quGoJeGnq:d[A_fl'^'$m/Z@ +XoP^+U]ApEJH5ZLeGn"uXT-`LgAf\'ec4,!hZ&Z;iW%C-g&KS&JcFs6_uQV5o`0RCq#?ocJ,~> +XT5X+V#]!EJH5ZLec4(uXT-cMg&KS&f)O2!hZ&]pG4o`0RCq#?ocJ,~> +XdQHonGq%+r;c#Ke,Sh9d[A_fl'^*%li?7;XT.YfkaC-(li?==f)P(:kaC<-X8qCNiW&6EkaC-( +m/ZC=JcG!7b5hC,rrAnqo`0RCq#B^]ZC-4~> +XT5X+V#]!EJH5ZLec4(uXT-cMg&KS&f)O2!hZ&]pG4o`0RCq#?ocJ,~> +XT5X+V#]!EJH5ZLec4(uXoHiMg&KS&f)O2!huAcZucJ,~> +XdQHonGq%+rW))Ke,Sh9d[AbgkaC!$li?7;XoI_fkaC-(li?==f)P(:kaC?.WrV:MiW&6El'^6) +li?==JcG!7aoM:+rW&epp&K[Dq>]d]ZC-4~> +XT5X+V#]!EJH5ZLec4(uXoHiMg&KS&f)O2!huAcZucJ,~> +XT5X+V?#'EJH5]MeGn"uXT-`Lg&KS&f)O5"hZ&Z;iW%C-g&KS&JcG$8^At,1o`0RCqZ!)dJ,~> +XdQHonGq%+rW),Ldf8_8d[Abgl'^'$m/Z@ZJ,~> +XT5X+V?#'EJH5]MeGn"uXT-`Lg&KS&f)O5"hZ&Z;iW%C-g&KS&JcG$8^At,1o`0RCqZ!)dJ,~> +X8oR+VZ>-EJH5]MeGn"uXT-`LgAf\'f)O2!hZ&Z;ir at I-g&KS&JcG'9]`=r0o`0RCqZ!)dJ,~> +XI6BonGq%+rrD5MdJrY8d@&Yfl'^'$m/Z@ +X8oR+VZ>-EJH5]MeGn"uXT-`LgAf\'f)O2!hZ&Z;ir at I-g&KS&JcG'9]`=r0o`0RCqZ!)dJ,~> +X8oR+VZ>-EXoJJ%df at qudf?KLe,\2%eH"2#dfA8)OT=A?dfA)$eGt1#m/OZtVuQDiJcGWIS,e'~> +XI6BonGq%+rrD5MdJrY8d@'J(!<;BckaC!$li?7;XT.YfkaC-(li?==f)P(:kaC<-X8qCNiW&6E +kaC-(m/ZC=JcG*:f`:9)qZ*Poo`0RCqu?!_Z'g+~> +X8oR+VZ>-EXoJJ%df at qudf?KLe,\2%eH"2#dfA8)OT=A?dfA)$eGt1#m/OZtVuQDiJcGWIS,e'~> +WrTL+VuY3EY5nV&df at qudf?NMdfA)$eH"2#dfA;*O9"8>e,\2%eGt1#li4NrVuQGjJcGWIS,e'~> +X-p +WrTL+VuY3EY5nV&df at qudf?NMdfA)$eH"2#dfA;*O9"8>e,\2%eGt1#li4NrVuQGjJcGWIS,e'~> +WrTL+VuY3EY5nV&e,\"ue,ZTMdfA,%e,\)"e,\A*O9"8>e,\2%eGt1#m/OQqW;lMjJcGZJS,e'~> +X-plH$r;`erp&G)\JcGZJli=;YJ,~> +WrTL+VuY3EY5nV&e,\"ue,ZTMdfA,%e,\)"e,\A*O9"8>e,\2%eGt1#m/OQqW;lMjJcGZJS,e'~> +WrTL+W;t6DYlOh(df at qudf?KLe,\2%eH"2#dfA8)OT=A?dfA)$eGt1#mJjWqW;lMjJcG]KRfIs~> +X-p +WrTL+W;t6DYlOh(df at qudf?KLe,\2%eH"2#dfA8)OT=A?dfA)$eGt1#mJjWqW;lMjJcG]KRfIs~> +WW9F+W;t6DZ2jn(df at qudf?NMdfA)$eH"2#dfA;*O9"8>dfA,%e,Y("mJjTpWW2VkJcG]KRfIs~> +WgU6onGp+fcN!D7c'e8*rr;?ckF'm#li?7;XoI_fkaC-(li?==f)P(:kaC?.X8q at MiW&6EkaC0) +li?: +WW9F+W;t6DZ2jn(df at qudf?NMdfA)$eH"2#dfA;*O9"8>dfA,%e,Y("mJjTpWW2VkJcG]KRfIs~> +WW9F+WW:>e,\2%eGt1#mJjQoWW2VkJcG]KRfIs~> +WgU6onGp.gc2[;6bF/,*rr;Eek*aa!m/Z@ +WW9F+WW:>e,\2%eGt1#mJjQoWW2VkJcG]KRfIs~> +WW9F+WrUBDZN1")df at nte,ZTMdfA,%eH"/"e,\A*OT=A?dfA)$eGt1#mJjNnWrM\kJcGcMRK.j~> +WgU6onGp1hbl at 25adN#+rr;Kgj-eEsm/Z@ +WW9F+WrUBDZN1")df at nte,ZTMdfA,%eH"/"e,\A*OT=A?dfA)$eGt1#mJjNnWrM\kJcGcMRK.j~> +W;s at +WrUBDZiL()df at qudf?KLe,\2%eH"2#dfA8)OoXG?dfA,%e,Y("mf0TnWrM\kJcGcMRK.j~> +WL:0onGp1hbl at 25`0pT(e!\bdli?7;XT.YfkaC-(li?==f)P(:kaC<-Y5mXOi;`-DkaC0)li?:< +JcG0 +W;s at +WrUBDZiL()df at qudf?KLe,\2%eH"2#dfA8)OoXG?dfA,%e,Y("mf0TnWrM\kJcGcMRK.j~> +W;s at +X8pEC[/g1*df at qudf?NMdfA)$eH"2#dfA;*OT=>>e,\2%eGt1#mf0NlX8helJc>`MR/ha~> +WL:0onGp4ib5_#4`0pT(e!\bdli?7;XoI_fkaC-(m/ZC=f)P+;kF(6-li`MlN",VJ,~> +W;s at +X8pEC[/g1*df at qudf?NMdfA)$eH"2#dfA;*OT=>>e,\2%eGt1#mf0NlX8helJc>`MR/ha~> +VuX:+X8pEC[fH=*e,\"ue,ZTMdfA,%e,\)"e,\A*OoXD>e,\2%eGt1#mf0NlX8helJc>`MR/ha~> +W0t*onGp4ib5_#4`gQ`(e="hdm/Z@`MlN",VJ,~> +VuX:+X8pEC[fH=*e,\"ue,ZTMdfA,%e,\)"e,\A*OoXD>e,\2%eGt1#mf0NlX8helJc>`MR/ha~> +VuX:+XT6HB\H)O,df at qudf?KLe,\2%e,\,#dfA8)P5sM?dfA)$eGt1#mf0KkXT.klK)_2 +W0t*onGp7jaT(i3a-li)e!\bdli?7;XT.YfkaC-(li?: +VuX:+XT6HB\H)O,df at qudf?KLe,\2%e,\,#dfA8)P5sM?dfA)$eGt1#mf0KkXT.klK)_2 +VZ=4+XT6HB\cDU,aT1N(_>q=Mb5g5qbQ-i+_>rg"P5sbFb5g8rb5d+nq#@MtX8helK)_2 +VjY$onGp7jaT(l4a-lf(adM>lj8e)*^Am6okaC-(m/Z(4kPsTChjN^.lit3 +JcGNFjoEPlX8helK)b-:Y*je~> +VZ=4+XT6HB\cDU,aT1N(_>q=Mb5g5qbQ-i+_>rg"P5sbFb5g8rb5d+nq#@MtX8helK)_2 +VZ=4+XoQKA]E%d-a8kK)^];1MaoL/qaoL]+^][StXT.nmKE%8 +VjY$onGp:k`rG]3aI2l(aI2;mj8e#(_#NEpkaC0)li>q2l2TfEh3mO-li=#Qk5XKBkaC-(li>q2 +JcGQGk5`SkXT.nmKE(3:Y*je~> +VZ=4+XoQKA]E%d-a8kK)^];1MaoL/qaoL]+^][StXT.nmKE%8 +V?".+Y5lN@^B"'/`W5?)^&Z%MaT1&paT1W+^] +VO=sonGp=l`;fN2b*i&)`gQ/mirIl&_Z/WrkF('(li>n1lMooFh3mO-m/X,Rk5XHAkaC-(m/Yt1 +JcGTHkQ&YkXT.nmKE(6;XdO\~> +V?".+Y5lN@^B"'/`W5?)^&Z%MaT1&paT1W+^] +V?".+Y5lK?_#X60`W5?)^&Z%MaoL,paT1Z,^&[HuQN6+HaoL/qa8gekqu +VO=sonGp=l_uKH2bF/,)`gQ/mirIl&_Z/WrkaC-(li>n1li5uFgmRI-m/X2TjT"6?kaC0)li>k0 +JcGWIkQ&VjXT.nmK`C<;XdO\~> +V?".+Y5lK?_#X60`W5?)^&Z%MaoL,paT1Z,^&[HuQN6+HaoL/qa8gekqu +V#\(+YQ2N>_uTK1`W5?)^&Z%MaoL,paT1W+^]<["QiQ.GaoL/qa8gekqu +V4"monGp at m_>j91c'e8)`gQ/mirIl&_Z/WrkaC-(m/Yt1lMorGgmRI-li=/UirA'>kF('(li>k0 +JcGWIklA\jXT.nmK`C<;XdO\~> +V#\(+YQ2N>_uTK1`W5?)^&Z%MaoL,paT1W+^]<["QiQ.GaoL/qa8gekqu +V#\(+YQ2K=`rP`2`rPE)^&Z"Lb5g8ra8kN*^]<["RK2:Gb5g5qaT-nlqZ!VsXoJ"nL&[D +V4"monGp at m_#O31c^FD)m[4%TgR7@,j8dr&_>iQrkaC0)li>k0lMorGgmRI-li=5Wi;_jn1JcGTHl2\_iXoJ"nL&^E +V#\(+YQ2K=`rP`2`rPE)^&Z"Lb5g8ra8kN*^]<["RK2:Gb5g5qaT-nlqZ!VsXoJ"nL&[D +U]A"+YlMNrj#T)dUFbQ-AsaT-nlqZ!SrXoJ"nL&[D +Um\gonGpCn^An$0d@'S*m[=(TgmRC+jT+)(^]3ErkF('(li>n1kl9cFh3mO-m/XJ\gAg77kaC0) +li>n1JcGTHklAVhXoJ"nL&^E +U]A"+YlMNrj#T)dUFbQ-AsaT-nlqZ!SrXoJ"nL&[D +U]A"+YlMH:cN*G6aT1B$`W3UMcN)YubQ-Z&a8gekgAfJ!gAf=rJcGNFWrT:%oDjXGPQ64~> +Um\gonGpCn]`7m0e=#e*m[=(ThO3F(kQ'M.])UsokaC-(m/Z(4irA6Ci0f/rgAg@:kaC0)li>t3 +JcGNFl2\\hXoJ"nLB$K +U]A"+YlMH:cN*G6aT1B$`W3UMcN)YubQ-Z&a8gekgAfJ!gAf=rJcGNFWrT:%oDjXGPQ64~> +UB#lFU]8jEJcC<$JcC<$JcC<$JcG0 +UR?]5U]:;nfU7 +UB#lFU]8jEJcC<$JcC<$JcC<$JcG0 +U&]cEUArsJJcC<$JcC<$JcC<$JcG$8WW94%oDj[HP5p+~> +U7$T4UAk2ngmN`nJcC<$JcC<$JcC<$lMp/M^mVA*oDj[Hkl at cPJ,~> +U&]cEUArsJJcC<$JcC<$JcC<$JcG$8WW94%oDj[HP5p+~> +U&]cERfDROJcC<$JcC<$JcC<$JcFj3WW94%oDj^IOoU"~> +U7$T4RfDT>JcC<$JcC<$JcC<$JcFj3li=egY5e+oM#ZZ=X-nJ~> +U&]cERfDROJcC<$JcC<$JcC<$JcFj3WW94%oDj^IOoU"~> +T`BZDJcC<$JcC<$JcC<$JcC<$k5VF]XoJ"nM>r_=J,~> +Tp^K3JcC<$JcC<$JcC<$JcC<$k5XcJ^R;5(oDjaJkl@`OJ,~> +T`BZDJcC<$JcC<$JcC<$JcC<$k5VF]XoJ"nM>r_=J,~> +T`BZDJcC<$JcC<$JcC<$JcC<$k5VF]XoJ"nMZ8e=J,~> +Tp^K3JcC<$JcC<$JcC<$JcC<$k5XfK^6u,'oDjdKkQ%WNJ,~> +T`BZDJcC<$JcC<$JcC<$JcC<$k5VF]XoJ"nMZ8e=J,~> +TE'QCJcC<$JcC<$JcC<$JcC<$kl7U^XoJ"nMuSk=J,~> +TUCB2JcC<$JcC<$JcC<$JcC<$kl:#M]pZ#&oDjgLkQ%TMJ,~> +TE'QCJcC<$JcC<$JcC<$JcC<$kl7U^XoJ"nMuSk=J,~> +T)aHBJcC<$JcC<$JcC<$JcC<$l2R^_XoJ"nMuSk=J,~> +T:(91JcC<$JcC<$JcC<$JcC<$l2U,N]pZ#&oDjgLkQ%TMJ,~> +T)aHBJcC<$JcC<$JcC<$JcC<$l2R^_XoJ"nMuSk=J,~> +T)aHBJcC<$JcC<$JcC<$JcC<$l2R^_XoJ"nN;nq=J,~> +T:(91JcC<$JcC<$JcC<$JcC<$l2U,N]pZ#&oDjjMkQ%QLJ,~> +T)aHBJcC<$JcC<$JcC<$JcC<$l2R^_XoJ"nN;nq=J,~> +ScF?AJcC<$JcC<$JcC<$JcC<$lMmg`XoJ"nN;nq=J,~> +Ssb00JcC<$JcC<$JcC<$JcC<$lMp8P]U>o%oDjjMkQ%QLJ,~> +ScF?AJcC<$JcC<$JcC<$JcC<$lMmg`XoJ"nN;nq=J,~> +SH+6 at JcC<$JcC<$JcC<$JcC<$li3paXoJ"nNW5"=J,~> +SXG'/JcC<$JcC<$JcC<$JcC<$li6AQ]U>o%oDjmNkQ%NKJ,~> +SH+6 at JcC<$JcC<$JcC<$JcC<$li3paXoJ"nNW5"=J,~> +SH+6 at JcC<$JcC<$JcC<$JcC<$li3paY5e(nNrP(=J,~> +SXG'/JcC<$JcC<$JcC<$JcC<$li6AQ]U>r&o)OgNk5_EJJ,~> +SH+6 at JcC<$JcC<$JcC<$JcC<$li3paY5e(nNrP(=J,~> +S,e-?JcC<$JcC<$JcC<$JcC<$li3sbY5e(nO8k.=J,~> +S=+s.JcC<$JcC<$JcC<$JcC<$li6GS]:#i%o)OjOk5_BIJ,~> +S,e-?JcC<$JcC<$JcC<$JcC<$li3sbY5e(nO8k.=J,~> +RfJ$>JcC<$JcC<$JcC<$JcC<$m/O'cY5e(nO8k.=J,~> +S!ej-JcC<$JcC<$JcC<$JcC<$m/QPT]:#i%o)OjOk5_BIJ,~> +RfJ$>JcC<$JcC<$JcC<$JcC<$m/O'cY5e(nO8k.=J,~> +RK.p=JcC<$JcC<$JcC<$JcC<$mJj0dY5e(nOT14=J,~> +R[Ja,JcC<$JcC<$JcC<$JcC<$mJlYU]:#i%o)OmPk5_?HJ,~> +RK.p=JcC<$JcC<$JcC<$JcC<$mJj0dY5e(nOT14=J,~> +RK.p=JcC<$JcC<$JcC<$JcC<$mJj3eXoItmOoL:=J,~> +R[Ja,JcC<$JcC<$JcC<$JcC<$mJl\V]:#f$o)OpQjoD6GJ,~> +RK.p=JcC<$JcC<$JcC<$JcC<$mJj3eXoItmOoL:=J,~> +R/hg +R@/X+JcC<$JcC<$JcC<$JcC<$mf2eW]:#f$o)OsRjoD3FJ,~> +R/hg +QiM^;JcC<$JcC<$JcC<$JcC<$n,KEgXoItmP5g@=J,~> +R$iO*JcC<$JcC<$JcC<$JcC<$n,MnX]:#f$o)OsRk5_9FJ,~> +QiM^;JcC<$JcC<$JcC<$JcC<$n,KEgXoItmP5g@=J,~> +QN2U:JcC<$JcC<$JcC<$JcC<$nGfNhXoItmPQ-F=J,~> +Q^NF)JcC<$JcC<$JcC<$JcC<$nGi"Y]:#f$o)P!SjoD0EJ,~> +QN2U:JcC<$JcC<$JcC<$JcC<$nGfNhXoItmPQ-F=J,~> +QN2U:JcC<$JcC<$JcC<$JcC<$n,KHhXoItmPlHL=J,~> +Q^NF)JcC<$JcC<$JcC<$JcC<$n,MqY]:#f$o)P$TjoD-DJ,~> +QN2U:JcC<$JcC<$JcC<$JcC<$n,KHhXoItmPlHL=J,~> +Q2lL9JcC<$JcC<$JcC<$JcC<$nGfTjXT.klQ2cR=J,~> +QC3=(JcC<$JcC<$JcC<$JcC<$nGi%Z]U>l$o)P'UjT)$CJ,~> +Q2lL9JcC<$JcC<$JcC<$JcC<$nGfTjXT.klQ2cR=J,~> +PlQC8JcC<$JcC<$JcC<$JcC<$nc,]kXT.klQN)X=J,~> +Q'm4'JcC<$JcC<$JcC<$JcC<$nc/.[]U>l$o)P*VjT)!BJ,~> +PlQC8JcC<$JcC<$JcC<$JcC<$nc,]kXT.klQN)X=J,~> +PQ6:7JcC<$JcC<$JcC<$JcC<$nc,`lXT.klQiD^=J,~> +PaR+&JcC<$JcC<$JcC<$JcC<$nc/4]]:#c#o)P-WjT(sAJ,~> +PQ6:7JcC<$JcC<$JcC<$JcC<$nc,`lXT.klQiD^=J,~> +P5p16JcC<$JcC<$JcC<$JcC<$o)GlnXT.hkR/_d=J,~> +PF7"%JcC<$JcC<$JcC<$JcC<$o)J=^]U>l$nc5'Wj8bj at J,~> +P5p16JcC<$JcC<$JcC<$JcC<$o)GlnXT.hkR/_d=J,~> +OoU(5JcC<$JcC<$JcC<$JcC<$oDbuoXT.hkR/_d=J,~> +P*pn$JcC<$JcC<$JcC<$JcC<$oDeF_]U>l$nc5'WjT(p at J,~> +OoU(5JcC<$JcC<$JcC<$JcC<$oDbuoXT.hkR/_d=J,~> +OT9t4JcC<$JcC<$JcC<$JcC<$oDc#pXT.hkRK%j=J,~> +OdUe#JcC<$JcC<$JcC<$JcC<$oDeI`]U>l$nc5*Xj8bg?J,~> +OT9t4JcC<$JcC<$JcC<$JcC<$oDc#pXT.hkRK%j=J,~> +O8sk3JcC<$JcC<$JcC<$JcC<$o`)/rX8h_jRf at p=J,~> +OI:\"JcC<$JcC<$JcC<$JcC<$o`+Ra]pYr$nc5-Yj8bd>J,~> +O8sk3JcC<$JcC<$JcC<$JcC<$o`)/rX8h_jRf at p=J,~> +NrXb2JcC<$JcC<$JcC<$JcC<$o`)2sX8h_jS,\$>!!%N~> +O-tS!JcC<$JcC<$JcC<$JcC<$o`+Ub]pYr$nc50Zj8ba=J,~> +NrXb2JcC<$JcC<$JcC<$JcC<$o`)2sX8h_jS,\$>!!%N~> +NW=Y1JcC<$JcC<$JcC<$JcC<$p&D>uWrMYjS,\$>rr at Q~> +NgYIuJcC<$JcC<$JcC<$JcC<$p&F[b^R;,%o)P9[j8b^ +NW=Y1JcC<$JcC<$JcC<$JcC<$p&D>uWrMYjS,\$>rr at Q~> +N<"P0JcC<$JcC<$JcC<$JcC<$p&DB!WrMYjSH"-?rW%H~> +NL>@tJcC<$JcC<$JcC<$JcC<$p&F^c^R;,%o)P<\irGU;J,~> +N<"P0JcC<$JcC<$JcC<$JcC<$p&DB!WrMYjSH"-?rW%H~> +Mu\G/JcC<$JcC<$JcC<$JcC<$pA_N#WrMViSc=6 at r;_?~> +N1#7sJcC<$JcC<$JcC<$JcC<$pAagd^mV5&nc56\irGR:J,~> +Mu\G/JcC<$JcC<$JcC<$JcC<$pA_N#WrMViSc=6 at r;_?~> +MZA>.JcC<$JcC<$JcC<$JcC<$pA_Q$WrMViT)X?AquD6~> +Mj].rJcC<$JcC<$JcC<$JcC<$pAaje^mV5&nc59]irGO9J,~> +MZA>.JcC<$JcC<$JcC<$JcC<$pA_Q$WrMViT)X?AquD6~> +M?&5-JcC<$JcC<$JcC<$JcC<$p]%]&WW2MhTDsHBqZ)-~> +MOB%qJcC<$JcC<$JcC<$JcC<$p]'sf_3q;&nc5<^irGL8J,~> +M?&5-JcC<$JcC<$JcC<$JcC<$p]%]&WW2MhTDsHBqZ)-~> +M#`,,JcC<$JcC<$JcC<$JcC<$p]%c(W;lDgU&TZDq#Gp~> +M4&qpJcC<$JcC<$JcC<$JcC<$p](!g_O7A&nc5B`i;f:6J,~> +M#`,,JcC<$JcC<$JcC<$JcC<$p]%c(W;lDgU&TZDq#Gp~> +L]E#+JcC<$JcC<$JcC<$JcC<$p]%f)WW2JgUAocEp],g~> +Lm`hoJcC<$JcC<$JcC<$JcC<$p]($h_O7D'nGo<`i;f75J,~> +L]E#+JcC<$JcC<$JcC<$JcC<$p]%f)WW2JgUAocEp],g~> +LB)o*JcC<$JcC<$JcC<$JcC<$p]%l+W;lAfU]5lFpAf^~> +LRE_nJcC<$JcC<$JcC<$JcC<$p]($h`0mS(nGo?ai;f44J,~> +LB)o*JcC<$JcC<$JcC<$JcC<$p]%l+W;lAfU]5lFpAf^~> +L&cf)JcC<$JcC<$JcC<$JcC<$q#A#-VuQ8eV#PuGp&KU~> +L7*VmJcC<$JcC<$JcC<$JcC<$q#C-i`L3Y(nGoBbi;f13J,~> +L&cf)JcC<$JcC<$JcC<$JcC<$q#A#-VuQ8eV#PuGp&KU~> +KE-T'JcC<$JcC<$JcC<$JcC<$q>\20VZ6/dV>l)Ho`0L~> +Kp_o at JcC<$JcC<$JcC<$JcC<$JcGQGq>eO'VZ6/dV>oKSQ'm.~> +KE-T'JcC<$JcC<$JcC<$JcC<$q>\20VZ6/dV>l)Ho`0L~> +K)gK&JcC<$JcC<$JcC<$JcC<$q>\82VZ6,cVuM;Jo)O:~> +KUDf?JcC<$JcC<$JcC<$JcC<$JcGQGq>eU)VZ6,cVuPZTPaR%~> +K)gK&JcC<$JcC<$JcC<$JcC<$q>\82VZ6,cVuM;Jo)O:~> +JcLB%JcC<$JcC<$JcC<$JcC<$q>\>4V>p#bW;hDKnc41~> +K:)]>JcC<$JcC<$JcC<$JcC<$JcGQGqZ+a+V>p#bW;kcUPF6q~> +JcLB%JcC<$JcC<$JcC<$JcC<$q>\>4V>p#bW;hDKnc41~> +JH,ZMJcC<$JcC<$JcC<$JcC<$JcGTH`;l_6n,THfJH53?J,~> +JslW=JcC<$JcC<$JcC<$JcC<$JcGTHquFm-V#ToaWW1iUPF6q~> +JH,ZMJcC<$JcC<$JcC<$JcC<$JcGTH`;l_6n,THfJH53?J,~> +JH5]MJcC<$JcC<$JcC<$JcC<$JcGTH`rMn7nGoThJH5-=J,~> +JXQN +JH5]MJcC<$JcC<$JcC<$JcC<$JcGTH`rMn7nGoThJH5-=J,~> +JH5ZLJcC<$JcC<$JcC<$JcC<$JcGTHaT/+9n,TNhJH5* +JXHS-!!%TMJcC<$JcC<$JcC<$JcC<$qZ$Koc'b@,n,TNhh>i\+J,~> +JH5ZLJcC<$JcC<$JcC<$JcC<$JcGTHaT/+9n,TNhJH5* +JH5TJJcC<$JcC<$JcC<$JcC<$JcGTHbQ+C;n,TQiJH5';J,~> +JXQP+rW%NLJcC<$JcC<$JcC<$JcC<$qZ$Npc^CO-n,TQih>iY*J,~> +JH5TJJcC<$JcC<$JcC<$JcC<$JcGTHbQ+C;n,TQiJH5';J,~> +JH5QIJcC<$JcC<$JcC<$JcC<$JcGTHc2aR +JXQM*rW%NLJcC<$JcC<$JcC<$JcC<$qZ$Qqd$^U-n,TWkh#NM(J,~> +JH5QIJcC<$JcC<$JcC<$JcC<$JcGTHc2aR +JH5KGJcC<$JcC<$JcC<$JcC<$JcGWId/]j>n,TWkJH4s8J,~> +JXQJ)r;_EKJcC<$JcC<$JcC<$JcC<$qu?Zre!Zm/n,TWkh#NJ'J,~> +JH5KGJcC<$JcC<$JcC<$JcC<$JcGWId/]j>n,TWkJH4s8J,~> +JH5EEJcC<$JcC<$JcC<$JcC<$JcGWIeGu3 at n,T]mJH4m6J,~> +JXQG(quD37T)\9[YlEJYNL>:~> +JH5EEJcC<$JcC<$JcC<$JcC<$JcGWIeGu3 at n,T]mJH4m6J,~> +JH5BDJcC<$JcC<$JcC<$JcC<$JcGTHf`7QBn,TcoJH4g4J,~> +JXQD'quD +JH5BDJcC<$JcC<$JcC<$JcC<$JcGTHf`7QBn,TcoJH4g4J,~> +JH5 +JXQA&qZ)3IJcC<$JcC<$JcC<$JcC<$qZ#?=SH&$XZiAb[Mj](~> +JH5 +JH56 at JcC<$JcC<$JcC<$JcC<$JcGTHhuK5Gn,TiqJH4^1J,~> +JXQ>%q>c*HJcC<$JcC<$JcC<$JcC<$qZ#KARfDjW[/\k\M4&k~> +JH56 at JcC<$JcC<$JcC<$JcC<$JcGTHhuK5Gn,TiqJH4^1J,~> +JH53?JcC<$JcC<$JcC<$JcC<$JcGNFk5^hJn,TosJH4X/J,~> +JXQ;$q>c*HJcC<$JcC<$JcC<$JcC<$q#BNFQN-FS[f>%]Lm`b~> +JH53?JcC<$JcC<$JcC<$JcC<$JcGNFk5^hJn,TosJH4X/J,~> +JH5-=JcC<$JcC<$JcC<$JcC<$JcGKEm/WCNmf9ltJH4R-J,~> +JXQ8#q#H!GJcC<$JcC<$JcC<$JcC<$p]'WKPlL1P\Gt4^LREY~> +JH5-=JcC<$JcC<$JcC<$JcC<$JcGKEm/WCNmf9ltJH4R-J,~> +JH5';JcC<$JcC<$JcC<$JcC<$JcG<@q>cQUmf9s!JH4L+J,~> +JXQ5"p],mFJcC<$JcC<$JcC<$JcC<$o)JQSNrSPJ])UC_L7*P~> +JH5';JcC<$JcC<$JcC<$JcC<$JcG<@q>cQUmf9s!JH4L+J,~> +JH4s8JcC<$JcC<$JcC<$JcC<$JcC<$r;Z3c]DmE^gAla~> +JXQ.upAfdEJcC<$JcC<$JcC<$JcC<$JcGZJmf:!"f)UMmJ,~> +JH4s8JcC<$JcC<$JcC<$JcC<$JcC<$r;Z3c]DmE^gAla~> +JH4m6JcC<$JcC<$JcC<$JcC<$JcC<$rr;Ee^&NW`f`6O~> +JXQ+tp&K[DJcC<$JcC<$JcC<$JcC<$JcG`Lmf:'$f)UGkJ,~> +JH4m6JcC<$JcC<$JcC<$JcC<$JcC<$rr;Ee^&NW`f`6O~> +JH4g4JcC<$JcC<$JcC<$JcC<$JcC<$!<;Kf^]/ibf)U=~> +JXQ(so`0RCJcC<$JcC<$JcC<$JcC<$Jc>`Mmf:-&ec:;iJ,~> +JH4g4JcC<$JcC<$JcC<$JcC<$JcC<$!<;Kf^]/ibf)U=~> +JH4a2JcC<$JcC<$JcC<$JcC<$JcCB&mJt-(JH41"J,~> +JXQ"qo`0RCJcC<$JcC<$JcC<$JcC<$KE(?>_Z/*cJXM#~> +JH4a2JcC<$JcC<$JcC<$JcC<$JcCB&mJt-(JH41"J,~> +JH4X/JcC<$JcC<$JcC<$JcC<$JcCK)mf:<+JH4'tJ,~> +JXPtpo)O at AJcC<$JcC<$JcC<$JcC<$LB$]B`;e9dJXQP+J,~> +JH4X/JcC<$JcC<$JcC<$JcC<$JcCK)mf:<+JH4'tJ,~> +JH4O,JcC<$JcC<$JcC<$JcC<$JcCW-mJt9,JH4!rJ,~> +JXPqonGn.?JcC<$JcC<$JcC<$JcC<$MZ<)E`rFHeJXQM*J,~> +JH4O,JcC<$JcC<$JcC<$JcC<$JcCW-mJt9,JH4!rJ,~> +JH4F)JcC<$JcC<$JcC<$JcC<$JcC`0mJtB/JH3moJ,~> +JXPkmn,S%>JcC<$JcC<$JcC<$JcC<$NW8DHaoB]fJXQJ)J,~> +JH4F)JcC<$JcC<$JcC<$JcC<$JcC`0mJtB/JH3moJ,~> +JH4=&JcC<$JcC<$JcC<$JcC<$JcCl4m/YB1JH3dlJ,~> +JXPhlmJqhuhJXQD'J,~> +JH4=&JcC<$JcC<$JcC<$JcC<$JcCl4m/YB1JH3dlJ,~> +JH41"JcC<$JcC<$JcC<$JcC<$JcD#8mJtT5JH3XhJ,~> +JXPbjli;V:JcC<$JcC<$JcC<$JcC<$Q2g7Pci;2hJXQA&J,~> +JH41"JcC<$JcC<$JcC<$JcC<$JcD#8mJtT5JH3XhJ,~> +JH4$sJcC<$JcC<$JcC<$JcC<$JcD2=m/YW8JH3LdJ,~> +JXP\hl2ZD8JcC<$JcC<$JcC<$JcC<$RfDaTe,RPjJXQ;$J,~> +JH4$sJcC<$JcC<$JcC<$JcC<$JcD2=m/YW8JH3LdJ,~> +JH3jnJcC<$JcC<$JcC<$JcC<$JcDABm/Yf=JH3=_J,~> +JXPYgjoBu4JcC<$JcC<$JcC<$JcC<$TE"9Yf`/tlJXQ5"J,~> +JH3jnJcC<$JcC<$JcC<$JcC<$JcDABm/Yf=JH3=_J,~> +JH3XhJcC<$JcC<$JcC<$JcC<$JcDVIli>rCJH3(XJ,~> +JXPSeiW+Q0JcC<$JcC<$JcC<$JcC<$VZ5u_huCLmJXQ2!J,~> +JH3XhJcC<$JcC<$JcC<$JcC<$JcDVIli>rCJH3(XJ,~> +JH3.ZJcC<$JcC<$JcC<$JcC<$JcE+Wli?DPJH2VKJ,~> +JXPMcec::$JcC<$JcC<$JcC<$JcC<$[/]Imm/OKoJXQ+tJ,~> +JH3.ZJcC<$JcC<$JcC<$JcC<$JcE+Wli?DPJH2VKJ,~> +JH16$JH16$JH16$JH16$JH3OeJcDbMJH16$r;_?~> +JXPJbJH16$JH16$JH16$JH16$iW+Q0WrM;`n +JH16$JH16$JH16$JH16$JH3OeJcDbMJH16$r;_?~> +JH16$JH16$JH16$JH16$JH3LdJcDeNJH16$r;_?~> +JXPD`JH16$JH16$JH16$JH16$irFZ1X8hGbn!UZcJXPtpJ,~> +JH16$JH16$JH16$JH16$JH3LdJcDeNJH16$r;_?~> +JH16$JH16$JH16$JH16$JH3LdJcDhOJH16$quD6~> +JXP>^JH16$JH16$JH16$JH16$jT'l3XT.Mbn!U`eJXPnnJ,~> +JH16$JH16$JH16$JH16$JH3LdJcDhOJH16$quD6~> +JH16$JH16$JH16$JH16$JH3IcJcDnQJH16$qZ)-~> +JXP5[JH16$JH16$JH16$JH16$k5^)5Y5d_dn!UcfJXPhlJ,~> +JH16$JH16$JH16$JH16$JH3IcJcDnQJH16$qZ)-~> +JH16$JH16$JH16$JH16$JH3IcJcDnQJH16$qZ)-~> +JXP/YJH16$JH16$JH16$JH16$kl?;7Y5d_dn!UihJXPbjJ,~> +JH16$JH16$JH16$JH16$JH3IcJcDnQJH16$qZ)-~> +JH16$JH16$JH16$JH16$JH3FbJcDtSJH16$q>c$~> +JXP)WJH16$JH16$JH16$JH16$l2ZD8YlEnen!UojJXP\hJ,~> +JH16$JH16$JH16$JH16$JH3FbJcDtSJH16$q>c$~> +JH16$JH16$JH16$JH16$JH3CaJcE%UJH16$q#Gp~> +JXP#UJH16$JH16$JH16$JH16$lMuM9ZN'+gm[:olJXPSeJ,~> +JH16$JH16$JH16$JH16$JH3CaJcE%UJH16$q#Gp~> +JH16$JH16$JH16$JH16$JH3CaJcE%UJH16$q#Gp~> +JXOoRJH16$JH16$JH16$JH16$mJqh +JH16$JH16$JH16$JH16$JH3CaJcE%UJH16$q#Gp~> +JH16$JH16$JH16$JH16$JH3@`JcE+WJH16$p],g~> +JXOfOJH16$JH16$JH16$JH16$n,S%>[/]=im[;&pJXPD`J,~> +JH16$JH16$JH16$JH16$JH3@`JcE+WJH16$p],g~> +JH16$JH16$JH16$JH16$JH3=_JcE.XJH16$p],g~> +JXO]LJH16$JH16$JH16$JH16$nc47@[K#Fjm[;/sJXP;]J,~> +JH16$JH16$JH16$JH16$JH3=_JcE.XJH16$p],g~> +JH16$JH16$JH16$JH16$JH3=_JcE1YJH16$pAf^~> +JXOTIJH16$JH16$JH16$JH16$o`0RC[f>Okm?u/uJXP2ZJ,~> +JH16$JH16$JH16$JH16$JH3=_JcE1YJH16$pAf^~> +JH16$JH16$JH16$JH16$JH3:^JcE7[JH16$p&KU~> +JXOHEJH16$JH16$JH16$JH16$p],mF\Gt^lm[;B$JXP&VJ,~> +JH16$JH16$JH16$JH16$JH3:^JcE7[JH16$p&KU~> +JH16$JH16$JH16$JH16$JH37]JcE=]JH16$o`0L~> +JXO +JH16$JH16$JH16$JH16$JH37]JcE=]JH16$o`0L~> +JH16$JH16$JH16$JH16$JH37]JcE=]JH16$o`0L~> +JXO- +JH16$JH16$JH16$JH16$JH37]JcE=]JH16$o`0L~> +JH16$JH16$JH16$JH16$JH34\JcEC_JH16$oDjC~> +JXNp6JH16$JH16$JH16$JH1B(JcEC_k5ak:hZ/4q`L25~> +JH16$JH16$JH16$JH16$JH34\JcEC_JH16$oDjC~> +JH16$JH16$JH16$JH16$JH31[JcEIaJH16$o)O:~> +JXNF(JH16$JH16$JH16$JH1i5JcEIajoFb9li;U)\=%j~> +JH16$JH16$JH16$JH16$JH31[JcEIaJH16$o)O:~> +JH16$JH16$JH16$JH16$JH3.ZJcEOcJH16$nc41~> +JXM(WJXM(WJXM(WJXM(WJXO!8JcEOcjoBt#NL>:~> +JH16$JH16$JH16$JH16$JH3.ZJcEOcJH16$nc41~> +JH16$JH16$JH16$JH16$JH3+YJcERdJH16$nc41~> +JXM(WJXM(WJXM(WJXM(WJXNs7JcERdjoBt#NL>:~> +JH16$JH16$JH16$JH16$JH3+YJcERdJH16$nc41~> +JH16$JH16$JH16$JH16$JH3+YJcEUeJH16$nGn(~> +JXM(WJXM(WJXM(WJXM(WJXNs7JcEUejoBt#N1#1~> +JH16$JH16$JH16$JH16$JH3+YJcEUeJH16$nGn(~> +JH16$JH16$JH16$JH16$JH3(XJcE[gJH16$n,Rt~> +JXM(WJXM(WJXM(WJXM(WJXNp6JcE[gjoBt#Mj](~> +JH16$JH16$JH16$JH16$JH3(XJcE[gJH16$n,Rt~> +JH16$JH16$JH16$JH16$JH3%WJcEaiJH16$mf7k~> +JXM(WJXM(WJXM(WJXM(WJXNm5JcEaijT'k"Mj](~> +JH16$JH16$JH16$JH16$JH3%WJcEaiJH16$mf7k~> +JH16$JH16$JH16$JH16$JH3"VJcEgkJH16$mJqb~> +JXM(WJXM(WJXM(WJXM(WJXNj4JcEgkjT'k"MOAt~> +JH16$JH16$JH16$JH16$JH3"VJcEgkJH16$mJqb~> +JH16$JH16$JH16$JH16$JH2tUJcEmmJH16$m/VY~> +JXM(WJXM(WJXM(WJXM(WJXNg3JcEmmjT'k"M4&k~> +JH16$JH16$JH16$JH16$JH2tUJcEmmJH16$m/VY~> +JH16$JH16$JH16$JH16$JH2qTJcEsoJH16$li;P~> +JXM(WJXM(WJXM(WJXM(WJXNd2JcEsoj8ab!M4&k~> +JH16$JH16$JH16$JH16$JH2qTJcEsoJH16$li;P~> +JH16$JH16$JH16$JH16$JH2qTJcF!pJH16$lMuG~> +JXM(WJXM(WJXM(WJXM(WJXNd2JcF!pj8ab!Lm`b~> +JH16$JH16$JH16$JH16$JH2qTJcF!pJH16$lMuG~> +JH16$JH16$JH16$JH16$JH2nSJcF$qJH16$lMuG~> +JXM(WJXM(WJXM(WJXM(WJXNa1JcF$qj8ab!Lm`b~> +JH16$JH16$JH16$JH16$JH2nSJcF$qJH16$lMuG~> +!![uSJH16$JH16$JH16$JH16$YQ07Sd/SXsJH5!9!![r~> +!0_u%JXM(WJXM(WJXM(WJXM(WYaL(Bd/W/,JXM=^!0_p~> +JH16$JH16$JH16$JH16$JH2kRJcF*sJH16$l2Z>~> +!"XV\JH16$JH16$JH16$JH16$Y5j.Rdf4juJH4s8!"XS~> +!0)PtJXM(WJXM(WJXM(WJXM(WYF0tAdf8A.JXM:]!0)L~> +!!7]OJH16$JH16$JH16$JH16$Y5j.Rdf4juJH4s8!!7Z~> +!$6[kJH16$JH16$JH16$JH16$XT3qPec11#JH4p7!$6X~> +!/?&mJXM(WJXM(WJXM(WJXM(WXdOb?ec4\1JXM7\!/?"~> +!!n,UJH16$JH16$JH16$JH16$XT3qPec11#JH4p7!!n)~> +!&B**JH16$JH16$JH16$JH16$X8mhOfDgC%JH4m6!&B'~> +!.ociJXM(WJXM(WJXM(WJXM(WXI4Y>fDjk2JXM7\!.o_~> +!#'n`JH16$JH16$JH16$JH16$X8mhOfDgC%JH4m6!#'k~> +!).qDJH16$JH16$JH16$JH16$WrR_NgAc^(JH4g4!).n~> +!/,okJXM(WJXM(WJXM(WJXM(WX-nP=gAg.4JXM4[!/,k~> +!%3 +!,I,cJH16$JH16$JH16$JH16$WW7VMh#Dp*JH4d3!,I)~> +!02VuJXM(WJXM(WJXM(WJXM(WWgSG +!(;A~> +!0)O0JH16$JH16$JH16$JH16$W;qMLhZ&-,JH4a2!0)L~> +!2+n2JXM(WJXM(WJXM(WJXM(WWL8>;hZ)R8JXM.Y!2+i~> +!,6uaJH16$JH16$JH16$JH16$W;qMLhZ&-,JH4a2!,6r~> +!4.4VJH16$JH16$JH16$JH16$VuVDKi;\?.JH4^1!4.1~> +!5!fMJXM(WJXM(WJXM(WJXM(WW0r5:i;_a9JXM.Y!5!a~> +!18<;JH16$JH16$JH16$JH16$VuVDKi;\?.JH4^1!189~> +!7ZQ"JH16$JH16$JH16$JH16$VZ;;Jir=Q0JH4[0!7ZN~> +!7l^hJXM(WJXM(WJXM(WJXM(WVjW,9ir at s;JXM+X!7lZ~> +!5j?fJH16$JH16$JH16$JH16$VZ;;Jir=Q0JH4[0!5j<~> +!:YO>JH16$JH16$JH16$JH16$V>u2IjSsc2JH4X/!:YL~> +!:YQ-JXM(WJXM(WJXM(WJXM(WVO<#8jT"0=JXM(W!:YL~> +!9o%7JH16$JH16$JH16$JH16$V>u2IjSsc2JH4X/!9o"~> +!<.NLJH16$JH16$JH16$JH16$V#Z)Hk5Tu4JH4U.!<.K~> +!<.P;JXM(WJXM(WJXM(WJXM(WV3uo7k5XB?JXM(W!L`q;~> +!<%HKJH16$JH16$JH16$JH16$V#Z)Hk5Tu4JH4U.!<%E~> +!WO^%!.b-$!.b-$!.b-$!.b-$!2KUGs6BW8!.b.-!!+YNJ,~> +!WRe'R=UcWR=UcWR=UcWR=UcWRAH;O!.k18s53m.R=Ub-R=kNi~> +!WN^^!.b-$!.b-$!.b-$!.b-$!2KUGs6BW8!.b.-!!*Z2J,~> +!WR.j!.b-$!.b-$!.b-$!.b-$!2BOFs6Tc:!.b.,!!.*>J,~> +!WS:5R=UcWR=UcWR=UcWR=UcWRA?5N!.k1:s53m.R=Ue+R/rHMJ,~> +!WPfD!.b-$!.b-$!.b-$!.b-$!2BOFs6Tc:!.b.,!!,amJ,~> +!WTKW!.b-$!.b-$!.b-$!.b-$!20CDs6ou=!.b.+!!0G+J,~> +!WTc_R=UcWR=UcWR=UcWR=UcWRA62M!.k1=s53m.R=Ue*R/sr"J,~> +!WSO +!WV;5!.b-$!.b-$!.b-$!.b-$!2'=Cs762@!.b.)!!26^J,~> +!WV>6R=UcWR=UcWR=UcWR=UcWRA62L!.k1 at s5*g-R=Ue)R/uLNJ,~> +!WUr+!.b-$!.b-$!.b-$!.b-$!2'=Cs762@!.b.)!!1mTJ,~> +s8RWMJH16$JH16$JH16$JH16$T)aHBo`'IBJH4C(s8RT~> +s8RYi+pJXQJ)s8RT~> +s8RWMJH16$JH16$JH16$JH16$T)aHBo`'IBJH4C(s8RT~> +s8N'rJH16$JH16$JH16$JH16$JH28AJcGKEJH16$g&M1Os8RT~> +s8N(QJXM(WJXM(WJXM(WJXM(WJXN7#r;_EKp]'(MJXM(WrL!_ at s8RT~> +s8N'MJH16$JH16$JH16$JH16$JH28AJcGKEJH16$g&M1*s8RT~> +s8N)!JH16$JH16$JH16$JH16$JH25 at JcGTHJH16$fDkuQs8RT~> +s8N)+JXM(WJXM(WJXM(WJXM(WJXN4"r;_EKqZ#@OJXM(Wr0[Vns8RT~> +s8N(XJH16$JH16$JH16$JH16$JH25 at JcGTHJH16$fDku3s8RT~> +s8N)aJH16$JH16$JH16$JH16$JH2/>JcG`LJH16$ec5d:s8RT~> +s8N)bJXM(WJXM(WJXM(WJXM(WJXN-ur;_EKrr:aRJXM(Wqj at NOs8RT~> +s8N)YJH16$JH16$JH16$JH16$JH2/>JcG`LJH16$ec5d2s8RT~> +rr2s>JH16$JH16$JH16$JH16$JH2/>Jc>`MJH16$ec5[krr7K~> +rr2tQJXM(WJXM(WJXM(WJXM(WJXN-ur;_EK!<:gSJXM(Wqj at G=rr7K~> +rr2s(JH16$JH16$JH16$JH16$JH2/>Jc>`MJH16$ec5[Urr7K~> +rr2tTJH16$JH16$JH16$JH16$JH2) +rr2tiJXM(WJXM(WJXM(WJXM(WJXN*tquDEMg]2nnJXQ>%!1s2iJ,~> +rr2t1JH16$JH16$JH16$JH16$JH2) +rr2uWJH16$JH16$JH16$JH16$JH2#:M#W#+JH4*u!9*qWJ,~> +rr2uXJXM(WJXM(WJXM(WJXM(WJXN'sqZ)HPgAlemJXQ;$!94"XJ,~> +rr2uKJH16$JH16$JH16$JH16$JH2#:M#W#+JH4*u!7h)KJ,~> +rVlj=JH16$JH16$JH16$JH16$JH1u9MuS>.JH4*u!$;+=J,~> +rVlkPJXM(WJXM(WJXM(WJXM(WJXN'sq>cHRgAlemJXQ;$!/CIPJ,~> +rVlj'JH16$JH16$JH16$JH16$JH1u9MuS>.JH4*u!!rQ'J,~> +rVlkbJH16$JH16$JH16$JH16$JH1o7O8jb2JH4$s!1<`bJ,~> +rVlkqJXM(WJXM(WJXM(WJXM(WJXN$rq#HKUg&Q\lJXQ8#!2oeqJ,~> +rVlkAJH16$JH16$JH16$JH16$JH1o7O8jb2JH4$s!-eDAJ,~> +rVlleJH16$JH16$JH16$JH16$JH1i5PQ-16JH3sq!:]seJ,~> +rVlleJXM(WJXM(WJXM(WJXM(WJXN!qp]-NXf`6SkJXQ5"!:]seJ,~> +rVll^JH16$JH16$JH16$JH16$JH1i5PQ-16JH3sq!9sI^J,~> +r;QaoJH16$JH16$JH16$JH16$JH1f4QiDU:JH3pp!)`[oJ,~> +r;QbNJXM(WJXM(WJXM(WJXM(WJXN!qpAgQ[fDpJjJXQ5"!/:@NJ,~> +r;QaJJH16$JH16$JH16$JH16$JH1f4QiDU:JH3pp!%e'JJ,~> +r;QcAJH16$JH16$JH16$JH16$JH1`2SH"-?JH3gm!6tHAJ,~> +r;QcEJXM(WJXM(WJXM(WJXM(WJXMspp&LW_ec:8hJXQ2!!7C`EJ,~> +r;Qc.JH16$JH16$JH16$JH16$JH1`2SH"-?JH3gm!4r+.J,~> +qu6X at JH16$JH16$JH16$JH16$JH1]1T`9QCJH3dl!$hC at J,~> +qu6YMJXM(WJXM(WJXM(WJXM(WJXMpop&Lccec:8hJXQ.u!/:=MJ,~> +qu6X'JH16$JH16$JH16$JH16$JH1]1T`9QCJH3dl!"/W'J,~> +qu6Z&JH16$JH16$JH16$JH16$JH1W/V#PuGJH3^j!42S&J,~> +qu6Z.JXM(WJXM(WJXM(WJXM(WJXMmno`1ffeGt/gJXQ+t!5&..J,~> +qu6Y`JH16$JH16$JH16$JH16$JH1W/V#PuGJH3^j!1 +qu6]r%tO_3!.b-$!.b-$!.b-$!.b--!36'M!.b-h!!*W0qu;0~> +qu6]rNIdLKR=UcWR=UcWR=UcWR=UcmRIgKZs3gt!R=UdtR/r +qu6]q!eC?&!.b-$!.b-$!.b-$!.b--!36'M!.b-h!!*0"qu;0~> +qYpPqJH16$JH16$JH16$JH16$JH1H*YlB7SJH3Oe!35nqJ,~> +qYpQ&JXM(WJXM(WJXM(WJXM(WJXMglnc5oodK"idJXQ%r!4;V&J,~> +qYpPSJH16$JH16$JH16$JH16$JH1H*YlB7SJH3Oe!0$dSJ,~> +qYpTq'S-78!.b-$!.b-$!.b-$!.b-(!4DiX!.b-d!!*f5qYu'~> +qYpTqMLh1HR=UcWR=UcWR=UcWR=UclRIC3as3UgtR=UdrR/r3EqYu'~> +qYpTp"G$Q(!.b-$!.b-$!.b-$!.b-(!4DiX!.b-d!!*6$qYu'~> +q>UH'JH16$JH16$JH16$JH16$JH19%]`3N_JH3@`!4M_'J,~> +q>UH.JXM(WJXM(WJXM(WJXM(WJXMajmf:$#c2`E`JXQ"q!584.J,~> +q>UGaJH16$JH16$JH16$JH16$JH19%]`3N_JH3@`!1WfaJ,~> +q#:=LJH16$JH16$JH16$JH16$JH16$rrC";JH16$\c;^cq#>j~> +q#:>GJXM(WJXM(WJXM(WJXM(WJXMajli>!(bQ*3^JXPtp!.t"GJ,~> +q#:=-JH16$JH16$JH16$JH16$JH16$rrC";JH16$\c;^Dq#>j~> +q#:?DJH16$JH16$JH16$JH16$JH16$q>ee?JH16$[K$j~> +q#:?FJXM(WJXM(WJXM(WJXM(WJXM[hklB!.aoI!\JXPnn!7prFJ,~> +q#:?3JH16$JH16$JH16$JH16$JH16$q>ee?JH16$[K$j~> +p\t5/JH16$JH16$JH16$JH16$JH16$pAieEJH16$Z2al?p]#a~> +p\t5RJXM(WJXM(WJXM(WJXM(WJXM[hjoF!4`W1RXJXPnn!06gRJ,~> +p\t4]JH16$JH16$JH16$JH16$JH16$pAieEJH16$Z2akmp]#a~> +p\t6dJH16$JH16$JH16$JH16$JH16$n,VMKJH16$X8i7np]#a~> +p\t6dJXM(WJXM(WJXM(WJXM(WJXMUfi;hp<_>o.TJXPhl!;6*dJ,~> +p\t6`JH16$JH16$JH16$JH16$JH16$n,VMKJH16$X8i7jp]#a~> +pAY-$JH16$JH16$JH16$JH16$JH16$JH16$JH5]M!4MV$J,~> +pAY-+JXM(WJXM(WJXM(WJXM(WJXMReL]E!oJXPek!58++J,~> +pAY,^JH16$JH16$JH16$JH16$JH16$JH16$JH5]M!1W]^J,~> +p&>"rJH16$JH16$JH16$JH16$JH16$JH16$JH,[Sp&BO~> +p&>#JJXM(WJXM(WJXM(WJXM(WJXMOdMZA +p&>"LJH16$JH16$JH16$JH16$JH16$JH16$JH,[-p&BO~> +p&>'c#(Zc*!.b-$!.b-$!.b-$!.b-$!.b-$!.t7P#5.ZhJ,~> +p&>'cPC]-QR=UcWR=UcWR=UcWR=UccR?%?!R=UdjR/rNEp&BO~> +p&>$^JH16$JH16$JH16$JH16$JH16$JH16$JH,]?p&BO~> +o`"p6JH16$JH16$JH16$JH16$JH16$JH16$K)bnoo`'F~> +o`"p9JXM(WJXM(WJXM(WJXM(WJXMFaP5p0%JXP\h!6t09J,~> +o`"p!JH16$JH16$JH16$JH16$JH16$JH16$K)bnZo`'F~> +oD\fMJH16$JH16$JH16$JH16$JH16$JH16$K`D+4oDa=~> +oD\f`JXM(WJXM(WJXM(WJXM(WJXMC`QN2T)JXPYg!2/r`J,~> +oD\f)JH16$JH16$JH16$JH16$JH16$JH16$K`D*eoDa=~> +o)A\eJH16$JH16$JH16$JH16$JH16$JH16$LB% +o)A]DJXM(WJXM(WJXM(WJXM(WJXM at _S,e,.JXPSe!/:"DJ,~> +o)A\@JH16$JH16$JH16$JH16$JH16$JH16$LB%<*o)F4~> +o)Aac*e= +o)AacL4PbDR=UcWR=UcWR=UcWR=Uc^R at jP2R=UddR/r';o)F4~> +o)Aa`#_;u,!.b-$!.b-$!.b-$!.b-$!.b-$!/U[V#kdcgJ,~> +nc&UOJH16$JH16$JH16$JH16$JH16$JH16$M#[P +nc&UPJXM(WJXM(WJXM(WJXM(WJXM7\U]>t6JXPJb!9`nPJ,~> +nc&UEJH16$JH16$JH16$JH16$JH16$JH16$M#[P2nc++~> +nG`L9JH16$JH16$JH16$JH16$JH16$JH16$MZ +nG`L +nG`L(JH16$JH16$JH16$JH16$JH16$JH16$MZ +n,EC%JH16$JH16$JH16$JH16$JH16$JH16$N;rsmn,In~> +n,EC+JXM(WJXM(WJXM(WJXM(WJXM+XYQ06BJXP>^!6"@+J,~> +n,EBbJH16$JH16$JH16$JH16$JH16$JH16$N;rsUn,In~> +mf*9nJH16$JH16$JH16$JH16$JH16$JH16$NrT0dmf.e~> +mf*:!JXM(WJXM(WJXM(WJXM(WJXM(W!1C4pJXM(WgmJ/Smf.e~> +mf*9SJH16$JH16$JH16$JH16$JH16$JH16$NrT0Imf.e~> +mJd0hJH16$JH16$JH16$JH16$JH16$JH16$OT5BamJh\~> +mJd0qJXM(WJXM(WJXM(WJXM(WJXM(WrgCD!JXM(WfpMiLmJh\~> +mJd0LJH16$JH16$JH16$JH16$JH16$JH16$OT5BEmJh\~> +m/I'lJH16$JH16$JH16$JH16$JH16$JH16$P5kThm/MS~> +m/I'tJXM(WJXM(WJXM(WJXM(WJXM(WqjGA&JXM(WesQNMm/MS~> +m/I'QJH16$JH16$JH16$JH16$JH16$JH16$P5kTMm/MS~> +li-t!JH16$JH16$JH16$JH16$JH16$JH16$PlLfuli2J~> +li-t'JXM(WJXM(WJXM(WJXM(WJXM(WpR08+JXM(We!U3Sli2J~> +li-s^JH16$JH16$JH16$JH16$JH16$JH16$PlLf]li2J~> +lMgk3JH16$JH16$JH16$JH16$JH16$JH16$QN.$5lMlA~> +lMgk6JXM(WJXM(WJXM(WJXM(WJXM(WoU481JXM(Wc^=d_lMlA~> +lMgk"JH16$JH16$JH16$JH16$JH16$JH16$QN.$$lMlA~> +l2LeH*e= +l2LeIL4PbDR=UcWR=UcWR=UcWR=UcWRI?R(!.gPhREM!!L?Ih$J,~> +l2Le>#_;u,!.b-$!.b-$!.b-$!.b-$!.b-$!1Nrh#i+\EJ,~> +kl1\Y;1S^u!.b-$!.b-$!.b-$!.b-$!.b-$!1a)j;>BATJ,~> +kl1\YKn5YCR=UcWR=UcWR=UcWR=UcWR=UcWR at T`HL%sm3J,~> +kl1\V/:deP!.b-$!.b-$!.b-$!.b-$!.b-$!1a)j/G86,J,~> +k5PF at JH16$JH16$JH16$JH16$JH16$JH16$T)\kNk5Tr~> +k5PFSJXM(WJXM(WJXM(WJXM(WJXM(WJXM(WT:#\Pk5Tr~> +k5PEqJH16$JH16$JH16$JH16$JH16$JH16$T)\k*k5Tr~> +jo5A(#(Zc*!.b-$!.b-$!.b-$!.b-$!.b-$!2BMp#0Q'-J,~> +jo5A+PC]-QR=UcWR=UcWR=UcWR=UcWR=UcWRA6/NPKi4hJ,~> +jo5=gJH16$JH16$JH16$JH16$JH16$JH16$T`>)#jo9i~> +jSo8R>Ccd*!.b-$!.b-$!.b-$!.b-$!.b-$!2TYr>P7(WJ,~> +jSo8RLk1tFR=UcWR=UcWR=UcWR=UcWR=UcWRAH;PM"Tj/J,~> +jSo8N21YaY!.b-$!.b-$!.b-$!.b-$!.b-$!2TYr2=]c-J,~> +ir9"eJH16$JH16$JH16$JH16$JH16$JH16$VZ6_*ir=N~> +ir9"lJXM(WJXM(WJXM(WJXM(WJXM(WJXM(WVjROuir=N~> +ir9"JJH16$JH16$JH16$JH16$JH16$JH16$VZ6^dir=N~> +iVrrOCOlJ:!.b-$!.b-$!.b-$!.b-$!.b-$!36)#C\?ZdJ,~> +iVrrONe*ULR=UcWR=UcWR=UcWR=UcWR=UcWRB)_VNqMB2J,~> +iVrrK7"G>h!.b-$!.b-$!.b-$!.b-$!.b-$!36)#7.K79J,~> +hu<`,14]FV!.b-$!.b-$!.b-$!.b-$!.b-$!3ZA'1=Y4]J,~> +hu<`.Jq9>@R=UcWR=UcWR=UcWR=UcWR=UcWRBN"ZK%AiZJ,~> +hu<_p'7g.7!.b-$!.b-$!.b-$!.b-$!.b-$!3ZA''>r`-J,~> +h>[Ma'S-78!.b-$!.b-$!.b-$!.b-$!.b-$!4)Y+'XlitJ,~> +h>[MhMLh1HR=UcWR=UcWR=UcWR=UcWR=UcWRBr:^MS7jGJ,~> +h>[MF"G$Q(!.b-$!.b-$!.b-$!.b-$!.b-$!4)Y+"In6IJ,~> +h#@HTWXjX\JH16$JH16$JH16$JH16$JH16$JH3.Z!Y;=1h#Dm~> +h#@HT[#KX)JXM(WJXM(WJXM(WJXM(WJXM(WJXO!8!faSdh#Dm~> +h#@HSMunP1JH16$JH16$JH16$JH16$JH16$JH3.Z!Wn>Zh#Dm~> +gA_6RZQk#$JH16$JH16$JH16$JH16$JH16$JH3:^![G&NgAc[~> +gA_6R]7kg(JXM(WJXM(WJXM(WJXM(WJXM(WJXO- +gA_6QQjSBEJH16$JH16$JH16$JH16$JH16$JH3:^!Xb=ngAc[~> +fDblr;1S^u!.b-$!.b-$!.b-$!.b-$!.b-$!5AL7;9d_mJ,~> +fDbm!Kn5YCR=UcWR=UcWR=UcWR=UcWR=UcWRD5-jL!eNPJ,~> +fDbl_/:deP!.b-$!.b-$!.b-$!.b-$!.b-$!5AL7/@sI5J,~> +ec,^?Ql^eYJH16$JH16$JH16$JH16$JH16$JH3Xh!Zm`uec1.~> +ec,^?VhTbjJXM(WJXM(WJXM(WJXM(WJXM(WJXOKF!f!WBec1.~> +ec,^8G6ia"JH16$JH16$JH16$JH16$JH16$JH3Xh!XO#7ec1.~> +df0C-M&q3JJH16$JH16$JH16$JH16$JH16$JH3jn!Zm3Wdf4g~> +df0C.Sq_faJXM(WJXM(WJXM(WJXM(WJXM(WJXO]L!f!<+df4g~> +df0C!AdEqfJH16$JH16$JH16$JH16$JH16$JH3jn!XNDgdf4g~> +ci4(3W_nu_ci8L~> +ci4(4["X(!JXM(WJXM(WJXM(WJXM(WJXM(WJXOoR!en#Ici8L~> +ci4(+N%BM[JH16$JH16$JH16$JH16$JH16$JH4't!\B;ici8L~> +bPq\,ZZ.OI!.b-$!.b-$!.b-$!.b-$!.b-$!.b.)!!=clZf]I2J,~> +bPq\-]9._sR=UcWR=UcWR=UcWR=UcWR=UcWR=Ud\R0/)(]B at B;J,~> +bPq\"QqJ!A!.b-$!.b-$!.b-$!.b-$!.b-$!.b.)!! +a8ZMGnC4e(CJ6K)%gIRbJH16$JH16$JH16$JH16$JH16$JH53?$3h"^1/)JCZdeLDa8^Y~> +a8ZMGnCG4ENeE"=NK\p]JXM(WJXM(WJXM(WJXM(WJXM(WJXQ%r$BpI(JqT/W]@QKNa8^Y~> +a8ZJEl,/m&6miWR!eC?&!.b-$!.b-$!.b-$!.b-$!.b-$!:Kmo!XKGe6tr%+l2A[&J,~> +%%EndData +showpage +%%Trailer +end +%%EOF From phk at projects.linpro.no Tue Aug 5 11:27:16 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 5 Aug 2008 13:27:16 +0200 (CEST) Subject: r3064 - in trunk/varnish-doc/en: . sheets sheets/request-processing Message-ID: <20080805112716.34C4C1EC10A@projects.linpro.no> Author: phk Date: 2008-08-05 13:27:14 +0200 (Tue, 05 Aug 2008) New Revision: 3064 Added: trunk/varnish-doc/en/sheets/ trunk/varnish-doc/en/sheets/request-processing/ trunk/varnish-doc/en/sheets/request-processing/request-processing.sh Log: Add script to generate the request-processing state diagram cheat-sheet. Added: trunk/varnish-doc/en/sheets/request-processing/request-processing.sh =================================================================== --- trunk/varnish-doc/en/sheets/request-processing/request-processing.sh (rev 0) +++ trunk/varnish-doc/en/sheets/request-processing/request-processing.sh 2008-08-05 11:27:14 UTC (rev 3064) @@ -0,0 +1,234 @@ +#!/bin/sh +# +# This script generates a sheet with the Varnish request processing +# state-graph. +# +# $Id$ + +echo ' +linethick=1.5 +boxht=.38 +boxwid=1.1 +dist=.23i +down +####################################################################### +# The hit path + +define style_hit { outline "hit_color" } + +A: box "request received" + arrow down dist style_hit +C: box "\f(CBvcl_recv{}\fP" "\f(PIreq\fP" + arrow " \f(CIlookup\fP" ljust down dist style_hit +D: box "\f(CBvcl_hash{}\fP" "\f(PIreq\fP" + arrow " \f(CIhash\fP" ljust down dist style_hit +E: box "obj in cache ?" + arrow " [yes]" ljust down dist style_hit +F: box "obj.pass ?" + arrow " [no]" ljust down dist style_hit +G: box "\f(CBvcl_hit{}\fP" "\f(PIreq obj\fP" + line invis down dist +H: box invis + line invis down dist +I: box invis + line invis down dist +J: box invis + line invis down dist +K: box invis + line invis down dist +L: box invis + line invis down dist +M: box "filter" "obj\[->]resp" + arrow down dist style_hit +N: box "\f(CBvcl_deliver{}\fP" "\f(PIresp\fP" + arrow " \f(CIdeliver\fP" ljust down dist style_hit +O: box "send resp+body" + arrow down dist style_hit +P: box "request" "completed" + arrow " \f(CIdeliver\fP" ljust from G.s to M.n style_hit + +A0: circle invis rad .1 with .c at A.w - (.7,0) +A2: box invis with .w at A.e + (.5,0) +A3: box invis with .w at A2.e + (.5,0) +A4: circle invis rad .1 with .c at A3.e + (.5,0) +A5: box invis with .w at A3.e + (1.0,0) + +define style_sleep { outline "sleep_color" } + +T2: box "sleep on busy" with .c at (A2.c, E.c) +T1: spline from E.ne to 1/2 + (0, .5) then to T2.n -> style_sleep +arrow from T2.w to E.e style_sleep + +' > /tmp/_hit + +echo ' +####################################################################### +# The miss path + +define style_miss { outline "miss_color" } + +G2: box "filter" "req\[->]bereq" with .n at (A2.n, G.n) + line from E.se down .2 right .2 style_miss + line "[no]" above to (G2.n,last line .s) style_miss + arrow to G2.n style_miss + +H2: box "\f(CBvcl_miss{}\fP" "\f(PIreq bereq\fP" with .n at (A2.n, H.n) + arrow from G2.s to H2.n style_miss + +J2: box "fetch bereq" "from backend" with .n at (A2.n, J.n) + line " \f(CIfetch\fP" ljust from H2.s down .3 style_miss + arrow to J2.n style_miss +K2: box "fetch successful ?" with .n at (A2.n, K.n) + arrow ljust from J2.s to K2.n style_miss +L2: box "\f(CBvcl_fetch{}\fP" "\f(PIreq bereq obj\fP" with .n at (A2.n, L.n) + arrow " [yes]" ljust from K2.s to L2.n style_miss + line " \f(CIdeliver\fP" ljust from L2.s to (L2.s, M.e) style_miss + arrow to M.e style_miss +' > /tmp/_miss + +echo ' +####################################################################### +# The pass path + +define style_pass { outline "pass_color" } + +H3: box "filter" "req\[->]bereq" with .w at (A3.w,H.w) + line from C.se down .2 right .2 style_pass + arrow "\f(CIpass\fP" below to (H3.n, last line .s) style_pass + arrow to H3.n style_pass + arrow "[yes]" above from F.e to (H3.n, F.e) style_pass + line up .2 right .2 from G.ne style_pass + arrow "\f(CIpass\fP" below to (H3.n,last line.e) style_pass + arrow "\f(CIpass\fP" above from H2.e to H3.w style_pass + +I3: box "\f(CBvcl_pass{}\fP" "\f(PIreq bereq\fP" with .n at (A3.n, I.n) + arrow from H3.s to I3.n style_pass + +J3: box "create anon obj" with .n at (A3.n, J.n) + arrow " \f(CIpass\fP" ljust from I3.s to J3.n style_pass + arrow from J3.w to J2.e style_pass + +M3: box "obj.pass = 1" with .n at (A3.n, M.n) + line "\f(CIpass\fP" below from L2.e to (M3.n,L2.e) style_pass + arrow to M3.n style_pass + line from M3.s to (M3.s, M.s) - (0,.2) style_pass + line to M.se + (.2,-.2) style_pass + arrow to M.se style_pass + +' > /tmp/_pass + +echo ' +####################################################################### +# The pipe path + +define style_pipe { outline "pipe_color" } + +C5: box "filter" "req\[->]bereq" with .n at (A5.n, C.n) +D5: box "\f(CBvcl_pipe{}\fP" "\f(PIreq bereq\fP" with .n at (A5.n, D.n) +E5: box "send bereq" "to backend" with .n at (A5.n, E.n) +F5: box "move bytes" "client\[<>]backend" with .n at (A5.n, F.n) + line from C.ne up .2 right .2 style_pipe + line "\f(CIpipe\fP" above to C5.nw + (-.2, .2) style_pipe + arrow to C5.nw style_pipe + arrow from C5.s to D5.n style_pipe + arrow " \f(CIpipe\fP" ljust from D5.s to E5.n style_pipe + arrow from E5.s to F5.n style_pipe + line from F5.s to (F5.n,P.e) style_pipe + arrow to P.e style_pipe + +' > /tmp/_pipe + +echo ' +####################################################################### +# The error path + +define style_error { outline "error_color" } + +N4: box "\f(CBvcl_error{}\fP" "\f(PIresp\fP" with .n at (A4.n, N.n) + arrow "\f(CIdeliver\fP" below from N4.w to N.e style_error + + line from C.e to (A4.w,C.e) style_error + arrow "\f(CIerror\fP" rjust above to (A4.n,last line.s) style_error + arrow to N4.n style_error + + line from G.se down .1 right .1 style_error + line to (A4.w,last line.s) style_error + arrow "\f(CIerror\fP" rjust above to (A4.n,last line.s) style_error + + line from H2.se down .1 right .1 style_error + line to (A4.w,last line.s) style_error + arrow "\f(CIerror\fP" rjust above to (A4.n,last line.s) style_error + + arrow "\f(CIerror\fP" above from I3.e to (A4.n,I3.e) style_error + + line from K2.e to (A4.w,K2.e) style_error + arrow "[no]" rjust above to (A4.n,last line.s) style_error + + line from L2.ne up .1 right .1 style_error + line to (A4.w,last line.e) style_error + arrow "\f(CIerror\fP" rjust above to (A4.n,last line.s) style_error + + arrow "\f(CIerror\fP" above from D5.w to (A4.n,D5.w) style_error +' > /tmp/_error + +echo ' +####################################################################### +# The restart path + +define style_restart { outline "restart_color" } + + arrow "\f(CIrestart\fP" above from G.w to (A0.c, G.w) style_restart + + line left from H2.w to H.w style_restart + arrow "\f(CIrestart\fP" above to (A0.c, H2.w) style_restart + + line left from I3.w to I.w style_restart + arrow "\f(CIrestart\fP" above to (A0.c, I3.w) style_restart + + line left from L2.w to L.w style_restart + arrow "\f(CIrestart\fP" above to (A0.c, L2.w) style_restart + + arrow "\f(CIrestart\fP" above from N.w to (A0.c, N.w) style_restart + line to (A0.c, C.w) style_restart + arrow to C.w style_restart + +' > /tmp/_restart + +( + +rm -f /tmp/_ + +for i in hit miss pass pipe error restart +do + cat /tmp/_$i >> /tmp/_ + echo ' +.sp .1i +.mk +.PSPIC -L ../../../../varnish-logo/logo/varnish-logo.eps 3i +.rt +.sp .52i +.ft PB +.ps 30 +.ll 8i +.ti 3.2i +Request processing +.ft PR +.ps 10 +.sp .2i +' + echo ".defcolor hit_color rgb #009900" + echo ".defcolor miss_color rgb #0000cc" + echo ".defcolor pass_color rgb #cc0000" + echo ".defcolor pipe_color rgb #ff6633" + echo ".defcolor error_color rgb #666666" + echo ".defcolor restart_color rgb #990099" + echo ".defcolor sleep_color rgb #cccc00" + echo .PS + cat /tmp/_ + echo .PE + if [ $i != "restart" ] ; then + echo .bp + fi +done +) | pic | groff -o6 | tee /tmp/_2.ps |ps2pdf - /tmp/_.pdf + Property changes on: trunk/varnish-doc/en/sheets/request-processing/request-processing.sh ___________________________________________________________________ Name: svn:keywords + Id From petter at projects.linpro.no Wed Aug 6 12:10:02 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Wed, 6 Aug 2008 14:10:02 +0200 (CEST) Subject: r3065 - in trunk/varnish-cache: etc man Message-ID: <20080806121002.E9C661EC220@projects.linpro.no> Author: petter Date: 2008-08-06 14:10:02 +0200 (Wed, 06 Aug 2008) New Revision: 3065 Added: trunk/varnish-cache/man/vcl.7so Removed: trunk/varnish-cache/etc/default.vcl trunk/varnish-cache/man/vcl.7 Modified: trunk/varnish-cache/etc/Makefile.am trunk/varnish-cache/man/Makefile.am Log: Updated the man page for vcl to include the default bin/varnishd/default.vcl so it is easier kept in sync. Same goes for etc/default.vcl, which now is generated from the same bin/varnishd/default.vcl. Modified: trunk/varnish-cache/etc/Makefile.am =================================================================== --- trunk/varnish-cache/etc/Makefile.am 2008-08-05 11:27:14 UTC (rev 3064) +++ trunk/varnish-cache/etc/Makefile.am 2008-08-06 12:10:02 UTC (rev 3065) @@ -1,3 +1,24 @@ # $Id$ -EXTRA_DIST = default.vcl zope-plone.vcl +EXTRA_DIST = zope-plone.vcl + +dist_data_DATA = default.vcl + +default.vcl: + echo -e "This is a basic VCL configuration file for varnish. See the vcl(7)\n\ +man page for details on VCL syntax and semantics.\n\ +\n\ +Default backend definition. Set this to point to your content\n\ +server.\n\ +\n\ +backend default {\n\ + .host = "127.0.0.1";\n\ + .port = "8080";\n\ +}\n\ +\n\ +Below is a commented-out copy of the default VCL logic. If you\n\ +redefine any of these subroutines, the built-in logic will be\n\ +appended to your code.\n" > tmp.vcl + sed -n '/vcl_recv/,$$p' ../bin/varnishd/default.vcl >> tmp.vcl + sed 's/^\(.*\)$$/#\1/' tmp.vcl > default.vcl + rm tmp.vcl Deleted: trunk/varnish-cache/etc/default.vcl =================================================================== --- trunk/varnish-cache/etc/default.vcl 2008-08-05 11:27:14 UTC (rev 3064) +++ trunk/varnish-cache/etc/default.vcl 2008-08-06 12:10:02 UTC (rev 3065) @@ -1,115 +0,0 @@ -# -# This is a basic VCL configuration file for varnish. See the vcl(7) -# man page for details on VCL syntax and semantics. -# -# $Id$ -# - -# Default backend definition. Set this to point to your content -# server. - -backend default { - .host = "127.0.0.1"; - .port = "8080"; -} - -# Below is a commented-out copy of the default VCL logic. If you -# redefine any of these subroutines, the built-in logic will be -# appended to your code. - -## Called when a client request is received -# -#sub vcl_recv { -# if (req.request != "GET" && -# req.request != "HEAD" && -# req.request != "PUT" && -# req.request != "POST" && -# req.request != "TRACE" && -# req.request != "OPTIONS" && -# req.request != "DELETE") { -# pipe; -# } -# if (req.http.Expect) { -# pipe; -# } -# if (req.request != "GET" && req.request != "HEAD") { -# pass; -# } -# if (req.http.Authorization || req.http.Cookie) { -# pass; -# } -# lookup; -#} -# -## Called when entering pipe mode -# -#sub vcl_pipe { -# pipe; -#} -# -## Called when entering pass mode -# -#sub vcl_pass { -# pass; -#} -# -## Called when entering an object into the cache -# -#sub vcl_hash { -# set req.hash += req.url; -# if (req.http.host) { -# set req.hash += req.http.host; -# } else { -# set req.hash += server.ip; -# } -# hash; -#} -# -## Called when the requested object was found in the cache -# -#sub vcl_hit { -# if (!obj.cacheable) { -# pass; -# } -# deliver; -#} -# -## Called when the requested object was not found in the cache -# -#sub vcl_miss { -# fetch; -#} -# -## Called when the requested object has been retrieved from the -## backend, or the request to the backend has failed -# -#sub vcl_fetch { -# if (!obj.valid) { -# error obj.status; -# } -# if (!obj.cacheable) { -# pass; -# } -# if (obj.http.Set-Cookie) { -# pass; -# } -# set obj.prefetch = -30s; insert; -#} -# -## Called before a cached object is delivered to the client -# -#sub vcl_deliver { -# deliver; -#} -# -## Called when an object nears its expiry time -# -#sub vcl_timeout { -# discard; -#} -# -# Called when an object is about to be discarded -# -#sub vcl_discard { -# discard; -#} Modified: trunk/varnish-cache/man/Makefile.am =================================================================== --- trunk/varnish-cache/man/Makefile.am 2008-08-05 11:27:14 UTC (rev 3064) +++ trunk/varnish-cache/man/Makefile.am 2008-08-06 12:10:02 UTC (rev 3065) @@ -1,3 +1,8 @@ # $Id$ dist_man_MANS = vcl.7 + +vcl.7: vcl.7so default.vcl + soelim $< > $@ +default.vcl: ../bin/varnishd/default.vcl + sed -n '/vcl_recv/,$$w $@' $< Deleted: trunk/varnish-cache/man/vcl.7 =================================================================== --- trunk/varnish-cache/man/vcl.7 2008-08-05 11:27:14 UTC (rev 3064) +++ trunk/varnish-cache/man/vcl.7 2008-08-06 12:10:02 UTC (rev 3065) @@ -1,681 +0,0 @@ -.\"- -.\" Copyright (c) 2006 Verdens Gang AS -.\" Copyright (c) 2006-2008 Linpro AS -.\" All rights reserved. -.\" -.\" Author: Dag-Erling Sm?rgrav -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $Id$ -.\" -.Dd August 10, 2007 -.Dt VCL 7 -.Os -.Sh NAME -.Nm VCL -.Nd Varnish Configuration Language -.Sh DESCRIPTION -The -.Nm -language is a small domain-specific language designed to be used to -define request handling and document caching policies for the Varnish -HTTP accelerator. -.Pp -When a new configuration is loaded, the -.Nm varnishd -management process translates the VCL code to C and compiles it to a -shared object which is then dynamically linked into the server -process. -.Ss Syntax -The VCL syntax is very simple, and deliberately similar to C and Perl. -Blocks are delimited by curly braces, statements end with semicolons, -and comments may be written as in C, C++ or Perl according to your own -preferences. -.Pp -In addition to the C-like assignment (=), comparison (==) and boolean -(!, && and ||) operators, VCL supports regular expression and ACL -matching using the ~ operator. -.Pp -Unlike C and Perl, the backslash (\\) character has no special meaning -in strings in VCL, which use the (%xx) escape mechanism just like URLs, -so it can be freely used in regular expressions without doubling. -.Pp -Assignments are introduced with the -.Cm set -keyword. -There are no user-defined variables; values can only be assigned to -variables attached to backend, request or document objects. -Most of these are typed, and the values assigned to them must have a -compatible unit suffix. -.Pp -VCL has -.Cm if -tests, but no loops. -.Pp -The contents of another VCL file may be inserted at any point in the -code by using the -.Cm include -keyword followed by the name of the other file as a quoted string. -.Ss Backend declarations -A backend declaration creates and initializes a named backend object: -.Bd -literal -offset 4n -backend www { - .host = "www.example.com"; - .port = "http"; -} -.Ed -.Pp -The backend object can later be used to select a backend at request -time: -.Bd -literal -offset 4n -if (req.http.host ~ "^(www\.)?example.com$") { - set req.backend = www; -} -.Ed -.Ss ACLs -An ACL declaration creates and initializes a named access control list -which can later be used to match client addresses: -.Bd -literal -offset 4n -acl local { - "localhost"; /* myself */ - "192.0.2.0"/24; /* and everyone on the local network */ - ! "192.0.2.23"; /* except for the dialin router */ -} -.Ed -.Pp -If an ACL entry specifies a host name which Varnish is unable to -resolve, it will match any address it is compared to. -Consequently, if it is preceded by a negation mark, it will reject any -address it is compared to, which may not be what you intended. -If the entry is enclosed in parentheses, however, it will simply be -ignored. -.Pp -To match an IP address against an ACL, simply use the match operator: -.Bd -literal -offset 4n -if (client.ip ~ local) { - pipe; -} -.Ed -.Ss Functions -The following built-in functions are available: -.Bl -tag -width indent -.It Fn regsub "str" "regex" "sub" -Returns a copy of -.Fa str -with the first occurrence of the regular expression -.Fa regex -replaced with -.Fa sub . -Within -.Fa sub , -.Va $0 -(which can also be spelled -.Va & ) -is replaced with the entire matched string, and -.Va $n -is replaced with the contents of subgroup -.Ar n -in the matched string. -.It Fn regsuball "str" "regex" "sub" -As -.Fn regsuball -but this replaces all occurrences. -.It Fn purge_hash "regex" -Purge all objects in cache whose hash strings match -.Fa regex . -.It Fn purge_url "regex" -Purge all objects in cache whose URLs match -.Fa regex . -.El -.Ss Subroutines -A subroutine is used to group code for legibility or reusability: -.Bd -literal -offset 4n -sub pipe_if_local { - if (client.ip ~ local) { - pipe; - } -} -.Ed -.Pp -Subroutines in VCL do not take arguments, nor do they return values. -.Pp -If multiple subroutines with the same name are defined, they are -concatenated in the order in which the appear in the source. -.Pp -To call a subroutine, use the -.Cm call -keyword followed by the subroutine's name: -.Bd -literal -offset 4n -call pipe_if_local; -.Ed -.Pp -There are a number of special subroutines which hook into the Varnish -workflow. -These subroutines may inspect and manipulate HTTP headers and various -other aspects of each request, and to a certain extent decide how the -request should be handled. -Each subroutine terminates by calling one of a small number of -keywords which indicates the desired outcome. -.Bl -tag -width indent -.\" vcl_recv -.It Cm vcl_recv -Called at the beginning of a request, after the complete request has -been received and parsed. -Its purpose is to decide whether or not to serve the request, how to -do it, and, if applicable, which backend to use. -.Pp -The -.Cm vcl_recv -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm pass -Switch to pass mode. -Control will eventually pass to -.Cm vcl_pass . -.It Cm pipe -Switch to pipe mode. -Control will eventually pass to -.Cm vcl_pipe . -.It Cm lookup -Look up the requested object in the cache. -Control will eventually pass to -.Cm vcl_hit -or -.Cm vcl_miss , -depending on whether the object is in the cache. -.El -.\" vcl_pipe -.It Cm vcl_pipe -Called upon entering pipe mode. -In this mode, the request is passed on to the backend, and any further -data from either client or backend is passed on unaltered until either -end closes the connection. -.Pp -The -.Cm vcl_pipe -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm pipe -Proceed with pipe mode. -.El -.\" vcl_pass -.It Cm vcl_pass -Called upon entering pass mode. -In this mode, the request is passed on to the backend, and the -backend's response is passed on to the client, but is not entered into -the cache. -Subsequent requests submitted over the same client connection are -handled normally. -.Pp -The -.Cm vcl_pass -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm pass -Proceed with pass mode. -.El -.\" vcl_hash -.It Cm vcl_hash -Currently not used. -The -.Cm vcl_hash -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm hash -Proceed. -.El -.\" vcl_hit -.It Cm vcl_hit -Called after a cache lookup if the requested document was found in the -cache. -.Pp -The -.Cm vcl_hit -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm pass -Switch to pass mode. -Control will eventually pass to -.Cm vcl_pass . -.It Cm deliver -Deliver the cached object to the client. -Control will eventually pass to -.Cm vcl_deliver . -.El -.\" vcl_miss -.It Cm vcl_miss -Called after a cache lookup if the requested document was not found in -the cache. -Its purpose is to decide whether or not to attempt to retrieve the -document from the backend, and which backend to use. -.Pp -The -.Cm vcl_miss -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm pass -Switch to pass mode. -Control will eventually pass to -.Cm vcl_pass . -.It Cm fetch -Retrieve the requested object from the backend. -Control will eventually pass to -.Cm vcl_fetch . -.El -.\" vcl_fetch -.It Cm vcl_fetch -Called after a document has been successfully retrieved from the -backend. -.Pp -The -.Cm vcl_fetch -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm pass -Switch to pass mode. -Control will eventually pass to -.Cm vcl_pass . -.It Cm insert -Insert the object into the cache, then deliver it to the client. -Control will eventually pass to -.Cm vcl_deliver . -.El -.\" vcl_deliver -.It Cm vcl_deliver -Called before a cached object is delivered to the client. -.Pp -The -.Cm vcl_deliver -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm error Ar code Op Ar reason -Return the specified error code to the client and abandon the -request. -.It Cm deliver -Deliver the object to the client. -.El -.\" vcl_timeout -.It Cm vcl_timeout -Called by the reaper thread shortly before a cached document reaches -its expiry time. -.Pp -The -.Cm vcl_timeout -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm fetch -Request a fresh copy of the object from the backend. -.It Cm discard -Discard the object. -.El -.\" vcl_discard -.It Cm vcl_discard -Called by the reaper thread when a cached document is about to be -discarded, either because it has expired or because space is running -low. -.Pp -The -.Cm vcl_discard -subroutine may terminate with one of the following keywords: -.Bl -tag -width indent -.It Cm discard -Discard the object. -.It Cm keep -Keep the object in cache. -.El -.El -.Pp -If one of these subroutines is left undefined or terminates without -reaching a handling decision, control will be handed over to the -builtin default. -See the -.Sx EXAMPLES -section for a listing of the default code. -.Ss Variables -Although subroutines take no arguments, the necessary information is -made available to the handler subroutines through global variables. -.Pp -The following variables are always available: -.Bl -tag -width 4n -.It Va now -The current time, in seconds since the epoch. -.El -.Pp -The following variables are available in backend declarations: -.Bl -tag -width 4n -.It Va backend.host -Host name or IP address of a backend. -.It Va backend.port -Service name or port number of a backend. -.El -.Pp -The following variables are available while processing a request: -.Bl -tag -width 4n -.It Va client.ip -The client's IP address. -.It Va server.ip -The IP address of the socket on which the client connection was -received. -.It Va server.port -The port number of the socket on which the client connection was -received. -.It Va req.request -The request type (e.g. "GET", "HEAD"). -.It Va req.url -The requested URL. -.It Va req.proto -The HTTP protocol version used by the client. -.It Va req.backend -The backend to use to service the request. -.It Va req.http. Ns Ar header -The corresponding HTTP -.Ar header . -.El -.Pp -The following variables are available while preparing a backend -request (either for a cache miss or for pass or pipe mode): -.Bl -tag -width 4n -.It Va bereq.request -The request type (e.g. "GET", "HEAD"). -.It Va bereq.url -The requested URL. -.It Va bereq.proto -The HTTP protocol version used to talk to the server. -.It Va bereq.http. Ns Ar header -The corresponding HTTP -.Ar header . -.El -.Pp -The following variables are available after the requested object has -been retrieved from cache or from the backend: -.Bl -tag -width 4n -.It Va obj.proto -The HTTP protocol version used when the object was retrieved. -.It Va obj.status -The HTTP status code returned by the server. -.It Va obj.response -The HTTP status message returned by the server. -.It Va obj.valid -True if the request resulted in a valid HTTP response. -.It Va obj.cacheable -True if the request resulted in a cacheable response. -.\" see cache_center.c and rfc2616.c for details -A response is considered cacheable if it is valid (see above), the -HTTP status code is 200, 203, 300, 301, 302, 404 or 410 and it has a -non-zero time-to-live when -.Cm Expires -and -.Cm Cache-Control -headers are taken into account. -.It Va obj.ttl -The object's remaining time to live, in seconds. -.It Va obj.lastuse -The approximate time elapsed since the object was last requests, in -seconds. -.El -.Pp -The following variables are available while determining the hash key -of an object: -.Bl -tag -width 4n -.It Va req.hash -The hash key used to refer to an object in the cache. Used when both -reading from and writing to the cache. -.El -.Pp -The following variables are available while preparing a response to -the client: -.Bl -tag -width 4n -.It Va resp.proto -The HTTP protocol version to use for the response. -.It Va resp.status -The HTTP status code that will be returned. -.It Va resp.response -The HTTP status message that will be returned. -.It Va resp.http. Ns Ar header -The corresponding HTTP -.Ar header . -.El -.Pp -Values may be assigned to variables using the -.Cm set -keyword: -.Bd -literal -offset 4n -sub vcl_recv { - # Normalize the Host: header - if (req.http.host ~ "^(www\.)?example\.com$") { - set req.http.host = "www.example.com"; - } -} -.Ed -.Pp -HTTP headers can be removed entirely using the -.Cm remove -keyword: -.Bd -literal -offset 4n -sub vcl_fetch { - # Don't cache cookies - remove obj.http.Set-Cookie; -} -.Ed -.Sh EXAMPLES -The following code is the equivalent of the default configuration with -the backend address set to "backend.example.com" and no backend port -specified. -.\" Keep this in synch with bin/varnishd/mgt_vcc.c and etc/default.vcl -.Bd -literal -offset 4n -backend default { - set backend.host = "backend.example.com"; - set backend.port = "http"; -} - -sub vcl_recv { - if (req.request != "GET" && - req.request != "HEAD" && - req.request != "PUT" && - req.request != "POST" && - req.request != "TRACE" && - req.request != "OPTIONS" && - req.request != "DELETE") { - pipe; - } - if (req.http.Expect) { - pipe; - } - if (req.request != "GET" && req.request != "HEAD") { - pass; - } - if (req.http.Authorization || req.http.Cookie) { - pass; - } - lookup; -} - -sub vcl_pipe { - pipe; -} - -sub vcl_pass { - pass; -} - -sub vcl_hash { - set req.hash += req.url; - if (req.http.host) { - set req.hash += req.http.host; - } else { - set req.hash += server.ip; - } - hash; -} - -sub vcl_hit { - if (!obj.cacheable) { - pass; - } - deliver; -} - -sub vcl_miss { - fetch; -} - -sub vcl_fetch { - if (!obj.valid) { - error obj.status; - } - if (!obj.cacheable) { - pass; - } - if (obj.http.Set-Cookie) { - pass; - } - set obj.prefetch = -30s; insert; -} - -sub vcl_deliver { - deliver; -} - -sub vcl_discard { - discard; -} - -sub vcl_timeout { - discard; -} -.Ed -.Pp -The following example shows how to support multiple sites running on -separate backends in the same Varnish instance, by selecting backends -based on the request URL. -.Bd -literal -offset 4n -backend www { - set backend.host = "www.example.com"; - set backend.port = "80"; -} - -backend images { - set backend.host = "images.example.com"; - set backend.port = "80"; -} - -sub vcl_recv { - if (req.http.host ~ "^(www\.)?example\.com$") { - set req.http.host = "www.example.com"; - set req.backend = www; - } elsif (req.http.host ~ "^images\.example\.com$") { - set req.backend = images; - } else { - error 404 "Unknown virtual host"; - } -} -.Ed -.Pp -The following snippet demonstrates how to force a minimum TTL for all -documents. -Note that this is not the same as setting the -.Va default_ttl -run-time parameter, as that only affects document for which the -backend did not specify a TTL. -.Bd -literal -offset 4n -sub vcl_fetch { - if (obj.ttl < 120s) { - set obj.ttl = 120s; - } -} -.Ed -.Pp -The following snippet demonstrates how to force Varnish to cache -documents even when cookies are present. -.Bd -literal -offset 4n -sub vcl_recv { - if (req.request == "GET" && req.http.cookie) { - lookup; - } -} - -sub vcl_fetch { - if (obj.http.Set-Cookie) { - insert; - } -} -.Ed -.Pp -The following code implements the HTTP PURGE method as used by Squid -for object invalidation: -.Bd -literal -offset 4n -acl purge { - "localhost"; - "192.0.2.1"/24; -} - -sub vcl_recv { - if (req.request == "PURGE") { - if (!client.ip ~ purge) { - error 405 "Not allowed."; - } - lookup; - } -} - -sub vcl_hit { - if (req.request == "PURGE") { - set obj.ttl = 0s; - error 200 "Purged."; - } -} - -sub vcl_miss { - if (req.request == "PURGE") { - error 404 "Not in cache."; - } -} -.Ed -.Sh SEE ALSO -.Xr varnishd 1 -.Sh HISTORY -The -.Nm -language was developed by -.An Poul-Henning Kamp Aq phk at phk.freebsd.dk -in cooperation with Verdens Gang AS and Linpro AS. -This manual page was written by -.An Dag-Erling Sm\(/orgrav Aq des at des.no . Copied: trunk/varnish-cache/man/vcl.7so (from rev 3064, trunk/varnish-cache/man/vcl.7) =================================================================== --- trunk/varnish-cache/man/vcl.7so (rev 0) +++ trunk/varnish-cache/man/vcl.7so 2008-08-06 12:10:02 UTC (rev 3065) @@ -0,0 +1,607 @@ +.\"- +.\" Copyright (c) 2006 Verdens Gang AS +.\" Copyright (c) 2006-2008 Linpro AS +.\" All rights reserved. +.\" +.\" Author: Dag-Erling Sm?rgrav +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd August 10, 2007 +.Dt VCL 7 +.Os +.Sh NAME +.Nm VCL +.Nd Varnish Configuration Language +.Sh DESCRIPTION +The +.Nm +language is a small domain-specific language designed to be used to +define request handling and document caching policies for the Varnish +HTTP accelerator. +.Pp +When a new configuration is loaded, the +.Nm varnishd +management process translates the VCL code to C and compiles it to a +shared object which is then dynamically linked into the server +process. +.Ss Syntax +The VCL syntax is very simple, and deliberately similar to C and Perl. +Blocks are delimited by curly braces, statements end with semicolons, +and comments may be written as in C, C++ or Perl according to your own +preferences. +.Pp +In addition to the C-like assignment (=), comparison (==) and boolean +(!, && and ||) operators, VCL supports regular expression and ACL +matching using the ~ operator. +.Pp +Unlike C and Perl, the backslash (\\) character has no special meaning +in strings in VCL, which use the (%xx) escape mechanism just like URLs, +so it can be freely used in regular expressions without doubling. +.Pp +Assignments are introduced with the +.Cm set +keyword. +There are no user-defined variables; values can only be assigned to +variables attached to backend, request or document objects. +Most of these are typed, and the values assigned to them must have a +compatible unit suffix. +.Pp +VCL has +.Cm if +tests, but no loops. +.Pp +The contents of another VCL file may be inserted at any point in the +code by using the +.Cm include +keyword followed by the name of the other file as a quoted string. +.Ss Backend declarations +A backend declaration creates and initializes a named backend object: +.Bd -literal -offset 4n +backend www { + .host = "www.example.com"; + .port = "http"; +} +.Ed +.Pp +The backend object can later be used to select a backend at request +time: +.Bd -literal -offset 4n +if (req.http.host ~ "^(www\.)?example.com$") { + set req.backend = www; +} +.Ed +.Ss ACLs +An ACL declaration creates and initializes a named access control list +which can later be used to match client addresses: +.Bd -literal -offset 4n +acl local { + "localhost"; /* myself */ + "192.0.2.0"/24; /* and everyone on the local network */ + ! "192.0.2.23"; /* except for the dialin router */ +} +.Ed +.Pp +If an ACL entry specifies a host name which Varnish is unable to +resolve, it will match any address it is compared to. +Consequently, if it is preceded by a negation mark, it will reject any +address it is compared to, which may not be what you intended. +If the entry is enclosed in parentheses, however, it will simply be +ignored. +.Pp +To match an IP address against an ACL, simply use the match operator: +.Bd -literal -offset 4n +if (client.ip ~ local) { + pipe; +} +.Ed +.Ss Functions +The following built-in functions are available: +.Bl -tag -width indent +.It Fn regsub "str" "regex" "sub" +Returns a copy of +.Fa str +with the first occurrence of the regular expression +.Fa regex +replaced with +.Fa sub . +Within +.Fa sub , +.Va $0 +(which can also be spelled +.Va & ) +is replaced with the entire matched string, and +.Va $n +is replaced with the contents of subgroup +.Ar n +in the matched string. +.It Fn regsuball "str" "regex" "sub" +As +.Fn regsuball +but this replaces all occurrences. +.It Fn purge_hash "regex" +Purge all objects in cache whose hash strings match +.Fa regex . +.It Fn purge_url "regex" +Purge all objects in cache whose URLs match +.Fa regex . +.El +.Ss Subroutines +A subroutine is used to group code for legibility or reusability: +.Bd -literal -offset 4n +sub pipe_if_local { + if (client.ip ~ local) { + pipe; + } +} +.Ed +.Pp +Subroutines in VCL do not take arguments, nor do they return values. +.Pp +If multiple subroutines with the same name are defined, they are +concatenated in the order in which the appear in the source. +.Pp +To call a subroutine, use the +.Cm call +keyword followed by the subroutine's name: +.Bd -literal -offset 4n +call pipe_if_local; +.Ed +.Pp +There are a number of special subroutines which hook into the Varnish +workflow. +These subroutines may inspect and manipulate HTTP headers and various +other aspects of each request, and to a certain extent decide how the +request should be handled. +Each subroutine terminates by calling one of a small number of +keywords which indicates the desired outcome. +.Bl -tag -width indent +.\" vcl_recv +.It Cm vcl_recv +Called at the beginning of a request, after the complete request has +been received and parsed. +Its purpose is to decide whether or not to serve the request, how to +do it, and, if applicable, which backend to use. +.Pp +The +.Cm vcl_recv +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm pass +Switch to pass mode. +Control will eventually pass to +.Cm vcl_pass . +.It Cm pipe +Switch to pipe mode. +Control will eventually pass to +.Cm vcl_pipe . +.It Cm lookup +Look up the requested object in the cache. +Control will eventually pass to +.Cm vcl_hit +or +.Cm vcl_miss , +depending on whether the object is in the cache. +.El +.\" vcl_pipe +.It Cm vcl_pipe +Called upon entering pipe mode. +In this mode, the request is passed on to the backend, and any further +data from either client or backend is passed on unaltered until either +end closes the connection. +.Pp +The +.Cm vcl_pipe +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm pipe +Proceed with pipe mode. +.El +.\" vcl_pass +.It Cm vcl_pass +Called upon entering pass mode. +In this mode, the request is passed on to the backend, and the +backend's response is passed on to the client, but is not entered into +the cache. +Subsequent requests submitted over the same client connection are +handled normally. +.Pp +The +.Cm vcl_pass +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm pass +Proceed with pass mode. +.El +.\" vcl_hash +.It Cm vcl_hash +Currently not used. +The +.Cm vcl_hash +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm hash +Proceed. +.El +.\" vcl_hit +.It Cm vcl_hit +Called after a cache lookup if the requested document was found in the +cache. +.Pp +The +.Cm vcl_hit +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm pass +Switch to pass mode. +Control will eventually pass to +.Cm vcl_pass . +.It Cm deliver +Deliver the cached object to the client. +Control will eventually pass to +.Cm vcl_deliver . +.El +.\" vcl_miss +.It Cm vcl_miss +Called after a cache lookup if the requested document was not found in +the cache. +Its purpose is to decide whether or not to attempt to retrieve the +document from the backend, and which backend to use. +.Pp +The +.Cm vcl_miss +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm pass +Switch to pass mode. +Control will eventually pass to +.Cm vcl_pass . +.It Cm fetch +Retrieve the requested object from the backend. +Control will eventually pass to +.Cm vcl_fetch . +.El +.\" vcl_fetch +.It Cm vcl_fetch +Called after a document has been successfully retrieved from the +backend. +.Pp +The +.Cm vcl_fetch +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm pass +Switch to pass mode. +Control will eventually pass to +.Cm vcl_pass . +.It Cm insert +Insert the object into the cache, then deliver it to the client. +Control will eventually pass to +.Cm vcl_deliver . +.El +.\" vcl_deliver +.It Cm vcl_deliver +Called before a cached object is delivered to the client. +.Pp +The +.Cm vcl_deliver +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm error Ar code Op Ar reason +Return the specified error code to the client and abandon the +request. +.It Cm deliver +Deliver the object to the client. +.El +.\" vcl_timeout +.It Cm vcl_timeout +Called by the reaper thread shortly before a cached document reaches +its expiry time. +.Pp +The +.Cm vcl_timeout +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm fetch +Request a fresh copy of the object from the backend. +.It Cm discard +Discard the object. +.El +.\" vcl_discard +.It Cm vcl_discard +Called by the reaper thread when a cached document is about to be +discarded, either because it has expired or because space is running +low. +.Pp +The +.Cm vcl_discard +subroutine may terminate with one of the following keywords: +.Bl -tag -width indent +.It Cm discard +Discard the object. +.It Cm keep +Keep the object in cache. +.El +.El +.Pp +If one of these subroutines is left undefined or terminates without +reaching a handling decision, control will be handed over to the +builtin default. +See the +.Sx EXAMPLES +section for a listing of the default code. +.Ss Variables +Although subroutines take no arguments, the necessary information is +made available to the handler subroutines through global variables. +.Pp +The following variables are always available: +.Bl -tag -width 4n +.It Va now +The current time, in seconds since the epoch. +.El +.Pp +The following variables are available in backend declarations: +.Bl -tag -width 4n +.It Va backend.host +Host name or IP address of a backend. +.It Va backend.port +Service name or port number of a backend. +.El +.Pp +The following variables are available while processing a request: +.Bl -tag -width 4n +.It Va client.ip +The client's IP address. +.It Va server.ip +The IP address of the socket on which the client connection was +received. +.It Va server.port +The port number of the socket on which the client connection was +received. +.It Va req.request +The request type (e.g. "GET", "HEAD"). +.It Va req.url +The requested URL. +.It Va req.proto +The HTTP protocol version used by the client. +.It Va req.backend +The backend to use to service the request. +.It Va req.http. Ns Ar header +The corresponding HTTP +.Ar header . +.El +.Pp +The following variables are available while preparing a backend +request (either for a cache miss or for pass or pipe mode): +.Bl -tag -width 4n +.It Va bereq.request +The request type (e.g. "GET", "HEAD"). +.It Va bereq.url +The requested URL. +.It Va bereq.proto +The HTTP protocol version used to talk to the server. +.It Va bereq.http. Ns Ar header +The corresponding HTTP +.Ar header . +.El +.Pp +The following variables are available after the requested object has +been retrieved from cache or from the backend: +.Bl -tag -width 4n +.It Va obj.proto +The HTTP protocol version used when the object was retrieved. +.It Va obj.status +The HTTP status code returned by the server. +.It Va obj.response +The HTTP status message returned by the server. +.It Va obj.valid +True if the request resulted in a valid HTTP response. +.It Va obj.cacheable +True if the request resulted in a cacheable response. +.\" see cache_center.c and rfc2616.c for details +A response is considered cacheable if it is valid (see above), the +HTTP status code is 200, 203, 300, 301, 302, 404 or 410 and it has a +non-zero time-to-live when +.Cm Expires +and +.Cm Cache-Control +headers are taken into account. +.It Va obj.ttl +The object's remaining time to live, in seconds. +.It Va obj.lastuse +The approximate time elapsed since the object was last requests, in +seconds. +.El +.Pp +The following variables are available while determining the hash key +of an object: +.Bl -tag -width 4n +.It Va req.hash +The hash key used to refer to an object in the cache. Used when both +reading from and writing to the cache. +.El +.Pp +The following variables are available while preparing a response to +the client: +.Bl -tag -width 4n +.It Va resp.proto +The HTTP protocol version to use for the response. +.It Va resp.status +The HTTP status code that will be returned. +.It Va resp.response +The HTTP status message that will be returned. +.It Va resp.http. Ns Ar header +The corresponding HTTP +.Ar header . +.El +.Pp +Values may be assigned to variables using the +.Cm set +keyword: +.Bd -literal -offset 4n +sub vcl_recv { + # Normalize the Host: header + if (req.http.host ~ "^(www\.)?example\.com$") { + set req.http.host = "www.example.com"; + } +} +.Ed +.Pp +HTTP headers can be removed entirely using the +.Cm remove +keyword: +.Bd -literal -offset 4n +sub vcl_fetch { + # Don't cache cookies + remove obj.http.Set-Cookie; +} +.Ed +.Sh EXAMPLES +The following code is the equivalent of the default configuration with +the backend address set to "backend.example.com" and no backend port +specified. +.\" Keep this in synch with bin/varnishd/mgt_vcc.c and etc/default.vcl +.Bd -literal -offset 4n +backend default { + set backend.host = "backend.example.com"; + set backend.port = "http"; +} + +.so default.vcl +.Ed +.Pp +The following example shows how to support multiple sites running on +separate backends in the same Varnish instance, by selecting backends +based on the request URL. +.Bd -literal -offset 4n +backend www { + set backend.host = "www.example.com"; + set backend.port = "80"; +} + +backend images { + set backend.host = "images.example.com"; + set backend.port = "80"; +} + +sub vcl_recv { + if (req.http.host ~ "^(www\.)?example\.com$") { + set req.http.host = "www.example.com"; + set req.backend = www; + } elsif (req.http.host ~ "^images\.example\.com$") { + set req.backend = images; + } else { + error 404 "Unknown virtual host"; + } +} +.Ed +.Pp +The following snippet demonstrates how to force a minimum TTL for all +documents. +Note that this is not the same as setting the +.Va default_ttl +run-time parameter, as that only affects document for which the +backend did not specify a TTL. +.Bd -literal -offset 4n +sub vcl_fetch { + if (obj.ttl < 120s) { + set obj.ttl = 120s; + } +} +.Ed +.Pp +The following snippet demonstrates how to force Varnish to cache +documents even when cookies are present. +.Bd -literal -offset 4n +sub vcl_recv { + if (req.request == "GET" && req.http.cookie) { + lookup; + } +} + +sub vcl_fetch { + if (obj.http.Set-Cookie) { + insert; + } +} +.Ed +.Pp +The following code implements the HTTP PURGE method as used by Squid +for object invalidation: +.Bd -literal -offset 4n +acl purge { + "localhost"; + "192.0.2.1"/24; +} + +sub vcl_recv { + if (req.request == "PURGE") { + if (!client.ip ~ purge) { + error 405 "Not allowed."; + } + lookup; + } +} + +sub vcl_hit { + if (req.request == "PURGE") { + set obj.ttl = 0s; + error 200 "Purged."; + } +} + +sub vcl_miss { + if (req.request == "PURGE") { + error 404 "Not in cache."; + } +} +.Ed +.Sh SEE ALSO +.Xr varnishd 1 +.Sh HISTORY +The +.Nm +language was developed by +.An Poul-Henning Kamp Aq phk at phk.freebsd.dk +in cooperation with Verdens Gang AS and Linpro AS. +This manual page was written by +.An Dag-Erling Sm\(/orgrav Aq des at des.no . From petter at projects.linpro.no Wed Aug 6 12:16:18 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Wed, 6 Aug 2008 14:16:18 +0200 (CEST) Subject: r3066 - trunk/varnish-cache/etc Message-ID: <20080806121618.D70EC1EC6CB@projects.linpro.no> Author: petter Date: 2008-08-06 14:16:18 +0200 (Wed, 06 Aug 2008) New Revision: 3066 Modified: trunk/varnish-cache/etc/Makefile.am Log: Forgot a depedency to bin/varnishd/default.vcl Modified: trunk/varnish-cache/etc/Makefile.am =================================================================== --- trunk/varnish-cache/etc/Makefile.am 2008-08-06 12:10:02 UTC (rev 3065) +++ trunk/varnish-cache/etc/Makefile.am 2008-08-06 12:16:18 UTC (rev 3066) @@ -4,7 +4,7 @@ dist_data_DATA = default.vcl -default.vcl: +default.vcl: ../bin/varnishd/default.vcl echo -e "This is a basic VCL configuration file for varnish. See the vcl(7)\n\ man page for details on VCL syntax and semantics.\n\ \n\ From tfheen at projects.linpro.no Wed Aug 6 12:40:34 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 6 Aug 2008 14:40:34 +0200 (CEST) Subject: r3067 - trunk/varnish-cache/bin/varnishd Message-ID: <20080806124034.90E731ECE33@projects.linpro.no> Author: tfheen Date: 2008-08-06 14:40:34 +0200 (Wed, 06 Aug 2008) New Revision: 3067 Modified: trunk/varnish-cache/bin/varnishd/Makefile.am Log: Support out-of-tree builds, and make sure to clean up after ourselves. Both aka "make make distcheck work" Modified: trunk/varnish-cache/bin/varnishd/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-06 12:16:18 UTC (rev 3066) +++ trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-06 12:40:34 UTC (rev 3067) @@ -79,11 +79,14 @@ $(top_builddir)/lib/libvcl/libvcl.la \ ${DL_LIBS} ${PTHREAD_LIBS} ${NET_LIBS} ${LIBM} +EXTRA_DIST = default.vcl +DISTCLEANFILES = default_vcl.h + # # Turn the default.vcl file into a C-string we can include in the program. # default_vcl.h: default.vcl Makefile - sed -e 's/"/\\"/g' -e 's/$$/\\n"/' -e 's/^/ "/' default.vcl > $@ + sed -e 's/"/\\"/g' -e 's/$$/\\n"/' -e 's/^/ "/' $(srcdir)/default.vcl > $@ # Explicitly record dependency mgt_vcc.c: default_vcl.h From petter at projects.linpro.no Wed Aug 6 14:29:27 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Wed, 6 Aug 2008 16:29:27 +0200 (CEST) Subject: r3068 - in trunk/varnish-doc/en: . varnish-getting-started Message-ID: <20080806142927.B87AA1EC220@projects.linpro.no> Author: petter Date: 2008-08-06 16:29:27 +0200 (Wed, 06 Aug 2008) New Revision: 3068 Added: trunk/varnish-doc/en/varnish-getting-started/ trunk/varnish-doc/en/varnish-getting-started/article.txt Log: An outline and some text for a "Getting started guide" for Varnish. Added: trunk/varnish-doc/en/varnish-getting-started/article.txt =================================================================== --- trunk/varnish-doc/en/varnish-getting-started/article.txt (rev 0) +++ trunk/varnish-doc/en/varnish-getting-started/article.txt 2008-08-06 14:29:27 UTC (rev 3068) @@ -0,0 +1,261 @@ +Getting started with Varnish + +1. What is Varnish? + +Varnish is a state-of-the-art, high-performance HTTP accelerator for server-side caching of web-pages. + +Many Content Management systems (CMS) suffer from performance problems on the HTTP-server side. This is a natural result of the complex content generation process which requires many database look-ups and a CPU intensive page composition. Varnish reduces the load on the CMS by caching frequently used pages, images and other web-objects and serving these cached copies to the clients. + +Varnish is written bottom up to be a server side cache, designed to exploit computer hardware and operating system facilities to the very limit of their performance. + +Varnish is also written as a content provider tool, to give full and precise control over the content and offers unlimited flexibility to improve on the service of the CMS system backend. + +Features of Varnish +* Very fast +* Web-acceleration for slow CMS systems +* Written as a reverse proxy from the ground up +* Narrow focus on server side speedup +* Content provider features +* SMP/Multicore friendly architecture +* Blablabla + + +2. Installing Varnish + +Varnish packages are readily available for the major Linux distributions, such as Redhat, Suse and Debian. For other Linux distributions, FreeBSD and other supported platforms, Varnish must be compiled and installed from the source. The source ban be obtained from the Varnish web site, either by downloading a release tar ball or by checking out the source from the Subversion repository. For instructions on building Varnish, please refer to the project website. + +3. Configuring Varnish + +The Varnish daemon is configured by using command line options and the powerful Varnish Configuration Language (VCL). The location of the default VCL configuration file and the command line options varies, depending on what platform you have installed Varnish on. Blablablabla. + +3.x Command line options + +The command line options configures the basics of the Varnish daemon, like the listen address and port, which VCL script to use and the working directory. The following options can be set (taken from the on-line help): + +-a address:port # HTTP listen address and port +-b address:port # backend address and port + # -b + # -b ':' +-d # debug +-f file # VCL script +-F # Run in foreground +-h kind[,hashoptions] # Hash specification + # -h simple_list + # -h classic [default] + # -h classic, +-l bytesize # Size of shared memory log +-n dir # varnishd working directory +-P file # PID file +-p param=value # set parameter +-s kind[,storageoptions] # Backend storage specification + # -s malloc + # -s file [default: use /tmp] + # -s file, + # -s file,, + # -s file,,, +-t # Default TTL +-T address:port # Telnet listen address and port +-V # version +-w int[,int[,int]] # Number of worker threads + # -w + # -w min,max + # -w min,max,timeout [default: -w2,500,300] +-u user # Priviledge separation user id + +The -f option points to the VCL script to use. If it is omitted, the -b option must be used to define a backend to use with the default configuration. To enable the command-line management interface, the -T option must be used. This will enable telneting to the defined port to pass commands to the running Varnish daemon either using varnishadm or use telnet directly to the port to access the command-line interface. + +3.x VCL + +VCL is a small domain-specific language designed to be used to define request handling and document caching policies for the Varnish HTTP accelerator. Some of the features of VCL are: + +* simple syntax, similar to that of Perl and C +* access to and manipulation of requests +* regular expressions for matching +* user defined sub-routines +* access control lists +* + +The VCl configuration mainly consists of the backend and ACL definitions and a number of special sub-routines that hook into the Varnish workflow. These sub-routines may inspect and manipulate HTTP headers and various other aspects of each request, and to a certain extent decide how the request should be handled. The Varnish workflow looks like this: + +Request -> vcl_recv -> vcl_pass --------------------- + | | + | v + |-----> vcl_hash -> vcl_miss -> vcl_fetch + | | | + | | v + | -----> vcl_hit -> vcl_deliver + | | + | v + |------> vcl_pipe Response + | + v + <- Move bytes -> + +The direction in the workflow is determined in each sub-routine by a given keyword. + +Function | Description | Possible keywords +------------------------------------------------------------------------------ +vcl_recv | Called after receiving a request. | error, pass, pipe + | Decides how to serve the request | + | | +vcl_pipe | Called after entering pipe mode. | error, pipe + | Creates a direct connection between | + | the client and the backend, bypassing | + | Varnish all together. | + | | +vcl_pass | Called after entering pass mode. | error, pass + | Unlike pipe mode, only the current | + | request bypasses Varnish. Subsequent | + | requests for the same connection are | + | handled normally. | + | | +vcl_hash | Called when computing the hash key | hash + | for an object. | + | | +vcl_hit | Called after a cache hit. | error, pass, deliver + | | +vcl_miss | Called after a cache miss. | error, pass, fetch + | | +vcl_fetch | Called after a successful retrieval | error, pass, insert + | from the backend. An 'insert' will | + | add the retrieved object in the cache | + | and then continue to vcl_deliver | + | | +vcl_deliver | Called before the cached object is | error, deliver + | delivered to the client. | + | | +vcl_timeout | Called by the reaper thread shortly | discard, fetch + | before an object expires in the cache | + | 'discard' will discard the object and | + | 'fetch' will retrieve a fresh copy | + | | +vcl_discard | Called by the reaper thread when a | discard, keep + | cached object is about to be | + | discarded due to expiration or space | + | is running low | + +Varnish comes with a default configuration built in (ref til default VCL?), so it is not necessary to define all the sub-routines. The default is fairly reasonable, so Varnish should work right out of the box pretty much works right out of the box after defining a backend. It should be noted that the default sub-routines will be invoked even if the custom configuration does not terminate the sub-routine with one of the valid keywords. + + +3.x.y Defining a backend and the use of directors + +A backend can either be set by using the -b command line option, or by defining it in the VCL configuration file. A backend declaration in VCL is defined like this: + +backend www { + .host = "www.example.com"; + .port = "http"; +} + +The backend object can later be used to select a backend at request time: + +if (req.http.host ~ "^(www.)?example.com$") { + + set req.backend = www; +} + +If there are several backends delivering the same content, they can be grouped together using a director declaration: + +director www-director round-robin { + { .backend = www; } + { .backend = { .host = "www2.example.com; .port = "http"; } } +} + +A director will choose one of the defined backend depending on its policy. A 'random' director will choose a random backend, biased by a weight for each backend, and a 'round-robin' backend will choose a backend in a round robin fashion. The director object can be used in the same way as the backend object for selecting a backend: + +if (req.http.host ~ "^(www.)?example.com$") { + + set req.backend = www-director; +} + +3.x.y Access Control Lists + +An Access Control List (ACL) declaration creates and initializes a named access control list which can later be used to match client addresses: + +acl local { + "localhost"; /* myself */ + "192.0.2.0"/24; /* and everyone on the local network */ + ! "192.0.2.23"; /* except for the dialin router */ +} + +To match an IP address against an ACL, simply use the match operator: + +if (client.ip ~ local) { + pipe; +} + +3.x.y Examples + +As previously mentioned, Varnish comes with a default set of sub-routines which are used if they are missing or does not terminate with a keyword. Tuning is of course an important part of implementing a cache, so a custom configuration is most likely needed. Here are some examples to get you going. + +Selecting a backend based on the type of document can be done with the regular expression matching operator. + +sub vcl_recv { + if (req.url ~ ?\.(gif|jpg|swf|css|j)$?) { + unset req.http.cookie; + unset req.http.authenticate; + set req.backend = b1; + } else { + set req.backend = b2; + } +} + +Retrying with another backend if one backend reports a non-200 response. + +sub vcl_recv { + if (req.restarts == 0) { + set req.backend = b1; + } else { + set req.backend = b2; + } +} + +sub vcl_fetch { + if (obj.status != 200) { + restart; + } +} + +Preventing search engines from populating the cache with old documents can easily be done by checking the user-agent header in the HTTP request. + +sub vcl_miss { + if (req.http.user-agent ~ ?spider?) { + error 503 ?Not presently in cache?; + } +} + +Since it is possible to rewrite the request, fixing typos can be done in VCL. + +sub vcl_recv { + if (req.url == ?index.hmtl?) { + set req.url = ?index.html?; + } +} + + +Blablablabla. More examples? + +4. Running Varnish + +Varnish is typically invoked from a init-script, depending on how you installed Varnish. Blablablabla. + + +5. Varnish tools + +Varnish comes bundled with a set of command line tools which are useful for monitoring and administrating Varnish. These are + +* varnishncsa: Displays the varnishd shared memory logs in Apache / NCSA combined log format +* varnishlog: Reads and presents varnishd shared memory logs. +* varnishstat: Displays statistics from a running varnishd instance. +* varnishadm: Sends a command to the running varnishd instance. +* varnishhist: Reads varnishd(1) shared memory logs and presents a continuously updated histogram showing the distribution of the last N requests by their processing. +* varnishtop: Reads varnishd shared memory logs and presents a continuously updated list of the most commonly occurring log entries. +* varnishreplay: Parses varnish logs and attempts to reproduce the traffic. + +For further information and example of usage, please refer to the man-pages. + + +6. Further documentation + +The project web site is a good source for information about Varnish, with updated news, mailings lists and more. The web site is located at http://www.varnish-cache.org. + +For on-line reference manual, man-pages exists for both the VCL language as well as all the Varnish command line tools. From tfheen at projects.linpro.no Thu Aug 7 08:56:02 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Thu, 7 Aug 2008 10:56:02 +0200 (CEST) Subject: r3069 - in trunk/varnish-cache: etc man Message-ID: <20080807085602.404931EC0E8@projects.linpro.no> Author: tfheen Date: 2008-08-07 10:56:01 +0200 (Thu, 07 Aug 2008) New Revision: 3069 Modified: trunk/varnish-cache/etc/Makefile.am trunk/varnish-cache/man/Makefile.am Log: Fix up Makefiles so make distcheck works again (out of tree builds and remove generated files on distclean) Modified: trunk/varnish-cache/etc/Makefile.am =================================================================== --- trunk/varnish-cache/etc/Makefile.am 2008-08-06 14:29:27 UTC (rev 3068) +++ trunk/varnish-cache/etc/Makefile.am 2008-08-07 08:56:01 UTC (rev 3069) @@ -4,7 +4,7 @@ dist_data_DATA = default.vcl -default.vcl: ../bin/varnishd/default.vcl +default.vcl: $(top_srcdir)/bin/varnishd/default.vcl echo -e "This is a basic VCL configuration file for varnish. See the vcl(7)\n\ man page for details on VCL syntax and semantics.\n\ \n\ @@ -19,6 +19,6 @@ Below is a commented-out copy of the default VCL logic. If you\n\ redefine any of these subroutines, the built-in logic will be\n\ appended to your code.\n" > tmp.vcl - sed -n '/vcl_recv/,$$p' ../bin/varnishd/default.vcl >> tmp.vcl + sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl >> tmp.vcl sed 's/^\(.*\)$$/#\1/' tmp.vcl > default.vcl rm tmp.vcl Modified: trunk/varnish-cache/man/Makefile.am =================================================================== --- trunk/varnish-cache/man/Makefile.am 2008-08-06 14:29:27 UTC (rev 3068) +++ trunk/varnish-cache/man/Makefile.am 2008-08-07 08:56:01 UTC (rev 3069) @@ -1,8 +1,11 @@ # $Id$ +EXTRA_DIST = vcl.7so +DISTCLEANFILES = vcl.7 default.vcl + dist_man_MANS = vcl.7 vcl.7: vcl.7so default.vcl soelim $< > $@ -default.vcl: ../bin/varnishd/default.vcl +default.vcl: $(top_srcdir)/bin/varnishd/default.vcl sed -n '/vcl_recv/,$$w $@' $< From phk at projects.linpro.no Thu Aug 7 09:42:24 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 7 Aug 2008 11:42:24 +0200 (CEST) Subject: r3070 - trunk/varnish-cache/man Message-ID: <20080807094224.C002C1EC204@projects.linpro.no> Author: phk Date: 2008-08-07 11:42:24 +0200 (Thu, 07 Aug 2008) New Revision: 3070 Modified: trunk/varnish-cache/man/Makefile.am Log: Try to fix Automake spec to also work on FreeBSD. XXX: Isn't something about removing the temporary files missing ? Modified: trunk/varnish-cache/man/Makefile.am =================================================================== --- trunk/varnish-cache/man/Makefile.am 2008-08-07 08:56:01 UTC (rev 3069) +++ trunk/varnish-cache/man/Makefile.am 2008-08-07 09:42:24 UTC (rev 3070) @@ -5,7 +5,7 @@ dist_man_MANS = vcl.7 -vcl.7: vcl.7so default.vcl - soelim $< > $@ -default.vcl: $(top_srcdir)/bin/varnishd/default.vcl - sed -n '/vcl_recv/,$$w $@' $< +vcl.7: vcl.7so default.vcl Makefile + soelim vcl.7so > $@ +default.vcl: $(top_srcdir)/bin/varnishd/default.vcl Makefile + sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl > $@ From phk at projects.linpro.no Thu Aug 7 09:56:42 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 7 Aug 2008 11:56:42 +0200 (CEST) Subject: r3071 - trunk/varnish-cache/bin/varnishstat Message-ID: <20080807095642.D4E911EC0F0@projects.linpro.no> Author: phk Date: 2008-08-07 11:56:42 +0200 (Thu, 07 Aug 2008) New Revision: 3071 Modified: trunk/varnish-cache/bin/varnishstat/varnishstat.c Log: Fix a printf type complaint. Also fix style. Modified: trunk/varnish-cache/bin/varnishstat/varnishstat.c =================================================================== --- trunk/varnish-cache/bin/varnishstat/varnishstat.c 2008-08-07 09:42:24 UTC (rev 3070) +++ trunk/varnish-cache/bin/varnishstat/varnishstat.c 2008-08-07 09:56:42 UTC (rev 3071) @@ -212,10 +212,11 @@ up = tv.tv_sec - VSL_stats->start_time; do { - if (fields != NULL && ! show_field("uptime", fields )) - break; - printf("%-16s %12ju %12s %s\n", "uptime", - tv.tv_sec - VSL_stats->start_time, ". ", "Child uptime"); + if (fields != NULL && ! show_field("uptime", fields )) + break; + printf("%-16s %12ju %12s %s\n", "uptime", + (uintmax_t)(tv.tv_sec - VSL_stats->start_time), + ". ", "Child uptime"); } while (0); #define MAC_STAT(n, t, f, d) \ From phk at projects.linpro.no Mon Aug 11 07:47:25 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 11 Aug 2008 09:47:25 +0200 (CEST) Subject: r3072 - in trunk/varnish-cache: bin/varnishadm bin/varnishd bin/varnishhist bin/varnishlog bin/varnishncsa bin/varnishreplay bin/varnishstat bin/varnishtop lib/libvarnish lib/libvarnishapi lib/libvcl Message-ID: <20080811074725.25CFE1EC204@projects.linpro.no> Author: phk Date: 2008-08-11 09:47:24 +0200 (Mon, 11 Aug 2008) New Revision: 3072 Modified: trunk/varnish-cache/bin/varnishadm/varnishadm.c trunk/varnish-cache/bin/varnishd/cache_acceptor.c trunk/varnish-cache/bin/varnishd/cache_center.c trunk/varnish-cache/bin/varnishd/cache_http.c trunk/varnish-cache/bin/varnishd/cache_panic.c trunk/varnish-cache/bin/varnishd/mgt_child.c trunk/varnish-cache/bin/varnishd/mgt_cli.c trunk/varnish-cache/bin/varnishd/mgt_param.c trunk/varnish-cache/bin/varnishd/mgt_vcc.c trunk/varnish-cache/bin/varnishd/storage_file.c trunk/varnish-cache/bin/varnishd/tcp.c trunk/varnish-cache/bin/varnishhist/varnishhist.c trunk/varnish-cache/bin/varnishlog/varnishlog.c trunk/varnish-cache/bin/varnishncsa/varnishncsa.c trunk/varnish-cache/bin/varnishreplay/varnishreplay.c trunk/varnish-cache/bin/varnishstat/varnishstat.c trunk/varnish-cache/bin/varnishtop/varnishtop.c trunk/varnish-cache/lib/libvarnish/argv.c trunk/varnish-cache/lib/libvarnish/assert.c trunk/varnish-cache/lib/libvarnish/binary_heap.c trunk/varnish-cache/lib/libvarnish/cli_common.c trunk/varnish-cache/lib/libvarnish/flopen.c trunk/varnish-cache/lib/libvarnish/time.c trunk/varnish-cache/lib/libvarnish/version.c trunk/varnish-cache/lib/libvarnish/vpf.c trunk/varnish-cache/lib/libvarnish/vss.c trunk/varnish-cache/lib/libvarnish/vtmpfile.c trunk/varnish-cache/lib/libvarnishapi/base64.c trunk/varnish-cache/lib/libvarnishapi/instance.c trunk/varnish-cache/lib/libvarnishapi/shmlog.c trunk/varnish-cache/lib/libvcl/vcc_acl.c trunk/varnish-cache/lib/libvcl/vcc_action.c trunk/varnish-cache/lib/libvcl/vcc_backend.c trunk/varnish-cache/lib/libvcl/vcc_compile.c trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c trunk/varnish-cache/lib/libvcl/vcc_obj.c trunk/varnish-cache/lib/libvcl/vcc_parse.c trunk/varnish-cache/lib/libvcl/vcc_string.c trunk/varnish-cache/lib/libvcl/vcc_token.c trunk/varnish-cache/lib/libvcl/vcc_var.c trunk/varnish-cache/lib/libvcl/vcc_xref.c Log: Pull in all the #include from the Solaris patch Submitted by: Theo Schlossnagle Modified: trunk/varnish-cache/bin/varnishadm/varnishadm.c =================================================================== --- trunk/varnish-cache/bin/varnishadm/varnishadm.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishadm/varnishadm.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -36,6 +36,7 @@ #include #include +#include "config.h" #include "libvarnish.h" #include "vss.h" Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_acceptor.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/cache_acceptor.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -46,6 +46,7 @@ #include #include +#include "config.h" #include "cli.h" #include "cli_priv.h" #include "shmlog.h" Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -67,6 +67,7 @@ #include #include +#include "config.h" #ifndef HAVE_SRANDOMDEV #include "compat/srandomdev.h" #endif Modified: trunk/varnish-cache/bin/varnishd/cache_http.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_http.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/cache_http.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -41,6 +41,7 @@ #include #include +#include "config.h" #include "shmlog.h" #include "vct.h" #include "cache.h" Modified: trunk/varnish-cache/bin/varnishd/cache_panic.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_panic.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/cache_panic.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -37,6 +37,7 @@ #include #include +#include "config.h" #include "cache.h" #include "cache_backend.h" #include "vcl.h" Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -45,6 +45,7 @@ #include #include +#include "config.h" #ifndef HAVE_SETPROCTITLE #include "compat/setproctitle.h" #endif Modified: trunk/varnish-cache/bin/varnishd/mgt_cli.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_cli.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/mgt_cli.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -45,6 +45,7 @@ #include #include +#include "config.h" #ifndef HAVE_VASPRINTF #include "compat/vasprintf.h" #endif Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_param.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/mgt_param.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -43,6 +43,7 @@ #include #include +#include "config.h" #include "cli.h" #include "cli_priv.h" #include "cli_common.h" Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -43,6 +43,7 @@ #include #include +#include "config.h" #ifndef HAVE_ASPRINTF #include "compat/asprintf.h" #endif Modified: trunk/varnish-cache/bin/varnishd/storage_file.c =================================================================== --- trunk/varnish-cache/bin/varnishd/storage_file.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/storage_file.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -38,6 +38,7 @@ #include #include +#include "config.h" #ifdef HAVE_SYS_MOUNT_H #include #endif Modified: trunk/varnish-cache/bin/varnishd/tcp.c =================================================================== --- trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -45,6 +45,7 @@ #include #include +#include "config.h" #ifndef HAVE_STRLCPY #include "compat/strlcpy.h" #endif Modified: trunk/varnish-cache/bin/varnishhist/varnishhist.c =================================================================== --- trunk/varnish-cache/bin/varnishhist/varnishhist.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishhist/varnishhist.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -46,6 +46,7 @@ #include #include +#include "config.h" #include "libvarnish.h" #include "shmlog.h" #include "varnishapi.h" Modified: trunk/varnish-cache/bin/varnishlog/varnishlog.c =================================================================== --- trunk/varnish-cache/bin/varnishlog/varnishlog.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishlog/varnishlog.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -43,6 +43,7 @@ #include #include +#include "config.h" #ifndef HAVE_DAEMON #include "compat/daemon.h" #endif Modified: trunk/varnish-cache/bin/varnishncsa/varnishncsa.c =================================================================== --- trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -71,6 +71,7 @@ #include #include +#include "config.h" #ifndef HAVE_DAEMON #include "compat/daemon.h" #endif Modified: trunk/varnish-cache/bin/varnishreplay/varnishreplay.c =================================================================== --- trunk/varnish-cache/bin/varnishreplay/varnishreplay.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishreplay/varnishreplay.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -43,6 +43,7 @@ #include #include +#include "config.h" #include "vqueue.h" #include "libvarnish.h" Modified: trunk/varnish-cache/bin/varnishstat/varnishstat.c =================================================================== --- trunk/varnish-cache/bin/varnishstat/varnishstat.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishstat/varnishstat.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -46,6 +46,7 @@ #include #include +#include "config.h" #include "libvarnish.h" #include "shmlog.h" #include "varnishapi.h" Modified: trunk/varnish-cache/bin/varnishtop/varnishtop.c =================================================================== --- trunk/varnish-cache/bin/varnishtop/varnishtop.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/bin/varnishtop/varnishtop.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -45,6 +45,7 @@ #include #include +#include "config.h" #include "vqueue.h" #include "vsb.h" Modified: trunk/varnish-cache/lib/libvarnish/argv.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/argv.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/argv.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -45,6 +45,7 @@ #include #include +#include "config.h" #include "libvarnish.h" static int Modified: trunk/varnish-cache/lib/libvarnish/assert.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/assert.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/assert.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -37,6 +37,7 @@ #include #include +#include "config.h" #include "libvarnish.h" static void Modified: trunk/varnish-cache/lib/libvarnish/binary_heap.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/binary_heap.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/binary_heap.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -41,6 +41,7 @@ #include #include +#include "config.h" #include "binary_heap.h" #include "libvarnish.h" Modified: trunk/varnish-cache/lib/libvarnish/cli_common.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/cli_common.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/cli_common.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -46,6 +46,7 @@ #include #include +#include "config.h" #include "vsb.h" #include "libvarnish.h" Modified: trunk/varnish-cache/lib/libvarnish/flopen.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/flopen.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/flopen.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -39,6 +39,7 @@ #include #include +#include "config.h" #include "flopen.h" int Modified: trunk/varnish-cache/lib/libvarnish/time.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/time.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/time.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -54,6 +54,7 @@ #include #include +#include "config.h" #include "libvarnish.h" double Modified: trunk/varnish-cache/lib/libvarnish/version.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/version.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/version.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -35,6 +35,7 @@ #include +#include "config.h" #include "libvarnish.h" void Modified: trunk/varnish-cache/lib/libvarnish/vpf.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/vpf.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/vpf.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -41,6 +41,7 @@ #include #include +#include "config.h" #ifndef HAVE_STRLCPY #include "compat/strlcpy.h" #endif Modified: trunk/varnish-cache/lib/libvarnish/vss.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/vss.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/vss.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -44,6 +44,7 @@ #include #include +#include "config.h" #ifndef HAVE_STRLCPY #include "compat/strlcpy.h" #endif Modified: trunk/varnish-cache/lib/libvarnish/vtmpfile.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/vtmpfile.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnish/vtmpfile.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -36,6 +36,7 @@ #include #include +#include "config.h" #include "libvarnish.h" int Modified: trunk/varnish-cache/lib/libvarnishapi/base64.c =================================================================== --- trunk/varnish-cache/lib/libvarnishapi/base64.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnishapi/base64.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -10,6 +10,7 @@ #include #include +#include "config.h" #include "varnishapi.h" static const char *b64 = Modified: trunk/varnish-cache/lib/libvarnishapi/instance.c =================================================================== --- trunk/varnish-cache/lib/libvarnishapi/instance.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnishapi/instance.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -34,6 +34,7 @@ #include #include +#include "config.h" #include "varnishapi.h" int Modified: trunk/varnish-cache/lib/libvarnishapi/shmlog.c =================================================================== --- trunk/varnish-cache/lib/libvarnishapi/shmlog.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvarnishapi/shmlog.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -45,6 +45,7 @@ #include #include +#include "config.h" #include "shmlog.h" #include "miniobj.h" #include "varnishapi.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_acl.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_acl.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_acl.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -41,6 +41,7 @@ #include #include +#include "config.h" #include "vsb.h" #include "vrt.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_action.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_action.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_action.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -33,6 +33,7 @@ #include +#include "config.h" #include "vsb.h" #include "vcc_priv.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -60,6 +60,7 @@ #include #include +#include "config.h" #include "vsb.h" #include "vcc_priv.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_compile.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_compile.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_compile.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -73,6 +73,7 @@ #include #include +#include "config.h" #include "vqueue.h" #include "vsb.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -9,6 +9,7 @@ #include "config.h" #include #include +#include "config.h" #include "vcc_priv.h" #include "vsb.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_obj.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_obj.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_obj.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -8,6 +8,7 @@ #include "config.h" #include +#include "config.h" #include "vcc_compile.h" struct var vcc_vars[] = { Modified: trunk/varnish-cache/lib/libvcl/vcc_parse.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_parse.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_parse.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -34,6 +34,7 @@ #include #include +#include "config.h" #include "vsb.h" #include "vcc_priv.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_string.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_string.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_string.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -34,6 +34,7 @@ #include #include +#include "config.h" #include "vsb.h" #include "vcc_priv.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_token.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_token.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_token.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -36,6 +36,7 @@ #include #include +#include "config.h" #include "vqueue.h" #include "vsb.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_var.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_var.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_var.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -34,6 +34,7 @@ #include #include +#include "config.h" #include "vsb.h" #include "vcc_priv.h" Modified: trunk/varnish-cache/lib/libvcl/vcc_xref.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_xref.c 2008-08-07 09:56:42 UTC (rev 3071) +++ trunk/varnish-cache/lib/libvcl/vcc_xref.c 2008-08-11 07:47:24 UTC (rev 3072) @@ -43,6 +43,7 @@ #include +#include "config.h" #include "vsb.h" #include "libvarnish.h" From phk at projects.linpro.no Mon Aug 11 08:02:24 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 11 Aug 2008 10:02:24 +0200 (CEST) Subject: r3073 - in trunk/varnish-cache: . bin/varnishd Message-ID: <20080811080224.D2E701ECE33@projects.linpro.no> Author: phk Date: 2008-08-11 10:02:24 +0200 (Mon, 11 Aug 2008) New Revision: 3073 Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c trunk/varnish-cache/configure.ac Log: Move the C-compiler invocation determination to autoconf. (Fixed the apple & gnu compiler strings relative to submitted patch) Submitted by: Theo Schlossnagle Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_param.c 2008-08-11 07:47:24 UTC (rev 3072) +++ trunk/varnish-cache/bin/varnishd/mgt_param.c 2008-08-11 08:02:24 UTC (rev 3073) @@ -705,13 +705,7 @@ "the string will be replaced with the source file name, " "and %o will be replaced with the output file name.", MUST_RELOAD, -#ifdef __APPLE__ - "exec cc -dynamiclib -Wl,-undefined,dynamic_lookup -o %o %s" -#elif defined(__SOLARIS__) - "exec cc -shared -fpic -c %o %s" -#else /* default: GCC on Linux & FreeBSD */ - "exec cc -fpic -shared -Wl,-x -o %o %s" -#endif + VCC_CC , NULL }, { "max_restarts", tweak_uint, &master.max_restarts, 0, UINT_MAX, "Upper limit on how many times a request can restart." Modified: trunk/varnish-cache/configure.ac =================================================================== --- trunk/varnish-cache/configure.ac 2008-08-11 07:47:24 UTC (rev 3072) +++ trunk/varnish-cache/configure.ac 2008-08-11 08:02:24 UTC (rev 3073) @@ -305,6 +305,23 @@ AS_HELP_STRING([--enable-werror],[use -Werror (default is NO)]), CFLAGS="${CFLAGS} -Werror") +# Command line for compiling VCL code. I wish there were a simple way +# to figure this out dynamically without introducing a run-time +# dependency on libtool. +case $host in +*-*-solaris*) + VCC_CC="cc -Kpic ${CFLAGS} -G -o %o %s" + ;; +*-*-darwin*) + VCC_CC="exec cc -dynamiclib -Wl,-undefined,dynamic_lookup -o %o %s" + ;; +*) + VCC_CC="exec cc -fpic -shared -Wl,-x -o %o %s" + ;; +esac + +AC_DEFINE_UNQUOTED([VCC_CC],"$VCC_CC",[C compiler command line for VCL code]) + # Generate output AC_CONFIG_FILES([ Makefile From petter at projects.linpro.no Mon Aug 11 08:08:50 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Mon, 11 Aug 2008 10:08:50 +0200 (CEST) Subject: r3074 - in trunk/varnish-cache/bin: varnishncsa varnishtest Message-ID: <20080811080850.B476D1EC204@projects.linpro.no> Author: petter Date: 2008-08-11 10:08:50 +0200 (Mon, 11 Aug 2008) New Revision: 3074 Modified: trunk/varnish-cache/bin/varnishncsa/varnishncsa.c trunk/varnish-cache/bin/varnishtest/vtc.c Log: Cleaned up some usage statements Modified: trunk/varnish-cache/bin/varnishncsa/varnishncsa.c =================================================================== --- trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 08:02:24 UTC (rev 3073) +++ trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 08:08:50 UTC (rev 3074) @@ -503,7 +503,7 @@ usage(void) { - fprintf(stderr, "usage: varnishncsa %s [-aDV] [-n varnish_name] [-P file] [-w file]\n", VSL_ARGS); + fprintf(stderr, "usage: varnishncsa %s [-aDV] [-n varnish_name] [-P file] [-w file]\n", VSL_USAGE); exit(1); } Modified: trunk/varnish-cache/bin/varnishtest/vtc.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc.c 2008-08-11 08:02:24 UTC (rev 3073) +++ trunk/varnish-cache/bin/varnishtest/vtc.c 2008-08-11 08:08:50 UTC (rev 3074) @@ -301,6 +301,17 @@ } /********************************************************************** + * Print usage + */ + +static void +usage(void) +{ + fprintf(stderr, "usage: varnishtest [-qv] file ...\n"); + exit(1); +} + +/********************************************************************** * Main */ @@ -322,13 +333,16 @@ case 'v': vtc_verbosity++; break; - case '?': default: - errx(1, "Usage"); + usage(); } } argc -= optind; argv += optind; + + if(argc == 0) + usage(); + init_sema(); for (ch = 0; ch < argc; ch++) exec_file(argv[ch]); From phk at projects.linpro.no Mon Aug 11 08:21:42 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 11 Aug 2008 10:21:42 +0200 (CEST) Subject: r3075 - trunk/varnish-cache/lib/libvarnish Message-ID: <20080811082142.2AF6C1EC11B@projects.linpro.no> Author: phk Date: 2008-08-11 10:21:41 +0200 (Mon, 11 Aug 2008) New Revision: 3075 Modified: trunk/varnish-cache/lib/libvarnish/num.c Log: Remove an spurious include. Fix and extend regression tests while here. Inspired by: solaris patch from Theo Schlossnagle Modified: trunk/varnish-cache/lib/libvarnish/num.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/num.c 2008-08-11 08:08:50 UTC (rev 3074) +++ trunk/varnish-cache/lib/libvarnish/num.c 2008-08-11 08:21:41 UTC (rev 3075) @@ -39,6 +39,11 @@ #include +const char err_miss_num[] = "Missing number"; +const char err_invalid_num[] = "Invalid number"; +const char err_abs_req[] = "Absolute number required"; +const char err_invalid_suff[] = "Invalid suffix"; + const char * str2bytes(const char *p, uintmax_t *r, uintmax_t rel) { @@ -46,11 +51,11 @@ char *end; if (p == NULL || *p == '\0') - return ("missing number"); + return (err_miss_num); fval = strtod(p, &end); if (end == p || !isfinite(fval)) - return ("Invalid number"); + return (err_invalid_num); if (*end == '\0') { *r = (uintmax_t)fval; @@ -59,7 +64,7 @@ if (end[0] == '%' && end[1] == '\0') { if (rel == 0) - return ("Absolute number required"); + return (err_abs_req); fval *= rel / 100.0; } else { /* accept a space before the multiplier */ @@ -91,15 +96,16 @@ fval *= (uintmax_t)1 << 60; ++end; break; - case 'b': case 'B': - ++end; - break; default: break; } + /* [bB] is a generic suffix of no effect */ + if (end[0] == 'b' || end[0] == 'B') + end++; + if (end[0] != '\0') - return ("Invalid suffix"); + return (err_invalid_suff); } *r = (uintmax_t)round(fval); @@ -107,8 +113,9 @@ } #ifdef NUM_C_TEST +/* Compile with: "cc -o foo -DNUM_C_TEST -I../.. -I../../include num.c -lm" */ #include -#include +#include #include #include @@ -116,6 +123,7 @@ const char *str; uintmax_t rel; uintmax_t val; + const char *err; } test_cases[] = { { "1", (uintmax_t)0, (uintmax_t)1 }, { "1B", (uintmax_t)0, (uintmax_t)1<<0 }, @@ -150,6 +158,13 @@ { "1%", (uintmax_t)1024, (uintmax_t)10 }, { "2%", (uintmax_t)1024, (uintmax_t)20 }, { "3%", (uintmax_t)1024, (uintmax_t)31 }, + + /* Check the error checks */ + { "", 0, 0, err_miss_num }, + { "m", 0, 0, err_invalid_num }, + { "4%", 0, 0, err_abs_req }, + { "3*", 0, 0, err_invalid_suff }, + /* TODO: add more */ { 0, 0, 0 }, @@ -161,14 +176,19 @@ struct test_case *tc; uintmax_t val; int ec; + const char *e; (void)argc; for (ec = 0, tc = test_cases; tc->str; ++tc) { - str2bytes(tc->str, &val, tc->rel); - if (val != tc->val) { - printf("%s: str2bytes(\"%s\", %ju) %ju != %ju\n", - *argv, tc->str, tc->rel, val, tc->val); + e = str2bytes(tc->str, &val, tc->rel); + if (e != tc->err) { + printf("%s: str2bytes(\"%s\", %ju) (%s) != (%s)\n", + *argv, tc->str, tc->rel, tc->err, e); ++ec; + } else if (e == NULL && val != tc->val) { + printf("%s: str2bytes(\"%s\", %ju) %ju != %ju (%s)\n", + *argv, tc->str, tc->rel, val, tc->val, e); + ++ec; } } /* TODO: test invalid strings */ From phk at projects.linpro.no Mon Aug 11 08:31:08 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 11 Aug 2008 10:31:08 +0200 (CEST) Subject: r3076 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080811083108.A0C651ECE33@projects.linpro.no> Author: phk Date: 2008-08-11 10:31:08 +0200 (Mon, 11 Aug 2008) New Revision: 3076 Modified: trunk/varnish-cache/bin/varnishtest/vtc.c trunk/varnish-cache/bin/varnishtest/vtc_log.c Log: Eliminate usage. Inspired by: Solaris patch from Theo Schlossnagle Modified: trunk/varnish-cache/bin/varnishtest/vtc.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc.c 2008-08-11 08:21:41 UTC (rev 3075) +++ trunk/varnish-cache/bin/varnishtest/vtc.c 2008-08-11 08:31:08 UTC (rev 3076) @@ -32,7 +32,6 @@ #include #include #include -#include #include "libvarnish.h" #include "vsb.h" @@ -57,13 +56,17 @@ int fd; fd = open(fn, O_RDONLY); - if (fd < 0) - err(1, "Cannot open %s", fn); + if (fd < 0) { + fprintf(stderr, "Cannot open %s: %s", fn, strerror(errno)); + exit (1); + } buf = malloc(sz); assert(buf != NULL); s = read(fd, buf, sz - 1); - if (s <= 0) - err(1, "Cannot read %s", fn); + if (s <= 0) { + fprintf(stderr, "Cannot read %s: %s", fn, strerror(errno)); + exit (1); + } AZ(close (fd)); assert(s < sz); /* XXX: increase MAX_FILESIZE */ buf[s] = '\0'; @@ -175,7 +178,8 @@ for (tn = 0; token_s[tn] != NULL; tn++) fprintf(stderr, "%s ", token_s[tn]); fprintf(stderr, "\n"); - errx(1, "Unknown command: \"%s\"", token_s[0]); + fprintf(stderr, "Unknown command: \"%s\"", token_s[0]); + exit (1); } assert(cp->cmd != NULL); Modified: trunk/varnish-cache/bin/varnishtest/vtc_log.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_log.c 2008-08-11 08:21:41 UTC (rev 3075) +++ trunk/varnish-cache/bin/varnishtest/vtc_log.c 2008-08-11 08:31:08 UTC (rev 3076) @@ -32,7 +32,6 @@ #include #include #include -#include #include #include From phk at projects.linpro.no Mon Aug 11 09:15:27 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 11 Aug 2008 11:15:27 +0200 (CEST) Subject: r3077 - in trunk/varnish-cache: . bin/varnishd lib/libvarnish Message-ID: <20080811091527.6030C1EC204@projects.linpro.no> Author: phk Date: 2008-08-11 11:15:27 +0200 (Mon, 11 Aug 2008) New Revision: 3077 Modified: trunk/varnish-cache/bin/varnishd/varnishd.c trunk/varnish-cache/configure.ac trunk/varnish-cache/lib/libvarnish/time.c Log: Be much more explicit about the string->time conversion disaster visited upon us by the brilliant minds behind POSIX. Parts from: Solaris patch from Theo Schlossnagle Modified: trunk/varnish-cache/bin/varnishd/varnishd.c =================================================================== --- trunk/varnish-cache/bin/varnishd/varnishd.c 2008-08-11 08:31:08 UTC (rev 3076) +++ trunk/varnish-cache/bin/varnishd/varnishd.c 2008-08-11 09:15:27 UTC (rev 3077) @@ -429,7 +429,13 @@ setbuf(stdout, NULL); setbuf(stderr, NULL); - AZ(setenv("TZ", "GMT", 1)); + /* + * Run in UTC timezone, on the off-chance that this operating + * system does not have a timegm() function, and translates + * timestamps on the local timescale. + * See lib/libvarnish/time.c + */ + AZ(setenv("TZ", "UTC", 1)); tzset(); memset(cli, 0, sizeof cli); Modified: trunk/varnish-cache/configure.ac =================================================================== --- trunk/varnish-cache/configure.ac 2008-08-11 08:31:08 UTC (rev 3076) +++ trunk/varnish-cache/configure.ac 2008-08-11 09:15:27 UTC (rev 3077) @@ -101,6 +101,7 @@ AC_CHECK_FUNCS([fmtcheck]) AC_CHECK_FUNCS([getdtablesize]) AC_CHECK_FUNCS([abort2]) +AC_CHECK_FUNCS([timegm]) save_LIBS="${LIBS}" LIBS="${PTHREAD_LIBS}" Modified: trunk/varnish-cache/lib/libvarnish/time.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/time.c 2008-08-11 08:31:08 UTC (rev 3076) +++ trunk/varnish-cache/lib/libvarnish/time.c 2008-08-11 09:15:27 UTC (rev 3077) @@ -112,18 +112,70 @@ time_t TIM_parse(const char *p) { + time_t t; struct tm tm; const char **r; for (r = fmts; *r != NULL; r++) { memset(&tm, 0, sizeof tm); - if (strptime(p, *r, &tm) != NULL) - return (mktime(&tm)); + if (strptime(p, *r, &tm) != NULL) { + /* + * Make sure this is initialized on the off-chance + * that some raving loonie would apply DST to UTC. + */ + tm.tm_isdst = -1; +#if defined(HAVE_TIMEGM) + t = timegm(&tm); +#else + /* + * Ahh, another POSIX_STUPIDITY, how unexpected. + * Instead of, as would have been logical, to have + * tm_timezone element, mktime() is standardized as + * always working in localtime. This brilliant idea + * came from the same people who said "leap-seconds ? + * Naah, screw it!". + * + * On broken systems without a working timegm(), + * it is the responsibility of the calling program + * to set the timezone to UTC. We check that. + */ + t = mktime(&tm); + assert(!strcmp(tzname[0], "UTC")); +#endif + return (t); + } } return (0); } #ifdef TEST_DRIVER + +#include + +/* + * Compile with: + * cc -o foo -DTEST_DRIVER -I../.. -I../../include time.c assert.c + * Test with: + * env TZ=UTC ./foo + * env TZ=CET ./foo + */ + +static void +tst(const char *s, time_t good) +{ + time_t t; + char buf[BUFSIZ]; + + t = TIM_parse(s); + TIM_format(t, buf); + printf("%-30s -> %12jd -> %s\n", s, (intmax_t)t, buf); + if (t != good) { + printf("Parse error! Got: %jd should have %jd diff %jd\n", + (intmax_t)t, (intmax_t)good, (intmax_t)(t - good)); + exit (2); + } +} + int main(int argc, char **argv) { @@ -136,9 +188,9 @@ printf("scan = %d <%s>\n", TIM_parse(buf), buf); /* Examples from RFC2616 section 3.3.1 */ - printf("scan = %d\n", TIM_parse("Sun, 06 Nov 1994 08:49:37 GMT")); - printf("scan = %d\n", TIM_parse("Sunday, 06-Nov-94 08:49:37 GMT")); - printf("scan = %d\n", TIM_parse("Sun Nov 6 08:49:37 1994")); + tst("Sun, 06 Nov 1994 08:49:37 GMT", 784111777); + tst("Sunday, 06-Nov-94 08:49:37 GMT", 784111777); + tst("Sun Nov 6 08:49:37 1994", 784111777); return (0); } From tfheen at projects.linpro.no Mon Aug 11 09:41:52 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Mon, 11 Aug 2008 11:41:52 +0200 (CEST) Subject: r3078 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080811094152.2CE061ED180@projects.linpro.no> Author: tfheen Date: 2008-08-11 11:41:51 +0200 (Mon, 11 Aug 2008) New Revision: 3078 Modified: trunk/varnish-cache/bin/varnishtest/vtc.c Log: Fix up style Modified: trunk/varnish-cache/bin/varnishtest/vtc.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc.c 2008-08-11 09:15:27 UTC (rev 3077) +++ trunk/varnish-cache/bin/varnishtest/vtc.c 2008-08-11 09:41:51 UTC (rev 3078) @@ -344,7 +344,7 @@ argc -= optind; argv += optind; - if(argc == 0) + if (argc == 0) usage(); init_sema(); From tfheen at projects.linpro.no Mon Aug 11 09:49:41 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Mon, 11 Aug 2008 11:49:41 +0200 (CEST) Subject: r3079 - in trunk/varnish-cache: bin/varnishd lib/libvarnish Message-ID: <20080811094941.45AE61EC204@projects.linpro.no> Author: tfheen Date: 2008-08-11 11:49:41 +0200 (Mon, 11 Aug 2008) New Revision: 3079 Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/cache_pool.c trunk/varnish-cache/bin/varnishd/mgt_child.c trunk/varnish-cache/lib/libvarnish/binary_heap.c trunk/varnish-cache/lib/libvarnish/vev.c Log: More whitespace changes Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-11 09:41:51 UTC (rev 3078) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-11 09:49:41 UTC (rev 3079) @@ -377,7 +377,7 @@ b = sp->backend; } AN(b->method); - if(b->method->updatehealth != NULL) + if (b->method->updatehealth != NULL) b->method->updatehealth(sp, vc, a); CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC); #endif Modified: trunk/varnish-cache/bin/varnishd/cache_pool.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_pool.c 2008-08-11 09:41:51 UTC (rev 3078) +++ trunk/varnish-cache/bin/varnishd/cache_pool.c 2008-08-11 09:49:41 UTC (rev 3079) @@ -352,7 +352,7 @@ */ sp->t_end = TIM_real(); vca_close_session(sp, "dropped"); - if(sp->vcl != NULL) { + if (sp->vcl != NULL) { /* * A session parked on a busy object can come here * after it wakes up. Loose the VCL reference. Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-11 09:41:51 UTC (rev 3078) +++ trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-11 09:49:41 UTC (rev 3079) @@ -114,7 +114,7 @@ { assert(fd >= 0); - if(fd_map == NULL) + if (fd_map == NULL) fd_map = vbit_init(128); AN(fd_map); if (what != NULL) Modified: trunk/varnish-cache/lib/libvarnish/binary_heap.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/binary_heap.c 2008-08-11 09:41:51 UTC (rev 3078) +++ trunk/varnish-cache/lib/libvarnish/binary_heap.c 2008-08-11 09:49:41 UTC (rev 3079) @@ -194,7 +194,7 @@ assert(bh != NULL); assert(bh->magic == BINHEAP_MAGIC); - if(bh->next == ROOT_IDX) + if (bh->next == ROOT_IDX) return (NULL); return (bh->array[ROOT_IDX]); } Modified: trunk/varnish-cache/lib/libvarnish/vev.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/vev.c 2008-08-11 09:41:51 UTC (rev 3078) +++ trunk/varnish-cache/lib/libvarnish/vev.c 2008-08-11 09:49:41 UTC (rev 3079) @@ -476,7 +476,7 @@ return (vev_sched_signal(evb)); assert(evb->lpfd < evb->npfd); i = poll(evb->pfd, evb->lpfd, tmo); - if(i == -1 && errno == EINTR) + if (i == -1 && errno == EINTR) return (vev_sched_signal(evb)); if (i == 0) { assert(e != NULL); From petter at projects.linpro.no Mon Aug 11 10:04:00 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Mon, 11 Aug 2008 12:04:00 +0200 (CEST) Subject: r3080 - trunk/varnish-cache/bin/varnishncsa Message-ID: <20080811100400.C23501EC11B@projects.linpro.no> Author: petter Date: 2008-08-11 12:04:00 +0200 (Mon, 11 Aug 2008) New Revision: 3080 Modified: trunk/varnish-cache/bin/varnishncsa/varnishncsa.c Log: It now always flushes the stream, even for stdout. See ticket #182. Modified: trunk/varnish-cache/bin/varnishncsa/varnishncsa.c =================================================================== --- trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 09:49:41 UTC (rev 3079) +++ trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 10:04:00 UTC (rev 3080) @@ -452,9 +452,8 @@ fprintf(fo, "\"%s\"\n", lp->df_User_agent ? lp->df_User_agent : "-"); - /* hack: flush after every line if writing to file */ - if (fo != stdout) - fflush(fo); + /* flush the stream */ + fflush(fo); } /* clean up */ From phk at phk.freebsd.dk Mon Aug 11 10:09:49 2008 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 11 Aug 2008 10:09:49 +0000 Subject: r3080 - trunk/varnish-cache/bin/varnishncsa In-Reply-To: Your message of "Mon, 11 Aug 2008 12:04:00 +0200." <20080811100400.C23501EC11B@projects.linpro.no> Message-ID: <8522.1218449389@critter.freebsd.dk> In message <20080811100400.C23501EC11B at projects.linpro.no>, petter at projects.lin pro.no writes: >Author: petter >Date: 2008-08-11 12:04:00 +0200 (Mon, 11 Aug 2008) >New Revision: 3080 > >Modified: > trunk/varnish-cache/bin/varnishncsa/varnishncsa.c >Log: >It now always flushes the stream, even for stdout. See ticket #182. No, no, no and no. This is an intolerable performance overhead. Add an option to control if flushing should be done on all records or not, but do not ny default waste performance needlessly. >Modified: trunk/varnish-cache/bin/varnishncsa/varnishncsa.c >=================================================================== >--- trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 09:49:41 UTC (rev 3079) >+++ trunk/varnish-cache/bin/varnishncsa/varnishncsa.c 2008-08-11 10:04:00 UTC (rev 3080) >@@ -452,9 +452,8 @@ > fprintf(fo, "\"%s\"\n", > lp->df_User_agent ? lp->df_User_agent : "-"); > >- /* hack: flush after every line if writing to file */ >- if (fo != stdout) >- fflush(fo); >+ /* flush the stream */ >+ fflush(fo); > } > > /* clean up */ > >_______________________________________________ >varnish-commit mailing list >varnish-commit at projects.linpro.no >http://projects.linpro.no/mailman/listinfo/varnish-commit > -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From phk at projects.linpro.no Mon Aug 11 15:08:39 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 11 Aug 2008 17:08:39 +0200 (CEST) Subject: r3081 - trunk/varnish-cache/bin/varnishd Message-ID: <20080811150839.63CB11EC204@projects.linpro.no> Author: phk Date: 2008-08-11 17:08:38 +0200 (Mon, 11 Aug 2008) New Revision: 3081 Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c Log: Make the compile shared object be named $mumble.so to cater for Solaris tool-chains. Simplified slightly from submitted patch. Submitted by: Theo Schlossnagle Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-11 10:04:00 UTC (rev 3080) +++ trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-11 15:08:38 UTC (rev 3081) @@ -141,7 +141,8 @@ char cmdline[1024]; struct vsb cmdsb; char sf[] = "./vcl.########.c"; - char *of; + char of[sizeof sf + 1]; + char *retval; int p[2], sfd, srclen, status; pid_t pid; void *dlh; @@ -167,10 +168,11 @@ AZ(close(sfd)); /* Name the output shared library by overwriting the final 'c' */ - of = strdup(sf); - XXXAN(of); - assert(of[sizeof sf - 2] == 'c'); - of[sizeof sf - 2] = 'o'; + memcpy(of, sf, sizeof sf); + assert(sf[sizeof sf - 2] == 'c'); + of[sizeof sf - 2] = 's'; + of[sizeof sf - 1] = 'o'; + of[sizeof sf] = '\0'; AN(vsb_new(&cmdsb, cmdline, sizeof cmdline, 0)); mgt_make_cc_cmd(&cmdsb, sf, of); vsb_finish(&cmdsb); @@ -181,7 +183,6 @@ vsb_printf(sb, "%s(): pipe() failed: %s", __func__, strerror(errno)); (void)unlink(sf); - free(of); return (NULL); } assert(p[0] > STDERR_FILENO); @@ -192,7 +193,6 @@ AZ(close(p[0])); AZ(close(p[1])); (void)unlink(sf); - free(of); return (NULL); } if (pid == 0) { @@ -217,7 +217,6 @@ vsb_printf(sb, "%s(): waitpid() failed: %s", __func__, strerror(errno)); (void)unlink(of); - free(of); return (NULL); } if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { @@ -229,7 +228,6 @@ if (WCOREDUMP(status)) vsb_printf(sb, ", core dumped"); (void)unlink(of); - free(of); return (NULL); } @@ -239,7 +237,6 @@ "%s(): failed to load compiled VCL program:\n %s", __func__, dlerror()); (void)unlink(of); - free(of); return (NULL); } @@ -249,7 +246,9 @@ */ AZ(dlclose(dlh)); - return (of); + retval = strdup(of); + XXXAN(retval); + return (retval); } /*--------------------------------------------------------------------*/ From phk at projects.linpro.no Tue Aug 12 10:29:22 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 12 Aug 2008 12:29:22 +0200 (CEST) Subject: r3082 - trunk/varnish-cache/lib/libvcl Message-ID: <20080812102922.65CD41EC11B@projects.linpro.no> Author: phk Date: 2008-08-12 12:29:22 +0200 (Tue, 12 Aug 2008) New Revision: 3082 Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c Log: nits Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-11 15:08:38 UTC (rev 3081) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-12 10:29:22 UTC (rev 3082) @@ -261,7 +261,6 @@ return (r); } - void vcc_IsField(struct tokenlist *tl, struct token **t, struct fld_spec *fs) { @@ -318,6 +317,8 @@ static void vcc_ProbeRedef(struct tokenlist *tl, struct token **t_did, struct token *t_field) { + /* .url and .request are mutually exclusive */ + if (*t_did != NULL) { vsb_printf(tl->sb, "Probe request redefinition at:\n"); From phk at projects.linpro.no Tue Aug 12 12:28:38 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 12 Aug 2008 14:28:38 +0200 (CEST) Subject: r3083 - trunk/varnish-cache/bin/varnishd Message-ID: <20080812122838.B165A1EC052@projects.linpro.no> Author: phk Date: 2008-08-12 14:28:38 +0200 (Tue, 12 Aug 2008) New Revision: 3083 Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/common.h trunk/varnish-cache/bin/varnishd/tcp.c Log: Make a central TCP_close() function that accepts the two errno's which indicate that our partner gave up on us. Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-12 10:29:22 UTC (rev 3082) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-12 12:28:38 UTC (rev 3083) @@ -242,7 +242,7 @@ LOCK(&bp->mtx); bp->refcount++; - UNLOCK(&sp->backend->mtx); + UNLOCK(&bp->mtx); s = -1; assert(bp->ipv6 != NULL || bp->ipv4 != NULL); @@ -257,7 +257,7 @@ s = VBE_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len); if (s < 0) { - LOCK(&sp->backend->mtx); + LOCK(&bp->mtx); bp->refcount--; /* Only keep ref on success */ UNLOCK(&bp->mtx); } @@ -317,16 +317,13 @@ VBE_ClosedFd(struct worker *w, struct vbe_conn *vc) { struct backend *b; - int i; CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC); CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC); b = vc->backend; assert(vc->fd >= 0); WSL(w, SLT_BackendClose, vc->fd, "%s", vc->backend->vcl_name); - i = close(vc->fd); - assert(i == 0 || errno == ECONNRESET || errno == ENOTCONN); - vc->fd = -1; + TCP_close(&vc->fd); VBE_DropRef(vc->backend); vc->backend = NULL; VBE_ReleaseConn(vc); Modified: trunk/varnish-cache/bin/varnishd/common.h =================================================================== --- trunk/varnish-cache/bin/varnishd/common.h 2008-08-12 10:29:22 UTC (rev 3082) +++ trunk/varnish-cache/bin/varnishd/common.h 2008-08-12 12:28:38 UTC (rev 3083) @@ -54,6 +54,7 @@ void TCP_nonblocking(int sock); #ifdef SOL_SOCKET int TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec); +void TCP_close(int *s); #endif #define TRUST_ME(ptr) ((void*)(uintptr_t)(ptr)) Modified: trunk/varnish-cache/bin/varnishd/tcp.c =================================================================== --- trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-12 10:29:22 UTC (rev 3082) +++ trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-12 12:28:38 UTC (rev 3083) @@ -192,3 +192,17 @@ TCP_blocking(s); return (0); } + +/*-------------------------------------------------------------------- + * When closing a TCP connection, a couple of errno's are legit, we + * can't be held responsible for the other end wanting to talk to us. + */ + +void +TCP_close(int *s) +{ + assert (close(*s) == 0 || + errno == ECONNRESET || + errno == ENOTCONN); + *s = -1; +} From phk at projects.linpro.no Tue Aug 12 12:57:00 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 12 Aug 2008 14:57:00 +0200 (CEST) Subject: r3084 - trunk/varnish-cache/bin/varnishd Message-ID: <20080812125700.757CC1EC0F0@projects.linpro.no> Author: phk Date: 2008-08-12 14:57:00 +0200 (Tue, 12 Aug 2008) New Revision: 3084 Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend_poll.c trunk/varnish-cache/bin/varnishd/cache_main.c Log: Snapshot the backend polling code without the advanced math. Presently we only record th state of the last 64 tries to poll the backend in a shift register, which can be show with the interrim CLI command "debug.health": Health stats for backend b0 Oldest __________________________________________________ Newest 4444444444444444444444444444444444444444444444444444444444444444 Good IPv4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Good Xmit SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS Good Shut RR-RR-R-RRRR---RR-RR-R-R-R-R-R-RRRR-RR-----RR--RRRR--RRR-R-----R Good Recv More to follow. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-12 12:28:38 UTC (rev 3083) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-12 12:57:00 UTC (rev 3084) @@ -427,6 +427,9 @@ void VBE_SelectBackend(struct sess *sp); struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb); +/* cache_backend_poll.c */ +void VBP_Init(void); + /* cache_ban.c */ int BAN_Add(struct cli *cli, const char *regexp, int hash); void BAN_Init(void); Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-12 12:28:38 UTC (rev 3083) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-12 12:57:00 UTC (rev 3084) @@ -40,6 +40,7 @@ #include "config.h" #include +#include #include #include #include @@ -48,37 +49,276 @@ #include #include "shmlog.h" +#include "cli_priv.h" #include "cache.h" #include "vrt.h" #include "cache_backend.h" +static MTX vbp_mtx; + struct vbp_target { unsigned magic; #define VBP_TARGET_MAGIC 0x6b7cb656 struct backend *backend; + struct vrt_backend_probe probe; struct workreq wrq; int stop; + int req_len; + + /* Collected statistics */ +#define BITMAP(n, c, t, b) uint64_t n; +#include "cache_backend_poll.h" +#undef BITMAP + + VTAILQ_ENTRY(vbp_target) list; }; +static VTAILQ_HEAD(, vbp_target) vbp_list = + VTAILQ_HEAD_INITIALIZER(vbp_list); + +static char default_request[] = + "GET / HTTP/1.1\r\n" + "Connection: close\r\n" + "\r\n"; + static void +dsleep(double t) +{ + if (t > 10.0) + (void)sleep((int)round(t)); + else + (void)usleep((int)round(t * 1e6)); +} + +/*-------------------------------------------------------------------- + * Poke one backend, once, but possibly at both IPv4 and IPv6 addresses. + * + * We do deliberately not use the stuff in cache_backend.c, because we + * want to measure the backends response without local distractions. + */ + +static int +vbp_connect(int pf, const struct sockaddr *sa, socklen_t salen, int tmo) +{ + int s, i; + + s = socket(pf, SOCK_STREAM, 0); + if (s < 0) + return (s); + + i = TCP_connect(s, sa, salen, tmo); + if (i == 0) + return (s); + TCP_close(&s); + return (-1); +} + +static int +vbp_poke(struct vbp_target *vt) +{ + int s, tmo, i; + double t_start, t_now, t_end, rlen; + struct backend *bp; + char buf[8192]; + struct pollfd pfda[1], *pfd = pfda; + + bp = vt->backend; + CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); + + t_start = t_now = TIM_real(); + t_end = t_start + vt->probe.timeout; + tmo = (int)round((t_end - t_now) * 1e3); + + s = -1; + if (params->prefer_ipv6 && bp->ipv6 != NULL) { + s = vbp_connect(PF_INET6, bp->ipv6, bp->ipv6len, tmo); + t_now = TIM_real(); + tmo = (int)round((t_end - t_now) * 1e3); + if (s >= 0) + vt->good_ipv6 |= 1; + } + if (tmo > 0 && s < 0 && bp->ipv4 != NULL) { + s = vbp_connect(PF_INET, bp->ipv4, bp->ipv4len, tmo); + t_now = TIM_real(); + tmo = (int)round((t_end - t_now) * 1e3); + if (s >= 0) + vt->good_ipv4 |= 1; + } + if (tmo > 0 && s < 0 && bp->ipv6 != NULL) { + s = vbp_connect(PF_INET6, bp->ipv6, bp->ipv6len, tmo); + t_now = TIM_real(); + tmo = (int)round((t_end - t_now) * 1e3); + if (s >= 0) + vt->good_ipv6 |= 1; + } + if (s < 0) { + /* Got no connection: failed */ + return (0); + } + + i = write(s, vt->probe.request, vt->req_len); + if (i != vt->req_len) { + if (i < 0) + vt->err_xmit |= 1; + TCP_close(&s); + return (0); + } + vt->good_xmit |= 1; + i = shutdown(s, SHUT_WR); + if (i != 0) { + vt->err_shut |= 1; + TCP_close(&s); + return (0); + } + vt->good_shut |= 1; + + t_now = TIM_real(); + tmo = (int)round((t_end - t_now) * 1e3); + if (tmo < 0) { + TCP_close(&s); + return (0); + } + + pfd->fd = s; + rlen = 0; + do { + pfd->events = POLLIN; + pfd->revents = 0; + tmo = (int)round((t_end - t_now) * 1e3); + if (tmo > 0) + i = poll(pfd, 1, tmo); + if (i == 0 || tmo <= 0) { + TCP_close(&s); + return (0); + } + i = read(s, buf, sizeof buf); + rlen += i; + } while (i > 0); + + if (i < 0) { + vt->err_recv |= 1; + TCP_close(&s); + return (0); + } + + TCP_close(&s); + t_now = TIM_real(); + vt->good_recv |= 1; + return (1); +} + +/*-------------------------------------------------------------------- + * One thread per backend to be poked. + */ + +static void vbp_wrk_poll_backend(struct worker *w, void *priv) { struct vbp_target *vt; (void)w; - CAST_OBJ_NOTNULL(vt, priv, VBP_TARGET_MAGIC); THR_SetName("backend poll"); + CAST_OBJ_NOTNULL(vt, priv, VBP_TARGET_MAGIC); + + LOCK(&vbp_mtx); + VTAILQ_INSERT_TAIL(&vbp_list, vt, list); + UNLOCK(&vbp_mtx); + + /* Establish defaults (XXX: Should they go in VCC instead ?) */ + if (vt->probe.request == NULL) + vt->probe.request = default_request; + if (vt->probe.timeout == 0.0) + vt->probe.timeout = 2.0; + if (vt->probe.interval == 0.0) + vt->probe.timeout = 5.0; + + printf("Probe(\"%s\", %g, %g)\n", + vt->probe.request, + vt->probe.timeout, + vt->probe.interval); + + vt->req_len = strlen(vt->probe.request); + + /*lint -e{525} indent */ while (!vt->stop) { - printf("Poke backend %s\n", vt->backend->vcl_name); - sleep(1); +#define BITMAP(n, c, t, b) vt->n <<= 1; +#include "cache_backend_poll.h" +#undef BITMAP + vbp_poke(vt); + dsleep(vt->probe.interval); } + LOCK(&vbp_mtx); + VTAILQ_REMOVE(&vbp_list, vt, list); + UNLOCK(&vbp_mtx); vt->backend->probe = NULL; FREE_OBJ(vt); THR_SetName("cache-worker"); } +/*-------------------------------------------------------------------- + * Cli functions + */ + +static void +vbp_bitmap(struct cli *cli, const char *s, uint64_t map, const char *lbl) +{ + int i; + uint64_t u = (1ULL << 63); + + for (i = 0; i < 64; i++) { + if (map & u) + cli_out(cli, s); + else + cli_out(cli, "-"); + map <<= 1; + } + cli_out(cli, " %s\n", lbl); +} + +/*lint -e{506} constant value boolean */ +/*lint -e{774} constant value boolean */ +static void +vbp_health_one(struct cli *cli, struct vbp_target *vt) +{ + + cli_out(cli, "Health stats for backend %s\n", + vt->backend->vcl_name); + cli_out(cli, + "Oldest ______________________" + "____________________________ Newest\n"); + +#define BITMAP(n, c, t, b) \ + if ((vt->n != 0) || (b)) \ + vbp_bitmap(cli, (c), vt->n, (t)); +#include "cache_backend_poll.h" +#undef BITMAP +} + +static void +vbp_health(struct cli *cli, const char * const *av, void *priv) +{ + struct vbp_target *vt; + + (void)av; + (void)priv; + + VTAILQ_FOREACH(vt, &vbp_list, list) + vbp_health_one(cli, vt); +} + +static struct cli_proto debug_cmds[] = { + { "debug.health", "debug.health", + "\tDump backend health stuff\n", + 0, 0, vbp_health }, + { NULL } +}; + +/*-------------------------------------------------------------------- + * Start/Stop called from cache_backend_cfg.c + */ + void VBP_Start(struct backend *b, struct vrt_backend_probe const *p) { @@ -86,13 +326,14 @@ ASSERT_CLI(); - /* Is probing even configured ? */ - if (p->request == NULL) - return; - ALLOC_OBJ(vt, VBP_TARGET_MAGIC); AN(vt); + if (!memcmp(&vt->probe, p, sizeof *p)) { + FREE_OBJ(vt); + return; + } vt->backend = b; + vt->probe = *p; b->probe = vt; vt->wrq.func = vbp_wrk_poll_backend; @@ -111,3 +352,16 @@ return; b->probe->stop = 1; } + +/*-------------------------------------------------------------------- + * Initialize the backend probe subsystem + */ + +void +VBP_Init(void) +{ + + MTX_INIT(&vbp_mtx); + + CLI_AddFuncs(DEBUG_CLI, debug_cmds); +} Modified: trunk/varnish-cache/bin/varnishd/cache_main.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_main.c 2008-08-12 12:28:38 UTC (rev 3083) +++ trunk/varnish-cache/bin/varnishd/cache_main.c 2008-08-12 12:57:00 UTC (rev 3084) @@ -112,6 +112,7 @@ SES_Init(); VBE_Init(); + VBP_Init(); VSL_Init(); WRK_Init(); From petter at projects.linpro.no Tue Aug 12 13:01:41 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Tue, 12 Aug 2008 15:01:41 +0200 (CEST) Subject: r3085 - trunk/varnish-cache/etc Message-ID: <20080812130141.CC6EF1ECE33@projects.linpro.no> Author: petter Date: 2008-08-12 15:01:41 +0200 (Tue, 12 Aug 2008) New Revision: 3085 Modified: trunk/varnish-cache/etc/Makefile.am Log: Added suppresion of output when generating the default.vcl. Fixes #287 Modified: trunk/varnish-cache/etc/Makefile.am =================================================================== --- trunk/varnish-cache/etc/Makefile.am 2008-08-12 12:57:00 UTC (rev 3084) +++ trunk/varnish-cache/etc/Makefile.am 2008-08-12 13:01:41 UTC (rev 3085) @@ -5,7 +5,7 @@ dist_data_DATA = default.vcl default.vcl: $(top_srcdir)/bin/varnishd/default.vcl - echo -e "This is a basic VCL configuration file for varnish. See the vcl(7)\n\ + @echo -e "This is a basic VCL configuration file for varnish. See the vcl(7)\n\ man page for details on VCL syntax and semantics.\n\ \n\ Default backend definition. Set this to point to your content\n\ @@ -19,6 +19,6 @@ Below is a commented-out copy of the default VCL logic. If you\n\ redefine any of these subroutines, the built-in logic will be\n\ appended to your code.\n" > tmp.vcl - sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl >> tmp.vcl - sed 's/^\(.*\)$$/#\1/' tmp.vcl > default.vcl - rm tmp.vcl + @sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl >> tmp.vcl + @sed 's/^\(.*\)$$/#\1/' tmp.vcl > default.vcl + @rm tmp.vcl From phk at projects.linpro.no Tue Aug 12 13:39:28 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 12 Aug 2008 15:39:28 +0200 (CEST) Subject: r3086 - trunk/varnish-cache/bin/varnishd Message-ID: <20080812133928.312EC1EC11B@projects.linpro.no> Author: phk Date: 2008-08-12 15:39:27 +0200 (Tue, 12 Aug 2008) New Revision: 3086 Added: trunk/varnish-cache/bin/varnishd/cache_backend_poll.h Log: New file with the bitmap definitons for for backend polling. Added: trunk/varnish-cache/bin/varnishd/cache_backend_poll.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.h (rev 0) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.h 2008-08-12 13:39:27 UTC (rev 3086) @@ -0,0 +1,39 @@ +/*- + * Copyright (c) 2008 Linpro AS + * All rights reserved. + * + * Author: Poul-Henning Kamp + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + * + */ + +BITMAP(good_ipv4, "4", "Good IPv4", 0) +BITMAP(good_ipv6, "6", "Good IPv4", 0) +BITMAP( err_xmit, "x", "Error 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(good_recv, "R", "Good Recv", 1) From petter at projects.linpro.no Tue Aug 12 13:49:13 2008 From: petter at projects.linpro.no (petter at projects.linpro.no) Date: Tue, 12 Aug 2008 15:49:13 +0200 (CEST) Subject: r3087 - trunk/varnish-cache/man Message-ID: <20080812134913.D65E71EC0F0@projects.linpro.no> Author: petter Date: 2008-08-12 15:49:13 +0200 (Tue, 12 Aug 2008) New Revision: 3087 Modified: trunk/varnish-cache/man/Makefile.am Log: Added some more output suppression Modified: trunk/varnish-cache/man/Makefile.am =================================================================== --- trunk/varnish-cache/man/Makefile.am 2008-08-12 13:39:27 UTC (rev 3086) +++ trunk/varnish-cache/man/Makefile.am 2008-08-12 13:49:13 UTC (rev 3087) @@ -6,6 +6,6 @@ dist_man_MANS = vcl.7 vcl.7: vcl.7so default.vcl Makefile - soelim vcl.7so > $@ + @soelim vcl.7so > $@ default.vcl: $(top_srcdir)/bin/varnishd/default.vcl Makefile - sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl > $@ + @sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl > $@ From tfheen at projects.linpro.no Wed Aug 13 06:14:22 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 13 Aug 2008 08:14:22 +0200 (CEST) Subject: r3088 - trunk/varnish-cache/man Message-ID: <20080813061422.2436A1ECEFC@projects.linpro.no> Author: tfheen Date: 2008-08-13 08:14:21 +0200 (Wed, 13 Aug 2008) New Revision: 3088 Modified: trunk/varnish-cache/man/Makefile.am Log: Stop hiding command invocations when building docs Modified: trunk/varnish-cache/man/Makefile.am =================================================================== --- trunk/varnish-cache/man/Makefile.am 2008-08-12 13:49:13 UTC (rev 3087) +++ trunk/varnish-cache/man/Makefile.am 2008-08-13 06:14:21 UTC (rev 3088) @@ -6,6 +6,6 @@ dist_man_MANS = vcl.7 vcl.7: vcl.7so default.vcl Makefile - @soelim vcl.7so > $@ + soelim vcl.7so > $@ default.vcl: $(top_srcdir)/bin/varnishd/default.vcl Makefile - @sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl > $@ + sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl > $@ From tfheen at projects.linpro.no Wed Aug 13 06:14:23 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 13 Aug 2008 08:14:23 +0200 (CEST) Subject: r3089 - trunk/varnish-cache/bin/varnishd Message-ID: <20080813061423.B92EC1ED0A4@projects.linpro.no> Author: tfheen Date: 2008-08-13 08:14:23 +0200 (Wed, 13 Aug 2008) New Revision: 3089 Modified: trunk/varnish-cache/bin/varnishd/Makefile.am Log: Fix build failure, cache_backend_poll.h was not in the distributed tarball Modified: trunk/varnish-cache/bin/varnishd/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-13 06:14:21 UTC (rev 3088) +++ trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-13 06:14:23 UTC (rev 3089) @@ -58,6 +58,7 @@ acct_fields.h \ cache.h \ cache_backend.h \ + cache_backend_poll.h \ cache_acceptor.h \ common.h \ default_vcl.h \ From tfheen at projects.linpro.no Wed Aug 13 06:14:25 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 13 Aug 2008 08:14:25 +0200 (CEST) Subject: r3090 - trunk/varnish-cache/man Message-ID: <20080813061425.376B61ECEFC@projects.linpro.no> Author: tfheen Date: 2008-08-13 08:14:25 +0200 (Wed, 13 Aug 2008) New Revision: 3090 Modified: trunk/varnish-cache/man/Makefile.am Log: Fix build failure when srcdir != builddir Modified: trunk/varnish-cache/man/Makefile.am =================================================================== --- trunk/varnish-cache/man/Makefile.am 2008-08-13 06:14:23 UTC (rev 3089) +++ trunk/varnish-cache/man/Makefile.am 2008-08-13 06:14:25 UTC (rev 3090) @@ -6,6 +6,6 @@ dist_man_MANS = vcl.7 vcl.7: vcl.7so default.vcl Makefile - soelim vcl.7so > $@ + soelim $(srcdir)/vcl.7so > $@ default.vcl: $(top_srcdir)/bin/varnishd/default.vcl Makefile sed -n '/vcl_recv/,$$p' $(top_srcdir)/bin/varnishd/default.vcl > $@ From phk at projects.linpro.no Wed Aug 13 06:54:14 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Wed, 13 Aug 2008 08:54:14 +0200 (CEST) Subject: r3091 - trunk/varnish-cache/bin/varnishd Message-ID: <20080813065414.A32AC1EC11B@projects.linpro.no> Author: phk Date: 2008-08-13 08:54:14 +0200 (Wed, 13 Aug 2008) New Revision: 3091 Modified: trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c Log: Remove If-Modified-Since headers on included objects to get consistent behaviour. Submitted by: sky (ticket 267) Modified: trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c 2008-08-13 06:14:25 UTC (rev 3090) +++ trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c 2008-08-13 06:54:14 UTC (rev 3091) @@ -809,6 +809,7 @@ http_SetH(sp->http, HTTP_HDR_URL, eb->include.b); if (eb->host.b != NULL) { http_Unset(sp->http, H_Host); + http_Unset(sp->http, H_If_Modified_Since); http_SetHeader(sp->wrk, sp->fd, sp->http, eb->host.b); } sp->step = STP_RECV; From tfheen at projects.linpro.no Thu Aug 14 06:32:16 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Thu, 14 Aug 2008 08:32:16 +0200 (CEST) Subject: r3092 - in trunk/varnish-cache: . etc Message-ID: <20080814063216.045CB1ECEFC@projects.linpro.no> Author: tfheen Date: 2008-08-14 08:32:15 +0200 (Thu, 14 Aug 2008) New Revision: 3092 Modified: trunk/varnish-cache/configure.ac trunk/varnish-cache/etc/Makefile.am Log: Install default.vcl to ${sysconfdir}/varnish, not ${datadir} Modified: trunk/varnish-cache/configure.ac =================================================================== --- trunk/varnish-cache/configure.ac 2008-08-13 06:54:14 UTC (rev 3091) +++ trunk/varnish-cache/configure.ac 2008-08-14 06:32:15 UTC (rev 3092) @@ -262,6 +262,9 @@ VARNISH_STATE_DIR='${localstatedir}/varnish' AC_SUBST(VARNISH_STATE_DIR) +# Default configuration directory. +varnishconfdir='${sysconfdir}/varnish' +AC_SUBST(varnishconfdir) # Now that we're done using the compiler to look for functions and # libraries, set CFLAGS to what we want them to be for our own code Modified: trunk/varnish-cache/etc/Makefile.am =================================================================== --- trunk/varnish-cache/etc/Makefile.am 2008-08-13 06:54:14 UTC (rev 3091) +++ trunk/varnish-cache/etc/Makefile.am 2008-08-14 06:32:15 UTC (rev 3092) @@ -2,7 +2,7 @@ EXTRA_DIST = zope-plone.vcl -dist_data_DATA = default.vcl +dist_varnishconf_DATA = default.vcl default.vcl: $(top_srcdir)/bin/varnishd/default.vcl @echo -e "This is a basic VCL configuration file for varnish. See the vcl(7)\n\ From phk at projects.linpro.no Thu Aug 14 14:47:37 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 14 Aug 2008 16:47:37 +0200 (CEST) Subject: r3093 - trunk/varnish-cache/bin/varnishtest/tests Message-ID: <20080814144737.71C491EC899@projects.linpro.no> Author: phk Date: 2008-08-14 16:47:37 +0200 (Thu, 14 Aug 2008) New Revision: 3093 Modified: trunk/varnish-cache/bin/varnishtest/tests/c00015.vtc trunk/varnish-cache/bin/varnishtest/tests/v00006.vtc Log: Be more careful about concurrency. Modified: trunk/varnish-cache/bin/varnishtest/tests/c00015.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00015.vtc 2008-08-14 06:32:15 UTC (rev 3092) +++ trunk/varnish-cache/bin/varnishtest/tests/c00015.vtc 2008-08-14 14:47:37 UTC (rev 3093) @@ -29,7 +29,7 @@ expect resp.status == 200 expect resp.http.content-length == 6 expect resp.http.x-varnish == "1001" -} -start +} -run varnish v1 -cli "vcl.use vcl2" @@ -39,7 +39,7 @@ expect resp.status == 200 expect resp.http.content-length == 7 expect resp.http.x-varnish == "1002" -} -start +} -run varnish v1 -cli "vcl.use vcl1" @@ -49,7 +49,7 @@ expect resp.status == 200 expect resp.http.content-length == 6 expect resp.http.x-varnish == "1003 1001" -} -start +} -run varnish v1 -cli "vcl.show vcl2" varnish v1 -cli "vcl.discard vcl2" Modified: trunk/varnish-cache/bin/varnishtest/tests/v00006.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/v00006.vtc 2008-08-14 06:32:15 UTC (rev 3092) +++ trunk/varnish-cache/bin/varnishtest/tests/v00006.vtc 2008-08-14 14:47:37 UTC (rev 3093) @@ -62,7 +62,7 @@ client c1 { txreq -url /foo rxresp -} -start +} -run # The workthread should have released its VCL reference now # but we need to tickle the CLI to notice From ingvar at projects.linpro.no Thu Aug 14 20:10:29 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Thu, 14 Aug 2008 22:10:29 +0200 (CEST) Subject: r3094 - trunk/varnish-cache/redhat Message-ID: <20080814201029.57AD21ED381@projects.linpro.no> Author: ingvar Date: 2008-08-14 22:10:29 +0200 (Thu, 14 Aug 2008) New Revision: 3094 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Changes in the specfile: - default.vcl has moved - Added groff to build requirements Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-14 14:47:37 UTC (rev 3093) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-14 20:10:29 UTC (rev 3094) @@ -1,7 +1,7 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: pre_svn20080307%{?dist} +Release: pre_svn20080814%{?dist} License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ @@ -10,7 +10,7 @@ # The svn sources needs autoconf, automake and libtoolto generate a suitable # configure script. Release tarballs would not need this #BuildRequires: automake autoconf libtool -BuildRequires: ncurses-devel libxslt +BuildRequires: ncurses-devel libxslt groff Requires: kernel >= 2.6.0 varnish-libs = %{version}-%{release} Requires: logrotate Requires(pre): shadow-utils @@ -56,7 +56,7 @@ # ./autogen.sh mkdir examples -cp etc/default.vcl etc/zope-plone.vcl examples +cp bin/varnishd/default.vcl etc/zope-plone.vcl examples %build @@ -172,6 +172,10 @@ %postun libs -p /sbin/ldconfig %changelog +* Thu Aug 14 2008 Ingvar Hagelund - 2.0-pre_svn20080814 +- default.vcl has moved +- Added groff to build requirements + * Sat Dec 29 2007 Ingvar Hagelund - 1.1.2-5 - Added missing configuration examples - Corrected the license to "BSD" From phk at projects.linpro.no Fri Aug 15 08:30:49 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Fri, 15 Aug 2008 10:30:49 +0200 (CEST) Subject: r3095 - trunk/varnish-cache/bin/varnishd Message-ID: <20080815083049.81BA21ED1C0@projects.linpro.no> Author: phk Date: 2008-08-15 10:30:49 +0200 (Fri, 15 Aug 2008) New Revision: 3095 Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c Log: Accept EINTR from waitpid() Modified: trunk/varnish-cache/bin/varnishd/mgt_vcc.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-14 20:10:29 UTC (rev 3094) +++ trunk/varnish-cache/bin/varnishd/mgt_vcc.c 2008-08-15 08:30:49 UTC (rev 3095) @@ -143,7 +143,7 @@ char sf[] = "./vcl.########.c"; char of[sizeof sf + 1]; char *retval; - int p[2], sfd, srclen, status; + int rv, p[2], sfd, srclen, status; pid_t pid; void *dlh; struct vlu *vlu; @@ -213,12 +213,15 @@ AZ(close(p[0])); VLU_Destroy(vlu); (void)unlink(sf); - if (waitpid(pid, &status, 0) < 0) { - vsb_printf(sb, "%s(): waitpid() failed: %s", - __func__, strerror(errno)); - (void)unlink(of); - return (NULL); - } + do { + rv = waitpid(pid, &status, 0); + if (rv < 0 && errno != EINTR) { + vsb_printf(sb, "%s(): waitpid() failed: %s", + __func__, strerror(errno)); + (void)unlink(of); + return (NULL); + } + } while (rv < 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { vsb_printf(sb, "%s(): Compiler failed", __func__); if (WIFEXITED(status)) From phk at projects.linpro.no Mon Aug 18 07:46:24 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 18 Aug 2008 09:46:24 +0200 (CEST) Subject: r3096 - trunk/varnish-cache/bin/varnishd Message-ID: <20080818074624.59CA11ED25D@projects.linpro.no> Author: phk Date: 2008-08-18 09:46:23 +0200 (Mon, 18 Aug 2008) New Revision: 3096 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c Log: Don't use a thread from the pool, backend polling is far too long-lived for that to make sense. We do not need a mutex for our list, all manipulation is from CLI thread. Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-15 08:30:49 UTC (rev 3095) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-18 07:46:23 UTC (rev 3096) @@ -54,15 +54,12 @@ #include "vrt.h" #include "cache_backend.h" -static MTX vbp_mtx; - struct vbp_target { unsigned magic; #define VBP_TARGET_MAGIC 0x6b7cb656 struct backend *backend; struct vrt_backend_probe probe; - struct workreq wrq; int stop; int req_len; @@ -72,6 +69,7 @@ #undef BITMAP VTAILQ_ENTRY(vbp_target) list; + pthread_t thread; }; static VTAILQ_HEAD(, vbp_target) vbp_list = @@ -85,7 +83,7 @@ static void dsleep(double t) { - if (t > 10.0) + if (t > 100.0) (void)sleep((int)round(t)); else (void)usleep((int)round(t * 1e6)); @@ -212,20 +210,15 @@ * One thread per backend to be poked. */ -static void -vbp_wrk_poll_backend(struct worker *w, void *priv) +static void * +vbp_wrk_poll_backend(void *priv) { struct vbp_target *vt; - (void)w; THR_SetName("backend poll"); CAST_OBJ_NOTNULL(vt, priv, VBP_TARGET_MAGIC); - LOCK(&vbp_mtx); - VTAILQ_INSERT_TAIL(&vbp_list, vt, list); - UNLOCK(&vbp_mtx); - /* Establish defaults (XXX: Should they go in VCC instead ?) */ if (vt->probe.request == NULL) vt->probe.request = default_request; @@ -247,14 +240,10 @@ #include "cache_backend_poll.h" #undef BITMAP vbp_poke(vt); - dsleep(vt->probe.interval); + if (!vt->stop) + dsleep(vt->probe.interval); } - LOCK(&vbp_mtx); - VTAILQ_REMOVE(&vbp_list, vt, list); - UNLOCK(&vbp_mtx); - vt->backend->probe = NULL; - FREE_OBJ(vt); - THR_SetName("cache-worker"); + return (NULL); } /*-------------------------------------------------------------------- @@ -280,7 +269,7 @@ /*lint -e{506} constant value boolean */ /*lint -e{774} constant value boolean */ static void -vbp_health_one(struct cli *cli, struct vbp_target *vt) +vbp_health_one(struct cli *cli, const struct vbp_target *vt) { cli_out(cli, "Health stats for backend %s\n", @@ -301,6 +290,7 @@ { struct vbp_target *vt; + ASSERT_CLI(); (void)av; (void)priv; @@ -336,21 +326,32 @@ vt->probe = *p; b->probe = vt; - vt->wrq.func = vbp_wrk_poll_backend; - vt->wrq.priv = vt; - if (WRK_Queue(&vt->wrq) == 0) - return; - assert(0 == __LINE__); - b->probe = NULL; - FREE_OBJ(vt); + VTAILQ_INSERT_TAIL(&vbp_list, vt, list); + + AZ(pthread_create(&vt->thread, NULL, vbp_wrk_poll_backend, vt)); } void VBP_Stop(struct backend *b) { + struct vbp_target *vt; + void *ret; + + CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC); + + ASSERT_CLI(); if (b->probe == NULL) return; - b->probe->stop = 1; + CHECK_OBJ_NOTNULL(b->probe, VBP_TARGET_MAGIC); + vt = b->probe; + + vt->stop = 1; + AZ(pthread_cancel(vt->thread)); + AZ(pthread_join(vt->thread, &ret)); + + VTAILQ_REMOVE(&vbp_list, vt, list); + b->probe = NULL; + FREE_OBJ(vt); } /*-------------------------------------------------------------------- @@ -361,7 +362,5 @@ VBP_Init(void) { - MTX_INIT(&vbp_mtx); - CLI_AddFuncs(DEBUG_CLI, debug_cmds); } From tfheen at projects.linpro.no Mon Aug 18 08:00:21 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Mon, 18 Aug 2008 10:00:21 +0200 (CEST) Subject: r3097 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080818080021.F07501ED1AD@projects.linpro.no> Author: tfheen Date: 2008-08-18 10:00:21 +0200 (Mon, 18 Aug 2008) New Revision: 3097 Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c Log: When an -expect fails in varnishtest, loop for up to a second since stats sometimes takes a little while to update Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-18 07:46:23 UTC (rev 3096) +++ trunk/varnish-cache/bin/varnishtest/vtc_varnish.c 2008-08-18 08:00:21 UTC (rev 3097) @@ -416,29 +416,36 @@ uint64_t val, ref; int good; char *p; + int i; + good = 0; + + for (i = 0; i < 10; i++, usleep(100000)) { + #define MAC_STAT(n, t, f, d) \ - if (!strcmp(av[0], #n)) { \ - val = v->stats->n; \ - } else + if (!strcmp(av[0], #n)) { \ + val = v->stats->n; \ + } else #include "stat_field.h" #undef MAC_STAT { - vtc_log(v->vl, 0, "stats field %s unknown", av[0]); - } + vtc_log(v->vl, 0, "stats field %s unknown", av[0]); + } - ref = strtoumax(av[2], &p, 0); - if (ref == UINTMAX_MAX || *p) - vtc_log(v->vl, 0, "Syntax error in number (%s)", av[2]); - good = 0; - if (!strcmp(av[1], "==")) { if (val == ref) good = 1; } - else if (!strcmp(av[1], "!=")) { if (val != ref) good = 1; } - else if (!strcmp(av[1], ">")) { if (val > ref) good = 1; } - else if (!strcmp(av[1], "<")) { if (val < ref) good = 1; } - else if (!strcmp(av[1], ">=")) { if (val >= ref) good = 1; } - else if (!strcmp(av[1], "<=")) { if (val <= ref) good = 1; } - else { - vtc_log(v->vl, 0, "comparison %s unknown", av[1]); + ref = strtoumax(av[2], &p, 0); + if (ref == UINTMAX_MAX || *p) + vtc_log(v->vl, 0, "Syntax error in number (%s)", av[2]); + if (!strcmp(av[1], "==")) { if (val == ref) good = 1; } + else if (!strcmp(av[1], "!=")) { if (val != ref) good = 1; } + else if (!strcmp(av[1], ">")) { if (val > ref) good = 1; } + else if (!strcmp(av[1], "<")) { if (val < ref) good = 1; } + else if (!strcmp(av[1], ">=")) { if (val >= ref) good = 1; } + else if (!strcmp(av[1], "<=")) { if (val <= ref) good = 1; } + else { + vtc_log(v->vl, 0, "comparison %s unknown", av[1]); + } + if (good) + break; } if (good) vtc_log(v->vl, 2, "as expected: %s (%ju) %s %s", From phk at projects.linpro.no Mon Aug 18 08:18:43 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 18 Aug 2008 10:18:43 +0200 (CEST) Subject: r3098 - in trunk/varnish-cache: include lib/libvcl Message-ID: <20080818081843.D1EA61ED0A4@projects.linpro.no> Author: phk Date: 2008-08-18 10:18:43 +0200 (Mon, 18 Aug 2008) New Revision: 3098 Modified: trunk/varnish-cache/include/vrt.h trunk/varnish-cache/lib/libvcl/vcc_backend.c trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl Log: Implement parsing of .window and .threshold in backend polling specifications. .window is how many of the latest polls we examine. .threshold is how many must have succeeded for the backend to be healthy. .window = 40; .threshold = 30; // Thirty of the last fourty polls must have succeed. .threshold = 4; // The last four polls must have succeeded. Default values: .window = 8; .threshold = 3; Modified: trunk/varnish-cache/include/vrt.h =================================================================== --- trunk/varnish-cache/include/vrt.h 2008-08-18 08:00:21 UTC (rev 3097) +++ trunk/varnish-cache/include/vrt.h 2008-08-18 08:18:43 UTC (rev 3098) @@ -51,6 +51,8 @@ char *request; double timeout; double interval; + unsigned window; + unsigned threshold; }; /* Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-18 08:00:21 UTC (rev 3097) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-18 08:18:43 UTC (rev 3098) @@ -336,18 +336,23 @@ { struct fld_spec *fs; struct token *t_field; - struct token *t_did = NULL; + struct token *t_did = NULL, *t_window = NULL, *t_threshold = NULL; + unsigned window, threshold; fs = vcc_FldSpec(tl, "?url", "?request", "?timeout", "?interval", + "?window", + "?threshold", NULL); ExpectErr(tl, '{'); vcc_NextToken(tl); + window = 8; + threshold = 3; Fb(tl, 0, "\t.probe = {\n"); while (tl->t->tok != '}') { @@ -388,6 +393,16 @@ vcc_TimeVal(tl); ERRCHK(tl); Fb(tl, 0, ",\n"); + } else if (vcc_IdIs(t_field, "window")) { + t_window = tl->t; + window = vcc_UintVal(tl); + vcc_NextToken(tl); + ERRCHK(tl); + } else if (vcc_IdIs(t_field, "threshold")) { + t_threshold = tl->t; + threshold = vcc_UintVal(tl); + vcc_NextToken(tl); + ERRCHK(tl); } else { vcc_ErrToken(tl, t_field); vcc_ErrWhere(tl, t_field); @@ -398,6 +413,33 @@ ExpectErr(tl, ';'); vcc_NextToken(tl); } + + if (t_threshold == NULL && t_window != NULL) { + vsb_printf(tl->sb, "Must specify .threshold with .window\n"); + vcc_ErrWhere(tl, t_window); + return; + } else if (t_threshold != NULL && t_window == NULL) { + if (threshold > 64) { + vsb_printf(tl->sb, "Threshold must be 64 or less.\n"); + vcc_ErrWhere(tl, t_threshold); + return; + } + window = threshold + 1; + } else if (window > 64) { + AN(t_window); + vsb_printf(tl->sb, "Window must be 64 or less.\n"); + vcc_ErrWhere(tl, t_window); + return; + } + if (threshold > window ) { + vsb_printf(tl->sb, + "Threshold can not be greater than window.\n"); + vcc_ErrWhere(tl, t_threshold); + AN(t_window); + vcc_ErrWhere(tl, t_window); + } + Fb(tl, 0, "\t\t.window = %u,\n", window); + Fb(tl, 0, "\t\t.threshold = %u\n", threshold); Fb(tl, 0, "\t},\n"); ExpectErr(tl, '}'); vcc_NextToken(tl); Modified: trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-18 08:00:21 UTC (rev 3097) +++ trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-18 08:18:43 UTC (rev 3098) @@ -331,6 +331,8 @@ vsb_cat(sb, " char *request;\n"); vsb_cat(sb, " double timeout;\n"); vsb_cat(sb, " double interval;\n"); + vsb_cat(sb, " unsigned window;\n"); + vsb_cat(sb, " unsigned threshold;\n"); vsb_cat(sb, "};\n"); vsb_cat(sb, "\n"); vsb_cat(sb, "/*\n"); Modified: trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl 2008-08-18 08:00:21 UTC (rev 3097) +++ trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl 2008-08-18 08:18:43 UTC (rev 3098) @@ -214,6 +214,7 @@ puts $fo "#include \"config.h\"" puts $fo "#include " puts $fo "#include " +puts $fo "#include \"config.h\"" puts $fo "#include \"vcc_priv.h\"" puts $fo "#include \"vsb.h\"" From phk at projects.linpro.no Mon Aug 18 08:25:48 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 18 Aug 2008 10:25:48 +0200 (CEST) Subject: r3099 - trunk/varnish-cache/lib/libvcl Message-ID: <20080818082548.CC5971EC0F0@projects.linpro.no> Author: phk Date: 2008-08-18 10:25:48 +0200 (Mon, 18 Aug 2008) New Revision: 3099 Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c Log: Make up my mind: defaults go in varnishd Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-18 08:18:43 UTC (rev 3098) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-18 08:25:48 UTC (rev 3099) @@ -351,8 +351,8 @@ ExpectErr(tl, '{'); vcc_NextToken(tl); - window = 8; - threshold = 3; + window = 0; + threshold = 0; Fb(tl, 0, "\t.probe = {\n"); while (tl->t->tok != '}') { @@ -414,32 +414,36 @@ vcc_NextToken(tl); } - if (t_threshold == NULL && t_window != NULL) { - vsb_printf(tl->sb, "Must specify .threshold with .window\n"); - vcc_ErrWhere(tl, t_window); - return; - } else if (t_threshold != NULL && t_window == NULL) { - if (threshold > 64) { - vsb_printf(tl->sb, "Threshold must be 64 or less.\n"); - vcc_ErrWhere(tl, t_threshold); + if (t_threshold != NULL || t_window != NULL) { + if (t_threshold == NULL && t_window != NULL) { + vsb_printf(tl->sb, + "Must specify .threshold with .window\n"); + vcc_ErrWhere(tl, t_window); return; + } else if (t_threshold != NULL && t_window == NULL) { + if (threshold > 64) { + vsb_printf(tl->sb, + "Threshold must be 64 or less.\n"); + vcc_ErrWhere(tl, t_threshold); + return; + } + window = threshold + 1; + } else if (window > 64) { + AN(t_window); + vsb_printf(tl->sb, "Window must be 64 or less.\n"); + vcc_ErrWhere(tl, t_window); + return; } - window = threshold + 1; - } else if (window > 64) { - AN(t_window); - vsb_printf(tl->sb, "Window must be 64 or less.\n"); - vcc_ErrWhere(tl, t_window); - return; + if (threshold > window ) { + vsb_printf(tl->sb, + "Threshold can not be greater than window.\n"); + vcc_ErrWhere(tl, t_threshold); + AN(t_window); + vcc_ErrWhere(tl, t_window); + } + Fb(tl, 0, "\t\t.window = %u,\n", window); + Fb(tl, 0, "\t\t.threshold = %u\n", threshold); } - if (threshold > window ) { - vsb_printf(tl->sb, - "Threshold can not be greater than window.\n"); - vcc_ErrWhere(tl, t_threshold); - AN(t_window); - vcc_ErrWhere(tl, t_window); - } - Fb(tl, 0, "\t\t.window = %u,\n", window); - Fb(tl, 0, "\t\t.threshold = %u\n", threshold); Fb(tl, 0, "\t},\n"); ExpectErr(tl, '}'); vcc_NextToken(tl); From phk at projects.linpro.no Mon Aug 18 09:10:14 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Mon, 18 Aug 2008 11:10:14 +0200 (CEST) Subject: r3100 - in trunk/varnish-cache: bin/varnishd include Message-ID: <20080818091015.0A6BC1ED1AD@projects.linpro.no> Author: phk Date: 2008-08-18 11:10:11 +0200 (Mon, 18 Aug 2008) New Revision: 3100 Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h trunk/varnish-cache/bin/varnishd/cache_backend_poll.c trunk/varnish-cache/bin/varnishd/cache_backend_poll.h trunk/varnish-cache/include/shmlog_tags.h Log: Update the backend->healty state based on the window/threshold paramters. Log each polls result in the SHMlog Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-18 08:25:48 UTC (rev 3099) +++ trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-18 09:10:11 UTC (rev 3100) @@ -95,7 +95,7 @@ VTAILQ_HEAD(, vbe_conn) connlist; struct vbp_target *probe; - int health; + unsigned healthy; }; /* cache_backend.c */ Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-18 08:25:48 UTC (rev 3099) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-18 09:10:11 UTC (rev 3100) @@ -62,6 +62,8 @@ struct vrt_backend_probe probe; int stop; int req_len; + + unsigned good; /* Collected statistics */ #define BITMAP(n, c, t, b) uint64_t n; @@ -203,6 +205,8 @@ TCP_close(&s); t_now = TIM_real(); vt->good_recv |= 1; + /* XXX: Check reponse status */ + vt->happy |= 1; return (1); } @@ -214,18 +218,29 @@ vbp_wrk_poll_backend(void *priv) { struct vbp_target *vt; + unsigned i, j; + uint64_t u; + const char *logmsg; + char bits[10]; THR_SetName("backend poll"); CAST_OBJ_NOTNULL(vt, priv, VBP_TARGET_MAGIC); - /* Establish defaults (XXX: Should they go in VCC instead ?) */ + /* + * Establish defaults + * XXX: we could make these defaults parameters + */ if (vt->probe.request == NULL) vt->probe.request = default_request; if (vt->probe.timeout == 0.0) vt->probe.timeout = 2.0; if (vt->probe.interval == 0.0) vt->probe.timeout = 5.0; + if (vt->probe.window == 0) + vt->probe.window = 8; + if (vt->probe.threshold == 0) + vt->probe.threshold = 3; printf("Probe(\"%s\", %g, %g)\n", vt->probe.request, @@ -240,6 +255,38 @@ #include "cache_backend_poll.h" #undef BITMAP vbp_poke(vt); + + i = 0; +#define BITMAP(n, c, t, b) bits[i++] = (vt->n & 1) ? c : '-'; +#include "cache_backend_poll.h" +#undef BITMAP + bits[i] = '\0'; + + u = vt->happy; + for (i = j = 0; i < vt->probe.window; i++) { + if (u & 1) + j++; + u >>= 1; + } + vt->good = j; + + if (vt->good >= vt->probe.threshold) { + if (vt->backend->healthy) + logmsg = "Still healthy"; + else + logmsg = "Back healthy"; + vt->backend->healthy = 1; + } else { + if (vt->backend->healthy) + logmsg = "Went sick"; + else + logmsg = "Still sick"; + vt->backend->healthy = 0; + } + VSL(SLT_Backend_health, 0, "%s %s %s %u %u %u", + vt->backend->vcl_name, logmsg, bits, + vt->good, vt->probe.threshold, vt->probe.window); + if (!vt->stop) dsleep(vt->probe.interval); } @@ -251,14 +298,14 @@ */ static void -vbp_bitmap(struct cli *cli, const char *s, uint64_t map, const char *lbl) +vbp_bitmap(struct cli *cli, char c, uint64_t map, const char *lbl) { int i; uint64_t u = (1ULL << 63); for (i = 0; i < 64; i++) { if (map & u) - cli_out(cli, s); + cli_out(cli, "%c", c); else cli_out(cli, "-"); map <<= 1; @@ -272,11 +319,17 @@ vbp_health_one(struct cli *cli, const struct vbp_target *vt) { - cli_out(cli, "Health stats for backend %s\n", - vt->backend->vcl_name); + cli_out(cli, "Backend %s is %s\n", + vt->backend->vcl_name, + vt->backend->healthy ? "Healthy" : "Sick"); + cli_out(cli, "Current states good: %2u threshold: %2u window: %2u\n", + vt->good, vt->probe.threshold, vt->probe.window); cli_out(cli, - "Oldest ______________________" - "____________________________ Newest\n"); + "Oldest " + " Newest\n"); + cli_out(cli, + "=============================" + "===================================\n"); #define BITMAP(n, c, t, b) \ if ((vt->n != 0) || (b)) \ Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.h 2008-08-18 08:25:48 UTC (rev 3099) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.h 2008-08-18 09:10:11 UTC (rev 3100) @@ -29,11 +29,12 @@ * */ -BITMAP(good_ipv4, "4", "Good IPv4", 0) -BITMAP(good_ipv6, "6", "Good IPv4", 0) -BITMAP( err_xmit, "x", "Error 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(good_recv, "R", "Good Recv", 1) +BITMAP(good_ipv4, '4', "Good IPv4", 0) +BITMAP(good_ipv6, '6', "Good IPv4", 0) +BITMAP( err_xmit, 'x', "Error 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(good_recv, 'R', "Good Recv", 0) +BITMAP(happy, 'H', "Happy", 1) Modified: trunk/varnish-cache/include/shmlog_tags.h =================================================================== --- trunk/varnish-cache/include/shmlog_tags.h 2008-08-18 08:25:48 UTC (rev 3099) +++ trunk/varnish-cache/include/shmlog_tags.h 2008-08-18 09:10:11 UTC (rev 3100) @@ -99,3 +99,5 @@ SLTM(ESI_xmlerror) SLTM(Hash) + +SLTM(Backend_health) From ingvar at projects.linpro.no Mon Aug 18 14:40:51 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Mon, 18 Aug 2008 16:40:51 +0200 (CEST) Subject: r3101 - trunk/varnish-cache/redhat Message-ID: <20080818144051.796F41ED0A4@projects.linpro.no> Author: ingvar Date: 2008-08-18 16:40:51 +0200 (Mon, 18 Aug 2008) New Revision: 3101 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Started the upgrade race for 2.0 Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-18 09:10:11 UTC (rev 3100) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-18 14:40:51 UTC (rev 3101) @@ -1,11 +1,12 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: pre_svn20080814%{?dist} +Release: 0.2.tp2 License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ -Source0: http://downloads.sourceforge.net/varnish/varnish-%{version}.tar.gz +#Source0: http://downloads.sourceforge.net/varnish/varnish-%{version}.tar.gz +Source0: http://varnish.projects.linpro.no/static/varnish-%{version}-tp2.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) # The svn sources needs autoconf, automake and libtoolto generate a suitable # configure script. Release tarballs would not need this @@ -49,7 +50,7 @@ Varnish is a high-performance HTTP accelerator %prep -%setup -q +%setup -n varnish-%{version}-tp2 # The svn sources needs to generate a suitable configure script # Release tarballs would not need this @@ -172,6 +173,9 @@ %postun libs -p /sbin/ldconfig %changelog +* Mon Aug 18 2008 Ingvar Hagelund - 2.0-0.2.tp2 +- Changed source, version and release to match 2.0-tp2 + * Thu Aug 14 2008 Ingvar Hagelund - 2.0-pre_svn20080814 - default.vcl has moved - Added groff to build requirements From phk at projects.linpro.no Tue Aug 19 07:19:51 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 09:19:51 +0200 (CEST) Subject: r3102 - in trunk/varnish-cache: bin/varnishd include lib/libvcl Message-ID: <20080819071951.492F71EC11B@projects.linpro.no> Author: phk Date: 2008-08-19 09:19:50 +0200 (Tue, 19 Aug 2008) New Revision: 3102 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c trunk/varnish-cache/include/vrt.h trunk/varnish-cache/lib/libvcl/vcc_backend.c trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c Log: Use the default (or specified) Host: header for the backend in the probe requests. Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-18 14:40:51 UTC (rev 3101) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 07:19:50 UTC (rev 3102) @@ -61,6 +61,7 @@ struct backend *backend; struct vrt_backend_probe probe; int stop; + char *req; int req_len; unsigned good; @@ -157,7 +158,7 @@ return (0); } - i = write(s, vt->probe.request, vt->req_len); + i = write(s, vt->req, vt->req_len); if (i != vt->req_len) { if (i < 0) vt->err_xmit |= 1; @@ -243,7 +244,7 @@ vt->probe.threshold = 3; printf("Probe(\"%s\", %g, %g)\n", - vt->probe.request, + vt->req, vt->probe.timeout, vt->probe.interval); @@ -366,6 +367,7 @@ VBP_Start(struct backend *b, struct vrt_backend_probe const *p) { struct vbp_target *vt; + struct vsb *vsb; ASSERT_CLI(); @@ -377,6 +379,27 @@ } vt->backend = b; vt->probe = *p; + + if(p->request != NULL) { + vt->req = strdup(p->request); + XXXAN(vt->req); + } else { + vsb = vsb_newauto(); + XXXAN(vsb); + vsb_printf(vsb, "GET %s HTTP/1.1\r\n", + p->url != NULL ? p->url : "/"); + vsb_printf(vsb, "Connection: close\r\n"); + if (b->hosthdr != NULL) + vsb_printf(vsb, "Host: %s\r\n", b->hosthdr); + vsb_printf(vsb, "\r\n", b->hosthdr); + vsb_finish(vsb); + AZ(vsb_overflowed(vsb)); + vt->req = strdup(vsb_data(vsb)); + XXXAN(vt->req); + vsb_delete(vsb); + } + vt->req_len = strlen(vt->req); + b->probe = vt; VTAILQ_INSERT_TAIL(&vbp_list, vt, list); Modified: trunk/varnish-cache/include/vrt.h =================================================================== --- trunk/varnish-cache/include/vrt.h 2008-08-18 14:40:51 UTC (rev 3101) +++ trunk/varnish-cache/include/vrt.h 2008-08-19 07:19:50 UTC (rev 3102) @@ -48,6 +48,7 @@ extern void *vrt_magic_string_end; struct vrt_backend_probe { + char *url; char *request; double timeout; double interval; Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-18 14:40:51 UTC (rev 3101) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-19 07:19:50 UTC (rev 3102) @@ -364,12 +364,9 @@ vcc_ProbeRedef(tl, &t_did, t_field); ERRCHK(tl); ExpectErr(tl, CSTR); - Fb(tl, 0, "\t\t.request =\n"); - Fb(tl, 0, "\t\t\t\"GET \" "); + Fb(tl, 0, "\t\t.url = "); EncToken(tl->fb, tl->t); - Fb(tl, 0, " \" /HTTP/1.1\\r\\n\"\n"); - Fb(tl, 0, "\t\t\t\"Connection: close\\r\\n\"\n"); - Fb(tl, 0, "\t\t\t\"\\r\\n\",\n"); + Fb(tl, 0, ",\n"); vcc_NextToken(tl); } else if (vcc_IdIs(t_field, "request")) { vcc_ProbeRedef(tl, &t_did, t_field); @@ -703,7 +700,7 @@ const char *name; parsedirector_f *func; } dirlist[] = { - { "random", vcc_ParseRandomDirector }, + { "random", vcc_ParseRandomDirector }, { "round-robin", vcc_ParseRoundRobinDirector }, { NULL, NULL } }; Modified: trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-18 14:40:51 UTC (rev 3101) +++ trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-19 07:19:50 UTC (rev 3102) @@ -328,6 +328,7 @@ vsb_cat(sb, "extern void *vrt_magic_string_end;\n"); vsb_cat(sb, "\n"); vsb_cat(sb, "struct vrt_backend_probe {\n"); + vsb_cat(sb, " char *url;\n"); vsb_cat(sb, " char *request;\n"); vsb_cat(sb, " double timeout;\n"); vsb_cat(sb, " double interval;\n"); From phk at projects.linpro.no Tue Aug 19 07:46:42 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 09:46:42 +0200 (CEST) Subject: r3103 - trunk/varnish-cache/bin/varnishd Message-ID: <20080819074643.0EB061EC0F9@projects.linpro.no> Author: phk Date: 2008-08-19 09:46:40 +0200 (Tue, 19 Aug 2008) New Revision: 3103 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c Log: Add exponential average of responsetime to output Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 07:19:50 UTC (rev 3102) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 07:46:40 UTC (rev 3103) @@ -54,6 +54,9 @@ #include "vrt.h" #include "cache_backend.h" +/* Default averaging rate, we want something pretty responsive */ +#define AVG_RATE 4 + struct vbp_target { unsigned magic; #define VBP_TARGET_MAGIC 0x6b7cb656 @@ -71,6 +74,10 @@ #include "cache_backend_poll.h" #undef BITMAP + double last; + double avg; + double rate; + VTAILQ_ENTRY(vbp_target) list; pthread_t thread; }; @@ -205,6 +212,7 @@ TCP_close(&s); t_now = TIM_real(); + vt->last = t_now - t_start; vt->good_recv |= 1; /* XXX: Check reponse status */ vt->happy |= 1; @@ -255,8 +263,16 @@ #define BITMAP(n, c, t, b) vt->n <<= 1; #include "cache_backend_poll.h" #undef BITMAP + vt->last = 0; vbp_poke(vt); + /* Calculate exponential average */ + if (vt->happy & 1) { + if (vt->rate < AVG_RATE) + vt->rate += 1.0; + vt->avg += (vt->last - vt->avg) / vt->rate; + } + i = 0; #define BITMAP(n, c, t, b) bits[i++] = (vt->n & 1) ? c : '-'; #include "cache_backend_poll.h" @@ -284,9 +300,10 @@ logmsg = "Still sick"; vt->backend->healthy = 0; } - VSL(SLT_Backend_health, 0, "%s %s %s %u %u %u", + VSL(SLT_Backend_health, 0, "%s %s %s %u %u %u %.6f %.6f", vt->backend->vcl_name, logmsg, bits, - vt->good, vt->probe.threshold, vt->probe.window); + vt->good, vt->probe.threshold, vt->probe.window, + vt->last, vt->avg); if (!vt->stop) dsleep(vt->probe.interval); @@ -325,6 +342,7 @@ vt->backend->healthy ? "Healthy" : "Sick"); cli_out(cli, "Current states good: %2u threshold: %2u window: %2u\n", vt->good, vt->probe.threshold, vt->probe.window); + cli_out(cli, "Average responsetime of good probes: %.6f\n", vt->avg); cli_out(cli, "Oldest " " Newest\n"); From phk at projects.linpro.no Tue Aug 19 07:50:50 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 09:50:50 +0200 (CEST) Subject: r3104 - trunk/varnish-cache/bin/varnishlog Message-ID: <20080819075050.92CB51EC200@projects.linpro.no> Author: phk Date: 2008-08-19 09:50:50 +0200 (Tue, 19 Aug 2008) New Revision: 3104 Modified: trunk/varnish-cache/bin/varnishlog/varnishlog.1 trunk/varnish-cache/bin/varnishlog/varnishlog.c Log: Add -u for unbuffered output. Modified: trunk/varnish-cache/bin/varnishlog/varnishlog.1 =================================================================== --- trunk/varnish-cache/bin/varnishlog/varnishlog.1 2008-08-19 07:46:40 UTC (rev 3103) +++ trunk/varnish-cache/bin/varnishlog/varnishlog.1 2008-08-19 07:50:50 UTC (rev 3104) @@ -50,6 +50,7 @@ .Op Fl P Ar file .Op Fl r Ar file .Op Fl s Ar num +.Op Fl u .Op Fl V .Op Fl w Ar file .Op Fl X Ar regex @@ -136,6 +137,8 @@ Skip the first .Ar num log records. +.It Fl u +Unbuffered output. .It Fl V Display the version number and exit. .It Fl w Ar file Modified: trunk/varnish-cache/bin/varnishlog/varnishlog.c =================================================================== --- trunk/varnish-cache/bin/varnishlog/varnishlog.c 2008-08-19 07:46:40 UTC (rev 3103) +++ trunk/varnish-cache/bin/varnishlog/varnishlog.c 2008-08-19 07:50:50 UTC (rev 3104) @@ -317,7 +317,7 @@ main(int argc, char **argv) { int c; - int a_flag = 0, D_flag = 0, o_flag = 0; + int a_flag = 0, D_flag = 0, o_flag = 0, u_flag = 0; const char *n_arg = NULL; const char *P_arg = NULL; const char *w_arg = NULL; @@ -326,7 +326,7 @@ vd = VSL_New(); - while ((c = getopt(argc, argv, VSL_ARGS "aDon:P:Vw:")) != -1) { + while ((c = getopt(argc, argv, VSL_ARGS "aDon:P:uVw:")) != -1) { switch (c) { case 'a': a_flag = 1; @@ -351,6 +351,9 @@ case 'P': P_arg = optarg; break; + case 'u': + u_flag = 1; + break; case 'V': varnish_version("varnishlog"); exit(0); @@ -391,6 +394,9 @@ if (o_flag) do_order(vd, argc - optind, argv + optind); + if (u_flag) + setbuf(stdout, NULL); + while (VSL_Dispatch(vd, VSL_H_Print, stdout) >= 0) { if (fflush(stdout) != 0) { perror("stdout"); From phk at projects.linpro.no Tue Aug 19 08:16:37 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 10:16:37 +0200 (CEST) Subject: r3105 - trunk/varnish-cache/bin/varnishd Message-ID: <20080819081637.29B101EC11B@projects.linpro.no> Author: phk Date: 2008-08-19 10:16:36 +0200 (Tue, 19 Aug 2008) New Revision: 3105 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c Log: Check that the HTTP response is 200 before we declare the probe happy. Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 07:50:50 UTC (rev 3104) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 08:16:36 UTC (rev 3105) @@ -67,6 +67,7 @@ char *req; int req_len; + char resp_buf[128]; unsigned good; /* Collected statistics */ @@ -122,13 +123,14 @@ return (-1); } -static int +static void vbp_poke(struct vbp_target *vt) { int s, tmo, i; - double t_start, t_now, t_end, rlen; + double t_start, t_now, t_end; + unsigned rlen, resp; struct backend *bp; - char buf[8192]; + char buf[8192], *p; struct pollfd pfda[1], *pfd = pfda; bp = vt->backend; @@ -162,30 +164,34 @@ } if (s < 0) { /* Got no connection: failed */ - return (0); + return; } + /* Send the request */ i = write(s, vt->req, vt->req_len); if (i != vt->req_len) { if (i < 0) vt->err_xmit |= 1; TCP_close(&s); - return (0); + return; } 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 (0); + 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 (0); + return; } pfd->fd = s; @@ -198,25 +204,41 @@ i = poll(pfd, 1, tmo); if (i == 0 || tmo <= 0) { TCP_close(&s); - return (0); + return; } - i = read(s, buf, sizeof buf); + if (rlen < sizeof vt->resp_buf) + i = read(s, vt->resp_buf + rlen, + sizeof vt->resp_buf - rlen); + else + i = read(s, buf, sizeof buf); rlen += i; } while (i > 0); + TCP_close(&s); + if (i < 0) { vt->err_recv |= 1; - TCP_close(&s); - return (0); + return; } - TCP_close(&s); + /* So we have a good receive ... */ t_now = TIM_real(); vt->last = t_now - t_start; vt->good_recv |= 1; - /* XXX: Check reponse status */ - vt->happy |= 1; - return (1); + + /* Now find out if we like the response */ + vt->resp_buf[sizeof vt->resp_buf - 1] = '\0'; + p = strchr(vt->resp_buf, '\r'); + if (p != NULL) + *p = '\0'; + p = strchr(vt->resp_buf, '\n'); + if (p != NULL) + *p = '\0'; + + i = sscanf(vt->resp_buf, "HTTP/%*f %u %s", &resp, buf); + + if (i == 2 && resp == 200) + vt->happy |= 1; } /*-------------------------------------------------------------------- @@ -256,14 +278,13 @@ vt->probe.timeout, vt->probe.interval); - vt->req_len = strlen(vt->probe.request); - /*lint -e{525} indent */ while (!vt->stop) { #define BITMAP(n, c, t, b) vt->n <<= 1; #include "cache_backend_poll.h" #undef BITMAP vt->last = 0; + vt->resp_buf[0] = '\0'; vbp_poke(vt); /* Calculate exponential average */ @@ -300,10 +321,10 @@ logmsg = "Still sick"; vt->backend->healthy = 0; } - VSL(SLT_Backend_health, 0, "%s %s %s %u %u %u %.6f %.6f", + VSL(SLT_Backend_health, 0, "%s %s %s %u %u %u %.6f %.6f %s", vt->backend->vcl_name, logmsg, bits, vt->good, vt->probe.threshold, vt->probe.window, - vt->last, vt->avg); + vt->last, vt->avg, vt->resp_buf); if (!vt->stop) dsleep(vt->probe.interval); @@ -406,10 +427,10 @@ XXXAN(vsb); vsb_printf(vsb, "GET %s HTTP/1.1\r\n", p->url != NULL ? p->url : "/"); - vsb_printf(vsb, "Connection: close\r\n"); if (b->hosthdr != NULL) vsb_printf(vsb, "Host: %s\r\n", b->hosthdr); - vsb_printf(vsb, "\r\n", b->hosthdr); + vsb_printf(vsb, "Connection: close\r\n"); + vsb_printf(vsb, "\r\n"); vsb_finish(vsb); AZ(vsb_overflowed(vsb)); vt->req = strdup(vsb_data(vsb)); From phk at projects.linpro.no Tue Aug 19 09:34:44 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 11:34:44 +0200 (CEST) Subject: r3106 - trunk/varnish-cache/bin/varnishd Message-ID: <20080819093444.644931EC200@projects.linpro.no> Author: phk Date: 2008-08-19 11:34:44 +0200 (Tue, 19 Aug 2008) New Revision: 3106 Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/cache_fetch.c Log: Don't attempt to update the Health information based on how regular traffic fares. Problems seen there could be caused by all sorts of special circumstances (bad PHP, weird headers from client etc) and is not indicative of the backends health. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-19 08:16:36 UTC (rev 3105) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-19 09:34:44 UTC (rev 3106) @@ -417,7 +417,6 @@ void VBE_RecycleFd(struct worker *w, struct vbe_conn *vc); struct bereq * VBE_new_bereq(void); void VBE_free_bereq(struct bereq *bereq); -void VBE_UpdateHealth(const struct sess *sp, const struct vbe_conn *, int); void VBE_AddHostHeader(const struct sess *sp); void VBE_Poll(void); Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-19 08:16:36 UTC (rev 3105) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-19 09:34:44 UTC (rev 3106) @@ -348,34 +348,3 @@ VBE_DropRefLocked(vc->backend); CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); } - -/* Update health ----------------------------------------------------*/ -/* See cache_backend_random.c and/or cache_backend_round_robin.c for - * details and comments about this function. - */ -void -VBE_UpdateHealth(const struct sess *sp, const struct vbe_conn *vc, int a) -{ - (void)sp; - (void)vc; - (void)a; -#if 0 - INCOMPL(); - struct backend *b; - - if (vc != NULL) { - CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC); - CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC); - b = vc->backend; - } - else { - CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC); - b = sp->backend; - } - AN(b->method); - if (b->method->updatehealth != NULL) - b->method->updatehealth(sp, vc, a); - CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC); -#endif -} Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-19 08:16:36 UTC (rev 3105) +++ trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-19 09:34:44 UTC (rev 3106) @@ -342,14 +342,11 @@ /* Deal with any message-body the request might have */ i = FetchReqBody(sp); if (i > 0) { - if (i > 1) - VBE_UpdateHealth(sp, vc, -1); VBE_ClosedFd(sp->wrk, vc); return (__LINE__); } if (WRK_Flush(w)) { - VBE_UpdateHealth(sp, vc, -1); VBE_ClosedFd(sp->wrk, vc); /* XXX: other cleanup ? */ return (__LINE__); @@ -364,14 +361,12 @@ while (i == 0); if (i < 0) { - VBE_UpdateHealth(sp, vc, -1); VBE_ClosedFd(sp->wrk, vc); /* XXX: other cleanup ? */ return (__LINE__); } if (http_DissectResponse(sp->wrk, htc, hp)) { - VBE_UpdateHealth(sp, vc, -2); VBE_ClosedFd(sp->wrk, vc); /* XXX: other cleanup ? */ return (__LINE__); @@ -404,7 +399,6 @@ } else if (http_GetHdr(hp, H_Transfer_Encoding, &b)) { /* XXX: AUGH! */ WSL(sp->wrk, SLT_Debug, vc->fd, "Invalid Transfer-Encoding"); - VBE_UpdateHealth(sp, vc, -3); VBE_ClosedFd(sp->wrk, vc); return (__LINE__); } else { @@ -425,7 +419,6 @@ VTAILQ_REMOVE(&sp->obj->store, st, list); STV_free(st); } - VBE_UpdateHealth(sp, vc, -4); VBE_ClosedFd(sp->wrk, vc); sp->obj->len = 0; return (__LINE__); @@ -448,8 +441,6 @@ if (http_GetHdr(hp, H_Connection, &b) && !strcasecmp(b, "close")) cls = 1; - VBE_UpdateHealth(sp, vc, http_GetStatus(sp->bereq->http)); - if (cls) VBE_ClosedFd(sp->wrk, vc); else From phk at projects.linpro.no Tue Aug 19 09:35:28 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 11:35:28 +0200 (CEST) Subject: r3107 - trunk/varnish-cache/lib/libvarnish Message-ID: <20080819093528.E60FD1EC0F9@projects.linpro.no> Author: phk Date: 2008-08-19 11:35:28 +0200 (Tue, 19 Aug 2008) New Revision: 3107 Modified: trunk/varnish-cache/lib/libvarnish/num.c Log: Make error strings static Modified: trunk/varnish-cache/lib/libvarnish/num.c =================================================================== --- trunk/varnish-cache/lib/libvarnish/num.c 2008-08-19 09:34:44 UTC (rev 3106) +++ trunk/varnish-cache/lib/libvarnish/num.c 2008-08-19 09:35:28 UTC (rev 3107) @@ -39,10 +39,10 @@ #include -const char err_miss_num[] = "Missing number"; -const char err_invalid_num[] = "Invalid number"; -const char err_abs_req[] = "Absolute number required"; -const char err_invalid_suff[] = "Invalid suffix"; +static const char err_miss_num[] = "Missing number"; +static const char err_invalid_num[] = "Invalid number"; +static const char err_abs_req[] = "Absolute number required"; +static const char err_invalid_suff[] = "Invalid suffix"; const char * str2bytes(const char *p, uintmax_t *r, uintmax_t rel) From phk at projects.linpro.no Tue Aug 19 09:38:46 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 11:38:46 +0200 (CEST) Subject: r3108 - trunk/varnish-cache/lib/libvcl Message-ID: <20080819093846.31D301EC11B@projects.linpro.no> Author: phk Date: 2008-08-19 11:38:46 +0200 (Tue, 19 Aug 2008) New Revision: 3108 Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c Log: Silence FlexeLint Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-19 09:35:28 UTC (rev 3107) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-19 09:38:46 UTC (rev 3108) @@ -434,6 +434,7 @@ if (threshold > window ) { vsb_printf(tl->sb, "Threshold can not be greater than window.\n"); + AN(t_threshold); vcc_ErrWhere(tl, t_threshold); AN(t_window); vcc_ErrWhere(tl, t_window); From phk at projects.linpro.no Tue Aug 19 19:33:39 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 21:33:39 +0200 (CEST) Subject: r3109 - trunk/varnish-cache/bin/varnishtest/tests Message-ID: <20080819193339.950091EC0F9@projects.linpro.no> Author: phk Date: 2008-08-19 21:33:39 +0200 (Tue, 19 Aug 2008) New Revision: 3109 Added: trunk/varnish-cache/bin/varnishtest/tests/r00292.vtc Log: Add a regression test for ticket 292 Added: trunk/varnish-cache/bin/varnishtest/tests/r00292.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/r00292.vtc (rev 0) +++ trunk/varnish-cache/bin/varnishtest/tests/r00292.vtc 2008-08-19 19:33:39 UTC (rev 3109) @@ -0,0 +1,39 @@ +# $Id$ +# +# This test checks that the ->hdf flag which tracks Connection: header +# deletes tracks the headers properly. + +test "Header deletion test" + +server s1 { + rxreq + expect req.url == "/foo" + expect req.http.hdr1 == "req.http.hdr1" + expect req.http.hdr2 == "2" + expect req.http.hdr3 == "req.http.hdr3" + expect req.http.hdr4 == "4" + expect req.http.hdr5 == "req.http.hdr5" + expect req.http.hdr6 == "6" + txresp -body "foobar" +} -start + +varnish v1 -vcl+backend { + + sub vcl_recv { + remove req.http.hdr1; + remove req.http.hdr5; + } +} -start + +client c1 { + txreq -url "/foo" \ + -hdr "Connection: hdr3" \ + -hdr "hdr1: 1" \ + -hdr "hdr2: 2" \ + -hdr "hdr3: 3" \ + -hdr "hdr4: 4" \ + -hdr "hdr5: 5" \ + -hdr "hdr6: 6" + rxresp +} -run + From phk at projects.linpro.no Tue Aug 19 19:34:54 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 21:34:54 +0200 (CEST) Subject: r3110 - trunk/varnish-cache/bin/varnishd Message-ID: <20080819193454.263C91EC200@projects.linpro.no> Author: phk Date: 2008-08-19 21:34:53 +0200 (Tue, 19 Aug 2008) New Revision: 3110 Modified: trunk/varnish-cache/bin/varnishd/cache_http.c Log: Fix ticket 292: Make sure the "deleted by Connection:" flag sticks with its header around. Found and nailed by: Adrian Otto Modified: trunk/varnish-cache/bin/varnishd/cache_http.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_http.c 2008-08-19 19:33:39 UTC (rev 3109) +++ trunk/varnish-cache/bin/varnishd/cache_http.c 2008-08-19 19:34:53 UTC (rev 3110) @@ -604,6 +604,7 @@ Tcheck(fm->hd[n]); if (to->nhd < HTTP_HDR_MAX) { to->hd[to->nhd] = fm->hd[n]; + to->hdf[to->nhd] = 0; to->nhd++; } else { VSL_stats->losthdr++; @@ -736,10 +737,12 @@ WSL(w, SLT_LostHeader, fd, "%s", string); to->hd[field].b = NULL; to->hd[field].e = NULL; + to->hdf[field] = 0; } else { memcpy(p, string, l + 1); to->hd[field].b = p; to->hd[field].e = p + l; + to->hdf[field] = 0; } } @@ -786,6 +789,7 @@ } else { to->hd[to->nhd].b = to->ws->f; to->hd[to->nhd].e = to->ws->f + n; + to->hdf[to->nhd] = 0; WS_Release(to->ws, n + 1); to->nhd++; } @@ -800,8 +804,10 @@ for (v = u = HTTP_HDR_FIRST; u < hp->nhd; u++) { if (http_IsHdr(&hp->hd[u], hdr)) continue; - if (v != u) + if (v != u) { memcpy(&hp->hd[v], &hp->hd[u], sizeof hp->hd[v]); + memcpy(&hp->hdf[v], &hp->hdf[u], sizeof hp->hdf[v]); + } v++; } hp->nhd = v; From phk at projects.linpro.no Tue Aug 19 20:47:44 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 22:47:44 +0200 (CEST) Subject: r3111 - trunk/varnish-cache/bin/varnishd Message-ID: <20080819204744.BFA0C1EC0F9@projects.linpro.no> Author: phk Date: 2008-08-19 22:47:44 +0200 (Tue, 19 Aug 2008) New Revision: 3111 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c Log: Don't call a zero byte response a "Good Recv". Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 19:34:53 UTC (rev 3110) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-19 20:47:44 UTC (rev 3111) @@ -221,6 +221,9 @@ return; } + if (rlen == 0) + return; + /* So we have a good receive ... */ t_now = TIM_real(); vt->last = t_now - t_start; From phk at projects.linpro.no Tue Aug 19 20:48:53 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 22:48:53 +0200 (CEST) Subject: r3112 - in trunk/varnish-cache/bin/varnishtest: . tests Message-ID: <20080819204853.063031EC202@projects.linpro.no> Author: phk Date: 2008-08-19 22:48:52 +0200 (Tue, 19 Aug 2008) New Revision: 3112 Added: trunk/varnish-cache/bin/varnishtest/tests/c00017.vtc Modified: trunk/varnish-cache/bin/varnishtest/vtc_http.c Log: Add a test-case that exercises the backend-polling a bit. It does not really check anything yet, because we lack the stats counters to test. Added: trunk/varnish-cache/bin/varnishtest/tests/c00017.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00017.vtc (rev 0) +++ trunk/varnish-cache/bin/varnishtest/tests/c00017.vtc 2008-08-19 20:48:52 UTC (rev 3112) @@ -0,0 +1,63 @@ +# $Id: c00016.vtc 3012 2008-07-24 12:22:35Z des $ + +test "Test Backend Polling" + +varnish v1 -vcl { + + backend foo { + .host = "127.0.0.1"; + .port = "9080"; + .probe = { + .timeout = 1 s; + .interval = 0.5 s; + } + } + +} -start + +server s1 { + rxreq + expect req.url == "/" + txresp -hdr "Bar: foo" -body "foobar" +} + +# Handle probes +server s1 -start -wait +server s1 -start -wait +server s1 -start -wait +server s1 -start -wait +server s1 -start -wait +server s1 -start -wait +server s1 -start -wait +server s1 -start -wait + +server s1 { + rxreq + expect req.url == "/" + txresp -status 404 -hdr "Bar: foo" -body "foobar" +} -start -wait + +server s1 { + rxreq + expect req.url == "/" + txresp -status 200 -hdr "Bar: foo" -body "foobar" +} -start -wait + +server s1 { + rxreq + expect req.url == "/" + txresp -proto "FROBOZ" -status 200 -hdr "Bar: foo" -body "foobar" +} -start -wait + +server s1 { +} -start -wait + +server s1 { + rxreq + expect req.url == "/" + delay 2 +} -start -wait + +delay 2 + +varnish v1 -cli "debug.health" Modified: trunk/varnish-cache/bin/varnishtest/vtc_http.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_http.c 2008-08-19 20:47:44 UTC (rev 3111) +++ trunk/varnish-cache/bin/varnishtest/vtc_http.c 2008-08-19 20:48:52 UTC (rev 3112) @@ -167,6 +167,15 @@ vtc_log(hp->vl, 4, "EXPECT %s (%s) %s %s (%s) match", av[0], lhs, av[1], av[2], rhs); } + } else if (!strcmp(cmp, "!=")) { + if (!strcmp(lhs, rhs)) { + vtc_log(hp->vl, 0, "EXPECT %s (%s) %s %s (%s) failed", + av[0], lhs, av[1], av[2], rhs); + exit (1); + } else { + vtc_log(hp->vl, 4, "EXPECT %s (%s) %s %s (%s) match", + av[0], lhs, av[1], av[2], rhs); + } } else { vtc_log(hp->vl, 0, "EXPECT %s (%s) %s %s (%s) not implemented", av[0], lhs, av[1], av[2], rhs); From phk at projects.linpro.no Tue Aug 19 21:34:16 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 19 Aug 2008 23:34:16 +0200 (CEST) Subject: r3113 - in trunk/varnish-cache: . bin/varnishd Message-ID: <20080819213416.8D3351EC200@projects.linpro.no> Author: phk Date: 2008-08-19 23:34:16 +0200 (Tue, 19 Aug 2008) New Revision: 3113 Added: trunk/varnish-cache/bin/varnishd/cache_acceptor_ports.c trunk/varnish-cache/bin/varnishd/storage_umem.c Modified: trunk/varnish-cache/bin/varnishd/Makefile.am trunk/varnish-cache/bin/varnishd/cache_acceptor.c trunk/varnish-cache/bin/varnishd/cache_acceptor.h trunk/varnish-cache/bin/varnishd/cache_acceptor_poll.c trunk/varnish-cache/bin/varnishd/cache_pool.c trunk/varnish-cache/bin/varnishd/tcp.c trunk/varnish-cache/bin/varnishd/varnishd.c trunk/varnish-cache/configure.ac Log: Integrate Solaris patches, with a bit of polishing. Don't look for umem on FreeBSD, which have dummy stub version for dtrace or ZFS compatibility. Generally restrict probes for Solaris specific stuff to when we run on solaris, no need to make configure slower than it is. Don't pretend we can get anywhere without poll(2) we use it for lots of things: Remove #if conditionals around poll-acceptor. Sort a couple of lists, before they get too unsorted. Submitted by: Theo Schlossnagle Modified: trunk/varnish-cache/bin/varnishd/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-19 21:34:16 UTC (rev 3113) @@ -9,8 +9,9 @@ varnishd_SOURCES = \ cache_acceptor.c \ cache_acceptor_epoll.c \ + cache_acceptor_kqueue.c \ cache_acceptor_poll.c \ - cache_acceptor_kqueue.c \ + cache_acceptor_ports.c \ cache_backend.c \ cache_backend_cfg.c \ cache_backend_poll.c \ @@ -27,19 +28,19 @@ cache_httpconn.c \ cache_main.c \ cache_panic.c \ + cache_pipe.c \ cache_pool.c \ - cache_pipe.c \ cache_response.c \ cache_session.c \ cache_vary.c \ cache_vcl.c \ cache_vrt.c \ cache_vrt_acl.c \ + cache_vrt_esi.c \ cache_vrt_re.c \ - cache_vrt_esi.c \ cache_ws.c \ + hash_classic.c \ hash_simple_list.c \ - hash_classic.c \ instance.c \ mgt_child.c \ mgt_cli.c \ @@ -51,15 +52,16 @@ storage_file.c \ storage_malloc.c \ storage_synth.c \ + storage_umem.c \ tcp.c \ varnishd.c noinst_HEADERS = \ acct_fields.h \ cache.h \ + cache_acceptor.h \ cache_backend.h \ cache_backend_poll.h \ - cache_acceptor.h \ common.h \ default_vcl.h \ hash_slinger.h \ Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_acceptor.c 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/cache_acceptor.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -46,7 +46,6 @@ #include #include -#include "config.h" #include "cli.h" #include "cli_priv.h" #include "shmlog.h" @@ -60,9 +59,10 @@ #if defined(HAVE_EPOLL_CTL) &acceptor_epoll, #endif -#if defined(HAVE_POLL) +#if defined(HAVE_PORT_CREATE) + &acceptor_ports, +#endif &acceptor_poll, -#endif NULL, }; Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_acceptor.h 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/cache_acceptor.h 2008-08-19 21:34:16 UTC (rev 3113) @@ -48,8 +48,10 @@ extern struct acceptor acceptor_kqueue; #endif -#if defined(HAVE_POLL) extern struct acceptor acceptor_poll; + +#if defined(HAVE_PORT_CREATE) +extern struct acceptor acceptor_ports; #endif /* vca_acceptor.c */ Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_acceptor_poll.c 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/cache_acceptor_poll.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -32,8 +32,6 @@ #include "config.h" -#if defined(HAVE_POLL) - #include #include #include @@ -167,5 +165,3 @@ .name = "poll", .init = vca_poll_init, }; - -#endif /* defined(HAVE_POLL) */ Added: trunk/varnish-cache/bin/varnishd/cache_acceptor_ports.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_acceptor_ports.c (rev 0) +++ trunk/varnish-cache/bin/varnishd/cache_acceptor_ports.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -0,0 +1,169 @@ +/*- + * Copyright (c) 2006 Verdens Gang AS + * Copyright (c) 2006 Linpro AS + * Copyright (c) 2007 OmniTI Computer Consulting, Inc. + * Copyright (c) 2007 Theo Schlossnagle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + * + * XXX: We need to pass sessions back into the event engine when they are + * reused. Not sure what the most efficient way is for that. For now + * write the session pointer to a pipe which the event engine monitors. + */ + +#include "config.h" +#if defined(HAVE_PORT_CREATE) + +#include +#include +#include +#include +#include + +#include + +#ifndef HAVE_CLOCK_GETTIME +#include "compat/clock_gettime.h" +#endif + +#include "shmlog.h" +#include "cache.h" +#include "cache_acceptor.h" + +#define MAX_EVENTS 256 +static pthread_t vca_ports_thread; +int solaris_dport = -1; + +static VTAILQ_HEAD(,sess) sesshead = VTAILQ_HEAD_INITIALIZER(sesshead); + +static void +vca_add(int fd, void *data) +{ + AZ(port_associate(solaris_dport, PORT_SOURCE_FD, fd, POLLIN | POLLERR | POLLPRI, data)); +} + +static void +vca_del(int fd) +{ + port_dissociate(solaris_dport, PORT_SOURCE_FD, fd); +} + +static void +vca_port_ev(port_event_t *ev) { + struct sess *sp; + if(ev->portev_source == PORT_SOURCE_USER) { + sp = ev->portev_user; + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); + assert(sp->fd >= 0); + AZ(sp->obj); + VTAILQ_INSERT_TAIL(&sesshead, sp, list); + vca_add(sp->fd, sp); + } else { + int i; + CAST_OBJ_NOTNULL(sp, ev->portev_user, SESS_MAGIC); + if(ev->portev_events & POLLERR) { + VTAILQ_REMOVE(&sesshead, sp, list); + vca_close_session(sp, "EOF"); + SES_Delete(sp); + return; + } + i = HTC_Rx(sp->htc); + if (i == 0) + return; + if (i > 0) { + VTAILQ_REMOVE(&sesshead, sp, list); + if (sp->fd != -1) + vca_del(sp->fd); + vca_handover(sp, i); + } + } + return; +} + +static void * +vca_main(void *arg) +{ + struct sess *sp; + + (void)arg; + + solaris_dport = port_create(); + assert(solaris_dport >= 0); + + while (1) { + port_event_t ev[MAX_EVENTS]; + int nevents, ei; + double deadline; + struct timespec ts; + ts.tv_sec = 0L; + ts.tv_nsec = 50L /*ms*/ * 1000L /*us*/ * 1000L /*ns*/; + nevents = 1; + if (port_getn(solaris_dport, ev, MAX_EVENTS, &nevents, &ts) == 0) { + for (ei=0; eisess_timeout; + for (;;) { + sp = VTAILQ_FIRST(&sesshead); + if (sp == NULL) + break; + if (sp->t_open > deadline) + break; + VTAILQ_REMOVE(&sesshead, sp, list); + if(sp->fd != -1) + vca_del(sp->fd); + vca_close_session(sp, "timeout"); + SES_Delete(sp); + } + } +} + +static void +vca_ports_pass(struct sess *sp) +{ + int r; + while((r = port_send(solaris_dport, 0, sp)) == -1 && + errno == EAGAIN); + AZ(r); +} + +/*--------------------------------------------------------------------*/ + +static void +vca_ports_init(void) +{ + + AZ(pthread_create(&vca_ports_thread, NULL, vca_main, NULL)); +} + +struct acceptor acceptor_ports = { + .name = "ports", + .init = vca_ports_init, + .pass = vca_ports_pass +}; + +#endif /* defined(HAVE_PORT_CREATE) */ Modified: trunk/varnish-cache/bin/varnishd/cache_pool.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_pool.c 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/cache_pool.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -52,6 +52,8 @@ #include #elif defined(__linux__) #include +#elif defined(__sun) +#include #else #error Unknown sendfile() implementation #endif @@ -191,7 +193,38 @@ sendfile(*w->wfd, fd, &off, len) != len) w->werr++; } while (0); +#elif defined(__sun) +#ifdef HAVE_SENDFILEV + do { + sendfilevec_t svvec[HTTP_HDR_MAX * 2 + 1]; + size_t xferred = 0, expected = 0; + int i; + for (i = 0; i < w->niov; i++) { + svvec[i].sfv_fd = SFV_FD_SELF; + svvec[i].sfv_flag = 0; + svvec[i].sfv_off = (off_t) w->iov[i].iov_base; + svvec[i].sfv_len = w->iov[i].iov_len; + expected += svvec[i].sfv_len; + } + svvec[i].sfv_fd = fd; + svvec[i].sfv_flag = 0; + svvec[i].sfv_off = off; + svvec[i].sfv_len = len; + expected += svvec[i].sfv_len; + if (sendfilev(*w->wfd, svvec, i, &xferred) == -1 || + xferred != expected) + w->werr++; + w->liov = 0; + w->niov = 0; + } while (0); #else + do { + if (WRK_Flush(w) == 0 && + sendfile(*w->wfd, fd, &off, len) != len) + w->werr++; + } while (0); +#endif +#else #error Unknown sendfile() implementation #endif } Added: trunk/varnish-cache/bin/varnishd/storage_umem.c =================================================================== --- trunk/varnish-cache/bin/varnishd/storage_umem.c (rev 0) +++ trunk/varnish-cache/bin/varnishd/storage_umem.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -0,0 +1,173 @@ +/*- + * Copyright (c) 2006 Verdens Gang AS + * Copyright (c) 2006-2008 Linpro AS + * All rights reserved. + * + * Author: Poul-Henning Kamp + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: storage_umem.c 3036 2008-07-31 09:24:25Z phk $ + * + * Storage method based on umem_alloc(3MALLOC) + */ + +#include "config.h" + +#ifdef HAVE_UMEM_H + +#include + +#include +#include +#include + +#include + +#include "config.h" +#include "shmlog.h" +#include "cache.h" +#include "stevedore.h" + +static size_t smu_max = SIZE_MAX; +static MTX smu_mtx; + +struct smu { + struct storage s; + size_t sz; +}; + +static struct storage * +smu_alloc(struct stevedore *st, size_t size) +{ + struct smu *smu; + + LOCK(&smu_mtx); + VSL_stats->sma_nreq++; + if (VSL_stats->sma_nbytes + size > smu_max) + size = 0; + else { + VSL_stats->sma_nobj++; + VSL_stats->sma_nbytes += size; + VSL_stats->sma_balloc += size; + } + UNLOCK(&smu_mtx); + + if (size == 0) + return (NULL); + + smu = umem_zalloc(sizeof *smu, UMEM_DEFAULT); + if (smu == NULL) + return (NULL); + smu->sz = size; + smu->s.priv = smu; + smu->s.ptr = umem_alloc(size, UMEM_DEFAULT); + XXXAN(smu->s.ptr); + smu->s.len = 0; + smu->s.space = size; + smu->s.fd = -1; + smu->s.stevedore = st; + smu->s.magic = STORAGE_MAGIC; + return (&smu->s); +} + +/*lint -e{818} not const-able */ +static void +smu_free(struct storage *s) +{ + struct smu *smu; + + CHECK_OBJ_NOTNULL(s, STORAGE_MAGIC); + smu = s->priv; + assert(smu->sz == smu->s.space); + LOCK(&smu_mtx); + VSL_stats->sma_nobj--; + VSL_stats->sma_nbytes -= smu->sz; + VSL_stats->sma_bfree += smu->sz; + UNLOCK(&smu_mtx); + umem_free(smu->s.ptr, smu->s.space); + umem_free(smu, sizeof *smu); +} + +static void +smu_trim(const struct storage *s, size_t size) +{ + struct smu *smu; + void *p; + + CHECK_OBJ_NOTNULL(s, STORAGE_MAGIC); + smu = s->priv; + assert(smu->sz == smu->s.space); + if ((p = umem_alloc(size, UMEM_DEFAULT)) != NULL) { + memcpy(p, smu->s.ptr, size); + umem_free(smu->s.ptr, smu->s.space); + LOCK(&smu_mtx); + VSL_stats->sma_nbytes -= (smu->sz - size); + VSL_stats->sma_bfree += smu->sz - size; + smu->sz = size; + UNLOCK(&smu_mtx); + smu->s.ptr = p; + smu->s.space = size; + } +} + +static void +smu_init(struct stevedore *parent, int ac, char * const *av) +{ + const char *e; + uintmax_t u; + + (void)parent; + + AZ(av[ac]); + if (ac > 1) + ARGV_ERR("(-sumem) too many arguments\n"); + + if (ac == 0 || *av[0] == '\0') + return; + + e = str2bytes(av[0], &u, 0); + if (e != NULL) + ARGV_ERR("(-sumem) size \"%s\": %s\n", av[0], e); + if ((u != (uintmax_t)(size_t)u)) + ARGV_ERR("(-sumem) size \"%s\": too big\n", av[0]); + smu_max = u; +} + +static void +smu_open(const struct stevedore *st) +{ + (void)st; + AZ(pthread_mutex_init(&smu_mtx, NULL)); +} + +struct stevedore smu_stevedore = { + .magic = STEVEDORE_MAGIC, + .name = "umem", + .init = smu_init, + .open = smu_open, + .alloc = smu_alloc, + .free = smu_free, + .trim = smu_trim, +}; + +#endif /* HAVE_UMEM_H */ Modified: trunk/varnish-cache/bin/varnishd/tcp.c =================================================================== --- trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -38,6 +38,9 @@ #include #include +#ifdef HAVE_SYS_FILIO_H +#include +#endif #include #include #include Modified: trunk/varnish-cache/bin/varnishd/varnishd.c =================================================================== --- trunk/varnish-cache/bin/varnishd/varnishd.c 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/bin/varnishd/varnishd.c 2008-08-19 21:34:16 UTC (rev 3113) @@ -113,10 +113,16 @@ /*--------------------------------------------------------------------*/ extern struct stevedore sma_stevedore; extern struct stevedore smf_stevedore; +#ifdef HAVE_LIBUMEM +extern struct stevedore smu_stevedore; +#endif static struct choice stv_choice[] = { { "file", &smf_stevedore }, { "malloc", &sma_stevedore }, +#ifdef HAVE_LIBUMEM + { "umem", &smu_stevedore }, +#endif { NULL, NULL } }; @@ -214,6 +220,9 @@ fprintf(stderr, FMT, "-s kind[,storageoptions]", "Backend storage specification"); fprintf(stderr, FMT, "", " -s malloc"); +#ifdef HAVE_LIBUMEM + fprintf(stderr, FMT, "", " -s umem"); +#endif fprintf(stderr, FMT, "", " -s file [default: use /tmp]"); fprintf(stderr, FMT, "", " -s file,"); fprintf(stderr, FMT, "", " -s file,,"); Modified: trunk/varnish-cache/configure.ac =================================================================== --- trunk/varnish-cache/configure.ac 2008-08-19 20:48:52 UTC (rev 3112) +++ trunk/varnish-cache/configure.ac 2008-08-19 21:34:16 UTC (rev 3113) @@ -129,6 +129,20 @@ AC_DEFINE([SENDFILE_WORKS], [1], [Define if SENDFILE works]) fi ;; +*-*-solaris*) + AC_CHECK_HEADERS([sys/filio.h]) + AC_CHECK_LIB(sendfile, sendfile) + AC_CHECK_LIB(umem, malloc) + AC_CHECK_HEADERS([umem.h]) + + if test "$ac_cv_lib_sendfile_sendfile" = yes; then + save_LIBS="${LIBS}" + LIBS="${NET_LIBS}" + AC_CHECK_FUNCS([sendfile]) + AC_CHECK_FUNCS([sendfilev]) + LIBS="${save_LIBS}" + fi + ;; *) AC_MSG_WARN([won't look for sendfile() on $host]) ;; @@ -191,25 +205,19 @@ ac_cv_func_epoll_ctl=no fi -# --enable-poll -AC_ARG_ENABLE(poll, - AS_HELP_STRING([--enable-poll], - [use poll if available (default is YES)]), +# --enable-ports +AC_ARG_ENABLE(ports, + AS_HELP_STRING([--enable-ports], + [use ports if available (default is YES)]), , - [enable_poll=yes]) + [enable_ports=yes]) -if test "$enable_poll" = yes; then - AC_CHECK_FUNCS([poll]) +if test "$enable_ports" = yes; then + AC_CHECK_FUNCS([port_create]) else - ac_cv_func_poll=no + ac_cv_func_port_create=no fi -if test "$ac_cv_func_kqueue" != yes && - test "$ac_cv_func_epoll_ctl" != yes && - test "$ac_cv_func_poll" != yes; then - AC_MSG_ERROR([no usable acceptor mechanism]) -fi - # Solaris defines SO_{RCV,SND}TIMEO, but does not implement them. # Varnish will build and run without these, but connections will not # time out, which may leave Varnish vulnerable to denail-of-service From tfheen at projects.linpro.no Wed Aug 20 08:21:05 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 20 Aug 2008 10:21:05 +0200 (CEST) Subject: r3114 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080820082105.C80771EC0F9@projects.linpro.no> Author: tfheen Date: 2008-08-20 10:21:05 +0200 (Wed, 20 Aug 2008) New Revision: 3114 Modified: trunk/varnish-cache/bin/varnishtest/Makefile.am Log: Make make check run test suite Modified: trunk/varnish-cache/bin/varnishtest/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishtest/Makefile.am 2008-08-19 21:34:16 UTC (rev 3113) +++ trunk/varnish-cache/bin/varnishtest/Makefile.am 2008-08-20 08:21:05 UTC (rev 3114) @@ -1,5 +1,8 @@ # $Id$ +TESTS_ENVIRONMENT = ./varnishtest +TESTS = $(srcdir)/tests/*.vtc + INCLUDES = -I$(top_srcdir)/include bin_PROGRAMS = varnishtest From tfheen at projects.linpro.no Wed Aug 20 08:58:20 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 20 Aug 2008 10:58:20 +0200 (CEST) Subject: r3115 - trunk/varnish-cache/bin/varnishtest/tests Message-ID: <20080820085820.7EB961EC202@projects.linpro.no> Author: tfheen Date: 2008-08-20 10:58:20 +0200 (Wed, 20 Aug 2008) New Revision: 3115 Modified: trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc Log: Be explicit about connecting to :9080 When testing synthetic error page caching, make sure we connect to :9080 rather than the default :80 since the machine might well have an httpd running already. Modified: trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc 2008-08-20 08:21:05 UTC (rev 3114) +++ trunk/varnish-cache/bin/varnishtest/tests/b00015.vtc 2008-08-20 08:58:20 UTC (rev 3115) @@ -7,6 +7,7 @@ varnish v1 -vcl { backend foo { .host = "127.0.0.2"; + .port = "9080"; } } -start From tfheen at projects.linpro.no Wed Aug 20 09:58:11 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Wed, 20 Aug 2008 11:58:11 +0200 (CEST) Subject: r3116 - trunk/varnish-cache/bin/varnishtest/tests Message-ID: <20080820095811.BFDEF1EC0F9@projects.linpro.no> Author: tfheen Date: 2008-08-20 11:58:11 +0200 (Wed, 20 Aug 2008) New Revision: 3116 Modified: trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc Log: Use invalid address in binding test IANA has reserved the 198.18.0.0/24 network for Network Interconnect Device Benchmark Testing which vaguely fits what we are doing. Use that instead of 127.0.0.2 since the latter works fine to bind to on Linux (at least). Modified: trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc 2008-08-20 08:58:20 UTC (rev 3115) +++ trunk/varnish-cache/bin/varnishtest/tests/c00003.vtc 2008-08-20 09:58:11 UTC (rev 3116) @@ -9,7 +9,9 @@ txresp -hdr "Connection: close" -body "012345\n" } -start -varnish v1 -cliok "param.set listen_address 127.0.0.2:9082" +# 198.18.1.1 is IANA-reserved for Network Interconnect Device +# Benchmark Testing +varnish v1 -cliok "param.set listen_address 198.18.1.1:9082" varnish v1 -vcl+backend {} -clierr 300 start varnish v1 -cliok "param.set listen_address :9081,127.0.0.2:9082" varnish v1 -start From phk at projects.linpro.no Thu Aug 21 08:14:40 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 21 Aug 2008 10:14:40 +0200 (CEST) Subject: r3117 - trunk/varnish-cache/bin/varnishd Message-ID: <20080821081440.855D11EC10B@projects.linpro.no> Author: phk Date: 2008-08-21 10:14:40 +0200 (Thu, 21 Aug 2008) New Revision: 3117 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c Log: Polish Modified: trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2008-08-20 09:58:11 UTC (rev 3116) +++ trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2008-08-21 08:14:40 UTC (rev 3117) @@ -76,13 +76,14 @@ static void VBE_Nuke(struct backend *b) { + + ASSERT_CLI(); VTAILQ_REMOVE(&backends, b, list); free(b->ident); free(b->hosthdr); free(b->ipv4); free(b->ipv6); - b->magic = 0; - free(b); + FREE_OBJ(b); VSL_stats->n_backend--; } From phk at projects.linpro.no Thu Aug 21 08:37:37 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 21 Aug 2008 10:37:37 +0200 (CEST) Subject: r3118 - trunk/varnish-cache/bin/varnishd Message-ID: <20080821083737.981001EC0F9@projects.linpro.no> Author: phk Date: 2008-08-21 10:37:37 +0200 (Thu, 21 Aug 2008) New Revision: 3118 Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/cache_center.c trunk/varnish-cache/bin/varnishd/cache_fetch.c trunk/varnish-cache/bin/varnishd/cache_http.c Log: Move selection of backend and creation of default Host: header until we actually need to get a filedescriptor to the backend. This also makes it evident for vcl_pass{}, vcl_pipe{} and vcl_miss{} if the client sent a Host: header or not. Previously these functions saw the default Host: header. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-21 08:14:40 UTC (rev 3117) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-21 08:37:37 UTC (rev 3118) @@ -412,7 +412,7 @@ /* cache_backend.c */ -struct vbe_conn *VBE_GetFd(const struct sess *sp); +struct vbe_conn *VBE_GetFd(struct sess *sp); void VBE_ClosedFd(struct worker *w, struct vbe_conn *vc); void VBE_RecycleFd(struct worker *w, struct vbe_conn *vc); struct bereq * VBE_new_bereq(void); Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-21 08:14:40 UTC (rev 3117) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-21 08:37:37 UTC (rev 3118) @@ -267,13 +267,16 @@ /*--------------------------------------------------------------------*/ struct vbe_conn * -VBE_GetFd(const struct sess *sp) +VBE_GetFd(struct sess *sp) { struct backend *bp; struct vbe_conn *vc; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); + + VBE_SelectBackend(sp); bp = sp->backend; + CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); /* first look for vbe_conn's we can recycle */ while (1) { Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-21 08:14:40 UTC (rev 3117) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-21 08:37:37 UTC (rev 3118) @@ -686,7 +686,6 @@ CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); - VBE_SelectBackend(sp); http_FilterHeader(sp, HTTPH_R_FETCH); VCL_miss_method(sp); switch(sp->handling) { @@ -761,7 +760,6 @@ CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); AZ(sp->obj); - VBE_SelectBackend(sp); http_FilterHeader(sp, HTTPH_R_PASS); VCL_pass_method(sp); @@ -813,7 +811,6 @@ CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); sp->wrk->acct.pipe++; - VBE_SelectBackend(sp); http_FilterHeader(sp, HTTPH_R_PIPE); VCL_pipe_method(sp); Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-21 08:14:40 UTC (rev 3117) +++ trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-21 08:37:37 UTC (rev 3118) @@ -335,6 +335,15 @@ vc = VBE_GetFd(sp); if (vc == NULL) return (__LINE__); + + /* + * Now that we know our backend, we can set a default Host: + * header if one is necessary. + * XXX: This possibly ought to go into the default VCL + */ + if (!http_GetHdr(hp, H_Host, &b)) + VBE_AddHostHeader(sp); + TCP_blocking(vc->fd); /* XXX: we should timeout instead */ WRK_Reset(w, &vc->fd); http_Write(w, hp, 0); /* XXX: stats ? */ Modified: trunk/varnish-cache/bin/varnishd/cache_http.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_http.c 2008-08-21 08:14:40 UTC (rev 3117) +++ trunk/varnish-cache/bin/varnishd/cache_http.c 2008-08-21 08:37:37 UTC (rev 3118) @@ -642,7 +642,6 @@ { struct bereq *bereq; struct http *hp; - char *b; bereq = VBE_new_bereq(); AN(bereq); @@ -656,10 +655,6 @@ "X-Forwarded-For: %s", sp->addr); sp->bereq = bereq; - - /* XXX: This possibly ought to go into the default VCL */ - if (!http_GetHdr(hp, H_Host, &b)) - VBE_AddHostHeader(sp); } /*-------------------------------------------------------------------- From phk at projects.linpro.no Thu Aug 21 08:48:30 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 21 Aug 2008 10:48:30 +0200 (CEST) Subject: r3119 - trunk/varnish-cache/bin/varnishd Message-ID: <20080821084830.0FE881EC10B@projects.linpro.no> Author: phk Date: 2008-08-21 10:48:29 +0200 (Thu, 21 Aug 2008) New Revision: 3119 Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend.h trunk/varnish-cache/bin/varnishd/cache_center.c trunk/varnish-cache/bin/varnishd/cache_dir_random.c trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c trunk/varnish-cache/bin/varnishd/cache_dir_simple.c trunk/varnish-cache/bin/varnishd/cache_fetch.c Log: Make the director opaque outside the backend code. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-21 08:48:29 UTC (rev 3119) @@ -76,6 +76,7 @@ struct cli; struct vsb; struct sess; +struct director; struct object; struct objhead; struct objexp; @@ -372,23 +373,7 @@ const char **hashptr; }; -/* ------------------------------------------------------------------- - * A director is a piece of code which selects one of possibly multiple - * backends to use. - */ -typedef struct backend *vdi_choose_f(struct sess *sp); -typedef void vdi_fini_f(struct director *d); - -struct director { - unsigned magic; -#define DIRECTOR_MAGIC 0x3336351d - const char *name; - vdi_choose_f *choose; - vdi_fini_f *fini; - void *priv; -}; - /* -------------------------------------------------------------------*/ /* Backend connection */ Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-21 08:48:29 UTC (rev 3119) @@ -71,6 +71,23 @@ struct vbp_target; struct vrt_backend_probe; +/* ------------------------------------------------------------------- + * A director is a piece of code which selects one of possibly multiple + * backends to use. + */ + +typedef struct backend *vdi_choose_f(struct sess *sp); +typedef void vdi_fini_f(struct director *d); + +struct director { + unsigned magic; +#define DIRECTOR_MAGIC 0x3336351d + const char *name; + vdi_choose_f *choose; + vdi_fini_f *fini; + void *priv; +}; + /* Backend indstance */ struct backend { unsigned magic; Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-21 08:48:29 UTC (rev 3119) @@ -388,12 +388,11 @@ CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); AN(sp->bereq); - CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); + AN(sp->director); i = Fetch(sp); - CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); + AN(sp->director); if (i) { -VSL(SLT_Debug, sp->fd, "Fetch = %d", i); sp->err_code = 503; sp->step = STP_ERROR; VBE_free_bereq(sp->bereq); @@ -854,7 +853,7 @@ /* By default we use the first backend */ AZ(sp->director); sp->director = sp->vcl->director[0]; - CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); + AN(sp->director); VCL_recv_method(sp); @@ -996,7 +995,6 @@ CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); CHECK_OBJ_ORNULL(w->nobj, OBJECT_MAGIC); CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC); - CHECK_OBJ_ORNULL(sp->director, DIRECTOR_MAGIC); switch (sp->step) { #define STEP(l,u) \ Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-21 08:48:29 UTC (rev 3119) @@ -43,6 +43,7 @@ #include "shmlog.h" #include "cache.h" +#include "cache_backend.h" #include "vrt.h" /*--------------------------------------------------------------------*/ Modified: trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c 2008-08-21 08:48:29 UTC (rev 3119) @@ -41,6 +41,7 @@ #include "shmlog.h" #include "cache.h" +#include "cache_backend.h" #include "vrt.h" /*--------------------------------------------------------------------*/ Modified: trunk/varnish-cache/bin/varnishd/cache_dir_simple.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_simple.c 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache_dir_simple.c 2008-08-21 08:48:29 UTC (rev 3119) @@ -43,6 +43,7 @@ #include "shmlog.h" #include "cache.h" +#include "cache_backend.h" #include "vrt.h" /*--------------------------------------------------------------------*/ Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-21 08:37:37 UTC (rev 3118) +++ trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-21 08:48:29 UTC (rev 3119) @@ -321,7 +321,7 @@ CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(sp->bereq, BEREQ_MAGIC); - CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); + AN(sp->director); assert(sp->obj->busy != 0); w = sp->wrk; bereq = sp->bereq; From phk at projects.linpro.no Thu Aug 21 09:04:24 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 21 Aug 2008 11:04:24 +0200 (CEST) Subject: r3120 - trunk/varnish-cache/bin/varnishd Message-ID: <20080821090424.7D8091EC0F9@projects.linpro.no> Author: phk Date: 2008-08-21 11:04:24 +0200 (Thu, 21 Aug 2008) New Revision: 3120 Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/cache_backend.h trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c Log: Give the directors another method which returns not the backend to connect to, but a connection to a backend, this makes it possible for the directors to choose another backend, if connection to the first backend fails. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-21 08:48:29 UTC (rev 3119) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-21 09:04:24 UTC (rev 3120) @@ -408,7 +408,6 @@ /* cache_backend_cfg.c */ void VBE_Init(void); void VBE_DropRef(struct backend *); -void VBE_SelectBackend(struct sess *sp); struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb); /* cache_backend_poll.c */ Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-21 08:48:29 UTC (rev 3119) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-21 09:04:24 UTC (rev 3120) @@ -264,17 +264,37 @@ return (s); } -/*--------------------------------------------------------------------*/ +/*-------------------------------------------------------------------- + * Get a connection to whatever backend the director think this session + * should contact. + */ struct vbe_conn * VBE_GetFd(struct sess *sp) { + + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); + + CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); + + if (sp->director->getfd != NULL) + return (sp->director->getfd(sp)); + + sp->backend = sp->director->choose(sp); + CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC); + return (VBE_GetVbe(sp)); +} + +/*-------------------------------------------------------------------- + * Get a connection to a particular backend. + */ + +struct vbe_conn * +VBE_GetVbe(const struct sess *sp) +{ struct backend *bp; struct vbe_conn *vc; - CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - - VBE_SelectBackend(sp); bp = sp->backend; CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-21 08:48:29 UTC (rev 3119) +++ trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-21 09:04:24 UTC (rev 3120) @@ -69,13 +69,15 @@ */ struct vbp_target; +struct vbe_conn; struct vrt_backend_probe; -/* ------------------------------------------------------------------- +/*-------------------------------------------------------------------- * A director is a piece of code which selects one of possibly multiple * backends to use. */ +typedef struct vbe_conn *vdi_getfd_f(struct sess *sp); typedef struct backend *vdi_choose_f(struct sess *sp); typedef void vdi_fini_f(struct director *d); @@ -84,11 +86,15 @@ #define DIRECTOR_MAGIC 0x3336351d const char *name; vdi_choose_f *choose; + vdi_getfd_f *getfd; vdi_fini_f *fini; void *priv; }; -/* Backend indstance */ +/*-------------------------------------------------------------------- + * An instance of a backend from a VCL program. + */ + struct backend { unsigned magic; #define BACKEND_MAGIC 0x64c4c7c6 @@ -117,6 +123,7 @@ /* cache_backend.c */ void VBE_ReleaseConn(struct vbe_conn *vc); +struct vbe_conn *VBE_GetVbe(const struct sess *sp); /* cache_backend_cfg.c */ extern MTX VBE_mtx; Modified: trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2008-08-21 08:48:29 UTC (rev 3119) +++ trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2008-08-21 09:04:24 UTC (rev 3120) @@ -56,20 +56,7 @@ */ static VTAILQ_HEAD(, backend) backends = VTAILQ_HEAD_INITIALIZER(backends); -/*--------------------------------------------------------------------*/ -void -VBE_SelectBackend(struct sess *sp) -{ - struct backend *bp; - - CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); - bp = sp->director->choose(sp); - CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); - sp->backend = bp; -} - /*-------------------------------------------------------------------- */ From ingvar at projects.linpro.no Mon Aug 25 21:53:35 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Mon, 25 Aug 2008 23:53:35 +0200 (CEST) Subject: r3121 - trunk/varnish-cache/redhat Message-ID: <20080825215335.8A0A11EC10B@projects.linpro.no> Author: ingvar Date: 2008-08-25 23:53:34 +0200 (Mon, 25 Aug 2008) New Revision: 3121 Modified: trunk/varnish-cache/redhat/README.redhat Log: A typo, and newline at the end Modified: trunk/varnish-cache/redhat/README.redhat =================================================================== --- trunk/varnish-cache/redhat/README.redhat 2008-08-21 09:04:24 UTC (rev 3120) +++ trunk/varnish-cache/redhat/README.redhat 2008-08-25 21:53:34 UTC (rev 3121) @@ -23,7 +23,7 @@ port to port 80, and your webserver to 8080 or similar. -Builing a RPM package from SVN +Building a RPM package from SVN ============================== You may build the package from a svn checkout. Follow the instructions at http://varnish.projects.linpro.no/wiki/Repository to get the @@ -50,3 +50,4 @@ do something like this: rpmbuild --define "dist el4" --rebuild /path/to/varnish-1.1.2.src.rpm + From ingvar at projects.linpro.no Mon Aug 25 21:56:11 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Mon, 25 Aug 2008 23:56:11 +0200 (CEST) Subject: r3122 - trunk/varnish-cache/redhat Message-ID: <20080825215611.E9EA61EC1FF@projects.linpro.no> Author: ingvar Date: 2008-08-25 23:56:11 +0200 (Mon, 25 Aug 2008) New Revision: 3122 Modified: trunk/varnish-cache/redhat/varnish.initrc Log: Patched up Red Hat init script to comply with newer Fedora standards Modified: trunk/varnish-cache/redhat/varnish.initrc =================================================================== --- trunk/varnish-cache/redhat/varnish.initrc 2008-08-25 21:53:34 UTC (rev 3121) +++ trunk/varnish-cache/redhat/varnish.initrc 2008-08-25 21:56:11 UTC (rev 3122) @@ -1,92 +1,143 @@ #! /bin/sh # -# varnish Control the varnish HTTP accelerator +# varnish Control the varnish HTTP accelerator # # chkconfig: - 90 10 -# description: HTTP accelerator +# description: Varnish is a high-perfomance HTTP accelerator # processname: varnishd -# config: /etc/varnish/vcl.conf +# config: /etc/sysconfig/varnish # pidfile: /var/run/varnish/varnishd.pid +### BEGIN INIT INFO +# Provides: varnish +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Should-Start: $syslog +# Short-Description: start and stop varnishd +# Description: Varnish is a high-perfomance HTTP accelerator +### END INIT INFO + # Source function library. . /etc/init.d/functions -RETVAL=0 -PROCNAME=varnishd -PIDFILE=/var/run/varnish.pid -LOCKFILE=/var/lock/subsys/varnish +retval=0 +pidfile=/var/run/varnish.pid +lockfile=/var/lock/subsys/varnish +exec="/usr/sbin/varnishd" +prog="varnishd" +config="/etc/sysconfig/varnish" + # Include varnish defaults -. /etc/sysconfig/varnish +[ -e /etc/sysconfig/varnish ] && . /etc/sysconfig/varnish -DAEMON="/usr/sbin/varnishd" +lockfile=/var/lock/subsys/$prog -mkdir -p /var/run/varnish 2>/dev/null +start() { -# Open files (usually 1024, which is way too small for varnish) -ulimit -n ${NFILES:-131072} + if [ ! -x $exec ] + then + echo $exec not found + exit 5 + fi -# Varnish wants to lock shared memory log in memory. -ulimit -l ${MEMLOCK:-82000} - -# See how we were called. -case "$1" in - start) + if [ ! -f $config ] + then + echo $config not found + exit 6 + fi echo -n "Starting varnish HTTP accelerator: " + # Open files (usually 1024, which is way too small for varnish) + ulimit -n ${NFILES:-131072} + + # Varnish wants to lock shared memory log in memory. + ulimit -l ${MEMLOCK:-82000} + # $DAEMON_OPTS is set in /etc/sysconfig/varnish. At least, one # has to set up a backend, or /tmp will be used, which is a bad idea. if [ "$DAEMON_OPTS" = "" ]; then - echo "\$DAEMON_OPTS empty." - echo -n "Please put configuration options in /etc/sysconfig/varnish" - echo_failure + echo "\$DAEMON_OPTS empty." + echo -n "Please put configuration options in $config" + return 6 else - daemon ${DAEMON} "$DAEMON_OPTS" -P ${PIDFILE} > /dev/null 2>&1 - sleep 1 - pkill -0 $PROCNAME - RETVAL=$? - if [ $RETVAL -eq 0 ] + # Varnish always gives output on STDOUT + daemon $exec "$DAEMON_OPTS" -P $pidfile > /dev/null 2>&1 + retval=$? + if [ $retval -eq 0 ] then - echo_success - touch $LOCKFILE - else - echo_failure - fi + touch $lockfile + echo_success + echo + else + echo_failure + fi + return $retval fi +} + +stop() { + echo -n "Stopping $prog: " + killproc $prog + retval=$? echo - ;; - stop) - echo -n "Stopping varnish HTTP accelerator: " - killproc $DAEMON - RETVAL=$? - if [ $RETVAL -eq 0 ] - then - echo_success - rm -f $LOCKFILE $PIDFILE - else - echo_failure - fi - echo - ;; - status) - status $PROCNAME - RETVAL=$? - ;; - restart|reload) - $0 stop - $0 start - RETVAL=$? - ;; - condrestart) - if [ -f $PIDFILE ]; then - $0 stop - $0 start - RETVAL=$? - fi - ;; - *) - echo "Usage: $0 {start|stop|status|restart|condrestart}" - exit 1 + [ $retval -eq 0 ] && rm -f $lockfile + return $retval +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + status $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + +# See how we were called. +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + + exit 2 esac -exit $RETVAL +exit $? + From ingvar at projects.linpro.no Mon Aug 25 23:01:54 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Tue, 26 Aug 2008 01:01:54 +0200 (CEST) Subject: r3123 - trunk/varnish-cache/redhat Message-ID: <20080825230154.92DC71EC209@projects.linpro.no> Author: ingvar Date: 2008-08-26 01:01:54 +0200 (Tue, 26 Aug 2008) New Revision: 3123 Modified: trunk/varnish-cache/redhat/varnish.initrc Log: correct pidfile option to daemon and killproc functions Modified: trunk/varnish-cache/redhat/varnish.initrc =================================================================== --- trunk/varnish-cache/redhat/varnish.initrc 2008-08-25 21:56:11 UTC (rev 3122) +++ trunk/varnish-cache/redhat/varnish.initrc 2008-08-25 23:01:54 UTC (rev 3123) @@ -62,7 +62,7 @@ return 6 else # Varnish always gives output on STDOUT - daemon $exec "$DAEMON_OPTS" -P $pidfile > /dev/null 2>&1 + daemon $exec "$DAEMON_OPTS" --pidfile $pidfile > /dev/null 2>&1 retval=$? if [ $retval -eq 0 ] then @@ -99,7 +99,7 @@ } rh_status() { - status $prog + status -p $pidfile $prog } rh_status_q() { From ingvar at projects.linpro.no Mon Aug 25 23:02:47 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Tue, 26 Aug 2008 01:02:47 +0200 (CEST) Subject: r3124 - trunk/varnish-cache/redhat Message-ID: <20080825230247.DEEE61EC1FF@projects.linpro.no> Author: ingvar Date: 2008-08-26 01:02:47 +0200 (Tue, 26 Aug 2008) New Revision: 3124 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Fixing up init script according to newer Fedora standards Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-25 23:01:54 UTC (rev 3123) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-25 23:02:47 UTC (rev 3124) @@ -1,23 +1,25 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: 0.2.tp2 +Release: 0.3.20080826svn3124%{?dist} License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ -#Source0: http://downloads.sourceforge.net/varnish/varnish-%{version}.tar.gz -Source0: http://varnish.projects.linpro.no/static/varnish-%{version}-tp2.tar.gz +Source0: http://downloads.sourceforge.net/varnish/varnish-%{version}.tar.gz +#Source0: http://varnish.projects.linpro.no/static/varnish-cache.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -# The svn sources needs autoconf, automake and libtoolto generate a suitable +# The svn sources needs autoconf, automake and libtool to generate a suitable # configure script. Release tarballs would not need this #BuildRequires: automake autoconf libtool BuildRequires: ncurses-devel libxslt groff Requires: kernel >= 2.6.0 varnish-libs = %{version}-%{release} Requires: logrotate +Requires: ncurses Requires(pre): shadow-utils Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig Requires(preun): /sbin/service +Requires(preun): initscripts # Varnish actually needs gcc installed to work. It uses the C compiler # at runtime to compile the VCL configuration files. This is by design. @@ -32,7 +34,6 @@ Summary: Libraries for %{name} Group: System Environment/Libraries BuildRequires: ncurses-devel -#Requires: ncurses #Obsoletes: libvarnish1 %description libs @@ -49,12 +50,23 @@ Development files for %{name}-libs Varnish is a high-performance HTTP accelerator +#%package libs-static +#Summary: Files for static linking of %{name} library functions +#Group: System Environment/Libraries +#BuildRequires: ncurses-devel +#Requires: kernel >= 2.6.0 varnish-libs-devel = %{version}-%{release} +# +#%description libs-static +#Files for static linking of varnish library functions +#Varnish is a high-performance HTTP accelerator + %prep -%setup -n varnish-%{version}-tp2 +%setup -q +#%setup -n varnish-cache # The svn sources needs to generate a suitable configure script # Release tarballs would not need this -# ./autogen.sh +#./autogen.sh mkdir examples cp bin/varnishd/default.vcl etc/zope-plone.vcl examples @@ -70,14 +82,24 @@ s|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool %{__make} %{?_smp_mflags} +#%{__make} check LD_LIBRARY_PATH="../../lib/libvarnish/.libs:../../lib/libvarnishcompat/.libs:../../lib/libvarnishapi/.libs:../../lib/libvcl/.libs" -sed -e ' s/8080/80/g ' etc/default.vcl > redhat/default.vcl +head -6 etc/default.vcl > redhat/default.vcl +cat << EOF >> redhat/default.vcl +backend default { + .host = "127.0.0.1"; + .port = "80"; +} +EOF +tail -n +11 etc/default.vcl >> redhat/default.vcl + +# This part probably broken now %if "%dist" == "el4" - sed -i 's,daemon --pidfile \${\?PIDFILE}\?,daemon,g; - s,status -p \$PIDFILE,status,g; - s,killproc -p \$PIDFILE,killproc,g' \ + sed -i 's,--pidfile \$pidfile,,g; + s,status -p \$pidfile,status,g; + s,killproc -p \$pidfile,killproc,g' \ redhat/varnish.initrc redhat/varnishlog.initrc %endif @@ -93,12 +115,12 @@ mkdir -p %{buildroot}/var/lib/varnish mkdir -p %{buildroot}/var/log/varnish - +mkdir -p %{buildroot}/var/run/varnish %{__install} -D -m 0644 redhat/default.vcl %{buildroot}%{_sysconfdir}/varnish/default.vcl %{__install} -D -m 0644 redhat/varnish.sysconfig %{buildroot}%{_sysconfdir}/sysconfig/varnish %{__install} -D -m 0644 redhat/varnish.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/varnish -%{__install} -D -m 0755 redhat/varnish.initrc %{buildroot}%{_sysconfdir}/init.d/varnish -%{__install} -D -m 0755 redhat/varnishlog.initrc %{buildroot}%{_sysconfdir}/init.d/varnishlog +%{__install} -D -m 0755 redhat/varnish.initrc %{buildroot}%{_initrddir}/varnish +%{__install} -D -m 0755 redhat/varnishlog.initrc %{buildroot}%{_initrddir}/varnishlog %clean rm -rf %{buildroot} @@ -117,8 +139,8 @@ %config(noreplace) %{_sysconfdir}/varnish/default.vcl %config(noreplace) %{_sysconfdir}/sysconfig/varnish %config(noreplace) %{_sysconfdir}/logrotate.d/varnish -%{_sysconfdir}/init.d/varnish -%{_sysconfdir}/init.d/varnishlog +%{_initrddir}/varnish +%{_initrddir}/varnishlog %files libs %defattr(-,root,root,-) @@ -137,17 +159,19 @@ %{_includedir}/varnish/stats.h %{_includedir}/varnish/varnishapi.h %{_libdir}/pkgconfig/varnishapi.pc + +#%files libs-static #%{_libdir}/libvarnish.a #%{_libdir}/libvarnishapi.a #%{_libdir}/libvarnishcompat.a #%{_libdir}/libvcl.a -%doc LICENSE +#%doc LICENSE %pre getent group varnish >/dev/null || groupadd -r varnish getent passwd varnish >/dev/null || \ -useradd -r -g varnish -d /var/lib/varnish -s /sbin/nologin \ - -c "Varnish http accelerator user" varnish + useradd -r -g varnish -d /var/lib/varnish -s /sbin/nologin \ + -c "Varnish http accelerator user" varnish exit 0 %post @@ -156,16 +180,16 @@ %preun if [ $1 -lt 1 ]; then - /sbin/service varnish stop > /dev/null 2>/dev/null - /sbin/service varnishlog stop > /dev/null 2>/dev/null + /sbin/service varnish stop > /dev/null 2>&1 + /sbin/service varnishlog stop > /dev/null 2>&1 /sbin/chkconfig --del varnish /sbin/chkconfig --del varnishlog fi %postun if [ $1 -ge 1 ]; then - /sbin/service varnish condrestart > /dev/null 2>/dev/null - /sbin/service varnishlog condrestart > /dev/null 2>/dev/null + /sbin/service varnish condrestart > /dev/null 2>&1 + /sbin/service varnishlog condrestart > /dev/null 2>&1 fi %post libs -p /sbin/ldconfig @@ -173,6 +197,12 @@ %postun libs -p /sbin/ldconfig %changelog +* Mon Aug 25 2008 Ingvar Hagelund - 2.0-0.3.20080825svn3120 +- Fixing up init script according to newer Fedora standards +- The build now runs the test suite after compiling +- Requires initscripts +- Change default.vcl from nothing but comments to point to localhost:80, + * Mon Aug 18 2008 Ingvar Hagelund - 2.0-0.2.tp2 - Changed source, version and release to match 2.0-tp2 From ingvar at projects.linpro.no Mon Aug 25 23:09:57 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Tue, 26 Aug 2008 01:09:57 +0200 (CEST) Subject: r3125 - trunk/varnish-cache/redhat Message-ID: <20080825230957.F12681EC1FF@projects.linpro.no> Author: ingvar Date: 2008-08-26 01:09:57 +0200 (Tue, 26 Aug 2008) New Revision: 3125 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Added a missing changelog item from Fedora Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-25 23:02:47 UTC (rev 3124) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-25 23:09:57 UTC (rev 3125) @@ -1,7 +1,7 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: 0.3.20080826svn3124%{?dist} +Release: 0.3.20080826svn3125%{?dist} License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ @@ -197,7 +197,7 @@ %postun libs -p /sbin/ldconfig %changelog -* Mon Aug 25 2008 Ingvar Hagelund - 2.0-0.3.20080825svn3120 +* Mon Aug 25 2008 Ingvar Hagelund - 2.0-0.3.20080825svn3125 - Fixing up init script according to newer Fedora standards - The build now runs the test suite after compiling - Requires initscripts @@ -206,10 +206,13 @@ * Mon Aug 18 2008 Ingvar Hagelund - 2.0-0.2.tp2 - Changed source, version and release to match 2.0-tp2 -* Thu Aug 14 2008 Ingvar Hagelund - 2.0-pre_svn20080814 +* Thu Aug 14 2008 Ingvar Hagelund - 2.0-0.1.20080814svn - default.vcl has moved - Added groff to build requirements +* Tue Feb 19 2008 Fedora Release Engineering - 1.1.2-6 +- Autorebuild for GCC 4.3 + * Sat Dec 29 2007 Ingvar Hagelund - 1.1.2-5 - Added missing configuration examples - Corrected the license to "BSD" From phk at projects.linpro.no Tue Aug 26 07:47:23 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 09:47:23 +0200 (CEST) Subject: r3126 - in trunk/varnish-cache: bin/varnishd include lib/libvarnish Message-ID: <20080826074723.B068D1EC10B@projects.linpro.no> Author: phk Date: 2008-08-26 09:47:23 +0200 (Tue, 26 Aug 2008) New Revision: 3126 Added: trunk/varnish-cache/lib/libvarnish/tcp.c Removed: trunk/varnish-cache/bin/varnishd/tcp.c Modified: trunk/varnish-cache/bin/varnishd/Makefile.am trunk/varnish-cache/bin/varnishd/common.h trunk/varnish-cache/include/libvarnish.h trunk/varnish-cache/lib/libvarnish/Makefile.am Log: Move the tcp.c file to libvarnish, we need the primitives in varnishtest also. Modified: trunk/varnish-cache/bin/varnishd/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-25 23:09:57 UTC (rev 3125) +++ trunk/varnish-cache/bin/varnishd/Makefile.am 2008-08-26 07:47:23 UTC (rev 3126) @@ -53,7 +53,6 @@ storage_malloc.c \ storage_synth.c \ storage_umem.c \ - tcp.c \ varnishd.c noinst_HEADERS = \ Modified: trunk/varnish-cache/bin/varnishd/common.h =================================================================== --- trunk/varnish-cache/bin/varnishd/common.h 2008-08-25 23:09:57 UTC (rev 3125) +++ trunk/varnish-cache/bin/varnishd/common.h 2008-08-26 07:47:23 UTC (rev 3126) @@ -42,21 +42,6 @@ void VSL_MgtInit(const char *fn, unsigned size); extern struct varnish_stats *VSL_stats; -/* tcp.c */ -/* NI_MAXHOST and NI_MAXSERV are ridiculously long for numeric format */ -#define TCP_ADDRBUFSIZE 64 -#define TCP_PORTBUFSIZE 16 - -void TCP_name(const struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbuf, unsigned plen); -void TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen); -int TCP_filter_http(int sock); -void TCP_blocking(int sock); -void TCP_nonblocking(int sock); -#ifdef SOL_SOCKET -int TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec); -void TCP_close(int *s); -#endif - #define TRUST_ME(ptr) ((void*)(uintptr_t)(ptr)) /* Really belongs in mgt.h, but storage_file chokes on both */ Deleted: trunk/varnish-cache/bin/varnishd/tcp.c =================================================================== --- trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-25 23:09:57 UTC (rev 3125) +++ trunk/varnish-cache/bin/varnishd/tcp.c 2008-08-26 07:47:23 UTC (rev 3126) @@ -1,211 +0,0 @@ -/*- - * Copyright (c) 2006 Verdens Gang AS - * Copyright (c) 2006-2008 Linpro AS - * All rights reserved. - * - * Author: Poul-Henning Kamp - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Id$ - */ - -#include "config.h" - -#include -#include - -#include - -#include -#include -#ifdef HAVE_SYS_FILIO_H -#include -#endif -#include -#include -#include -#include -#include -#include - -#include "config.h" -#ifndef HAVE_STRLCPY -#include "compat/strlcpy.h" -#endif - -#include "mgt.h" - -/*--------------------------------------------------------------------*/ - -void -TCP_name(const struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbuf, unsigned plen) -{ - int i; - - i = getnameinfo(addr, l, abuf, alen, pbuf, plen, - NI_NUMERICHOST | NI_NUMERICSERV); - if (i) { - printf("getnameinfo = %d %s\n", i, gai_strerror(i)); - strlcpy(abuf, "Conversion", alen); - strlcpy(pbuf, "Failed", plen); - return; - } - /* XXX dirty hack for v4-to-v6 mapped addresses */ - if (strncmp(abuf, "::ffff:", 7) == 0) { - for (i = 0; abuf[i + 7]; ++i) - abuf[i] = abuf[i + 7]; - abuf[i] = '\0'; - } -} - -/*--------------------------------------------------------------------*/ - -void -TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen) -{ - struct sockaddr_storage addr_s; - struct sockaddr *addr = (void*)&addr_s; - socklen_t l; - - l = sizeof addr_s; - AZ(getsockname(sock, addr, &l)); - TCP_name(addr, l, abuf, alen, pbuf, plen); -} - -/*--------------------------------------------------------------------*/ - -int -TCP_filter_http(int sock) -{ -#ifdef HAVE_ACCEPT_FILTERS - struct accept_filter_arg afa; - int i; - - bzero(&afa, sizeof(afa)); - strcpy(afa.af_name, "httpready"); - errno = 0; - i = setsockopt(sock, SOL_SOCKET, SO_ACCEPTFILTER, - &afa, sizeof(afa)); - /* XXX ugly */ - if (i) - printf("Acceptfilter(%d, httpready): %d %s\n", - sock, i, strerror(errno)); - return (i); -#else - (void)sock; - return (0); -#endif -} - -/*-------------------------------------------------------------------- - * Functions for controlling NONBLOCK mode. - * - * We use FIONBIO because it is cheaper than fcntl(2), which requires - * us to do two syscalls, one to get and one to set, the latter of - * which mucks about a bit before it ends up calling ioctl(FIONBIO), - * at least on FreeBSD. - */ - -void -TCP_blocking(int sock) -{ - int i; - - i = 0; - AZ(ioctl(sock, FIONBIO, &i)); -} - -void -TCP_nonblocking(int sock) -{ - int i; - - i = 1; - AZ(ioctl(sock, FIONBIO, &i)); -} - -/*-------------------------------------------------------------------- - * On TCP a connect(2) can block for a looong time, and we don't want that. - * Unfortunately, the SocketWizards back in those days were happy to wait - * any amount of time for a connection, so the connect(2) syscall does not - * take an argument for patience. - * - * There is a little used work-around, and we employ it at our peril. - * - */ - -int -TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec) -{ - int i, k; - socklen_t l; - struct pollfd fds[1]; - - assert(s >= 0); - - /* Set the socket non-blocking */ - TCP_nonblocking(s); - - /* Attempt the connect */ - i = connect(s, name, namelen); - if (i == 0 || errno != EINPROGRESS) - return (i); - - /* Exercise our patience, polling for write */ - fds[0].fd = s; - fds[0].events = POLLWRNORM; - fds[0].revents = 0; - i = poll(fds, 1, msec); - - if (i == 0) { - /* Timeout, close and give up */ - errno = ETIMEDOUT; - return (-1); - } - - /* Find out if we got a connection */ - l = sizeof k; - AZ(getsockopt(s, SOL_SOCKET, SO_ERROR, &k, &l)); - - /* An error means no connection established */ - errno = k; - if (k) - return (-1); - - TCP_blocking(s); - return (0); -} - -/*-------------------------------------------------------------------- - * When closing a TCP connection, a couple of errno's are legit, we - * can't be held responsible for the other end wanting to talk to us. - */ - -void -TCP_close(int *s) -{ - assert (close(*s) == 0 || - errno == ECONNRESET || - errno == ENOTCONN); - *s = -1; -} Modified: trunk/varnish-cache/include/libvarnish.h =================================================================== --- trunk/varnish-cache/include/libvarnish.h 2008-08-25 23:09:57 UTC (rev 3125) +++ trunk/varnish-cache/include/libvarnish.h 2008-08-26 07:47:23 UTC (rev 3126) @@ -50,6 +50,21 @@ /* from libvarnish/num.c */ const char *str2bytes(const char *p, uintmax_t *r, uintmax_t rel); +/* from libvarnish/tcp.c */ +/* NI_MAXHOST and NI_MAXSERV are ridiculously long for numeric format */ +#define TCP_ADDRBUFSIZE 64 +#define TCP_PORTBUFSIZE 16 + +void TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen); +int TCP_filter_http(int sock); +void TCP_blocking(int sock); +void TCP_nonblocking(int sock); +#ifdef SOL_SOCKET +void TCP_name(const struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbuf, unsigned plen); +int TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec); +void TCP_close(int *s); +#endif + /* from libvarnish/time.c */ void TIM_format(double t, char *p); time_t TIM_parse(const char *p); Modified: trunk/varnish-cache/lib/libvarnish/Makefile.am =================================================================== --- trunk/varnish-cache/lib/libvarnish/Makefile.am 2008-08-25 23:09:57 UTC (rev 3125) +++ trunk/varnish-cache/lib/libvarnish/Makefile.am 2008-08-26 07:47:23 UTC (rev 3126) @@ -14,6 +14,7 @@ flopen.c \ num.c \ time.c \ + tcp.c \ vct.c \ version.c \ vev.c \ Copied: trunk/varnish-cache/lib/libvarnish/tcp.c (from rev 3125, trunk/varnish-cache/bin/varnishd/tcp.c) =================================================================== --- trunk/varnish-cache/lib/libvarnish/tcp.c (rev 0) +++ trunk/varnish-cache/lib/libvarnish/tcp.c 2008-08-26 07:47:23 UTC (rev 3126) @@ -0,0 +1,211 @@ +/*- + * Copyright (c) 2006 Verdens Gang AS + * Copyright (c) 2006-2008 Linpro AS + * All rights reserved. + * + * Author: Poul-Henning Kamp + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + */ + +#include "config.h" + +#include +#include + +#include + +#include +#include +#ifdef HAVE_SYS_FILIO_H +#include +#endif +#include +#include +#include +#include +#include +#include + +#include "config.h" +#ifndef HAVE_STRLCPY +#include "compat/strlcpy.h" +#endif + +#include "libvarnish.h" + +/*--------------------------------------------------------------------*/ + +void +TCP_name(const struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbuf, unsigned plen) +{ + int i; + + i = getnameinfo(addr, l, abuf, alen, pbuf, plen, + NI_NUMERICHOST | NI_NUMERICSERV); + if (i) { + printf("getnameinfo = %d %s\n", i, gai_strerror(i)); + strlcpy(abuf, "Conversion", alen); + strlcpy(pbuf, "Failed", plen); + return; + } + /* XXX dirty hack for v4-to-v6 mapped addresses */ + if (strncmp(abuf, "::ffff:", 7) == 0) { + for (i = 0; abuf[i + 7]; ++i) + abuf[i] = abuf[i + 7]; + abuf[i] = '\0'; + } +} + +/*--------------------------------------------------------------------*/ + +void +TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen) +{ + struct sockaddr_storage addr_s; + struct sockaddr *addr = (void*)&addr_s; + socklen_t l; + + l = sizeof addr_s; + AZ(getsockname(sock, addr, &l)); + TCP_name(addr, l, abuf, alen, pbuf, plen); +} + +/*--------------------------------------------------------------------*/ + +int +TCP_filter_http(int sock) +{ +#ifdef HAVE_ACCEPT_FILTERS + struct accept_filter_arg afa; + int i; + + bzero(&afa, sizeof(afa)); + strcpy(afa.af_name, "httpready"); + errno = 0; + i = setsockopt(sock, SOL_SOCKET, SO_ACCEPTFILTER, + &afa, sizeof(afa)); + /* XXX ugly */ + if (i) + printf("Acceptfilter(%d, httpready): %d %s\n", + sock, i, strerror(errno)); + return (i); +#else + (void)sock; + return (0); +#endif +} + +/*-------------------------------------------------------------------- + * Functions for controlling NONBLOCK mode. + * + * We use FIONBIO because it is cheaper than fcntl(2), which requires + * us to do two syscalls, one to get and one to set, the latter of + * which mucks about a bit before it ends up calling ioctl(FIONBIO), + * at least on FreeBSD. + */ + +void +TCP_blocking(int sock) +{ + int i; + + i = 0; + AZ(ioctl(sock, FIONBIO, &i)); +} + +void +TCP_nonblocking(int sock) +{ + int i; + + i = 1; + AZ(ioctl(sock, FIONBIO, &i)); +} + +/*-------------------------------------------------------------------- + * On TCP a connect(2) can block for a looong time, and we don't want that. + * Unfortunately, the SocketWizards back in those days were happy to wait + * any amount of time for a connection, so the connect(2) syscall does not + * take an argument for patience. + * + * There is a little used work-around, and we employ it at our peril. + * + */ + +int +TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec) +{ + int i, k; + socklen_t l; + struct pollfd fds[1]; + + assert(s >= 0); + + /* Set the socket non-blocking */ + TCP_nonblocking(s); + + /* Attempt the connect */ + i = connect(s, name, namelen); + if (i == 0 || errno != EINPROGRESS) + return (i); + + /* Exercise our patience, polling for write */ + fds[0].fd = s; + fds[0].events = POLLWRNORM; + fds[0].revents = 0; + i = poll(fds, 1, msec); + + if (i == 0) { + /* Timeout, close and give up */ + errno = ETIMEDOUT; + return (-1); + } + + /* Find out if we got a connection */ + l = sizeof k; + AZ(getsockopt(s, SOL_SOCKET, SO_ERROR, &k, &l)); + + /* An error means no connection established */ + errno = k; + if (k) + return (-1); + + TCP_blocking(s); + return (0); +} + +/*-------------------------------------------------------------------- + * When closing a TCP connection, a couple of errno's are legit, we + * can't be held responsible for the other end wanting to talk to us. + */ + +void +TCP_close(int *s) +{ + assert (close(*s) == 0 || + errno == ECONNRESET || + errno == ENOTCONN); + *s = -1; +} Property changes on: trunk/varnish-cache/lib/libvarnish/tcp.c ___________________________________________________________________ Name: svn:keywords + Id Name: svn:mergeinfo + From phk at projects.linpro.no Tue Aug 26 07:51:12 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 09:51:12 +0200 (CEST) Subject: r3127 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080826075112.CBCAE1EC11B@projects.linpro.no> Author: phk Date: 2008-08-26 09:51:12 +0200 (Tue, 26 Aug 2008) New Revision: 3127 Modified: trunk/varnish-cache/bin/varnishtest/vtc_client.c trunk/varnish-cache/bin/varnishtest/vtc_server.c Log: Use TCP_close() to properly ignore the "canonical" TCP legal errno values consistently. Fixes #297 Modified: trunk/varnish-cache/bin/varnishtest/vtc_client.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_client.c 2008-08-26 07:47:23 UTC (rev 3126) +++ trunk/varnish-cache/bin/varnishtest/vtc_client.c 2008-08-26 07:51:12 UTC (rev 3127) @@ -87,7 +87,7 @@ vtc_log(vl, 3, "Connected to %s fd is %d", c->connect, fd); http_process(vl, c->spec, fd, 1); vtc_log(vl, 3, "Closing fd %d", fd); - AZ(close(fd)); + TCP_close(&fd); vtc_log(vl, 2, "Ending"); return (NULL); Modified: trunk/varnish-cache/bin/varnishtest/vtc_server.c =================================================================== --- trunk/varnish-cache/bin/varnishtest/vtc_server.c 2008-08-26 07:47:23 UTC (rev 3126) +++ trunk/varnish-cache/bin/varnishtest/vtc_server.c 2008-08-26 07:51:12 UTC (rev 3127) @@ -98,7 +98,7 @@ http_process(vl, s->spec, fd, 0); vtc_log(vl, 3, "shutting fd %d", fd); AZ(shutdown(fd, SHUT_WR)); - assert(close(fd) == 0 || errno == ECONNRESET); + TCP_close(&fd); } vtc_log(vl, 2, "Ending"); return (NULL); @@ -177,7 +177,7 @@ exit (1); } s->tp = 0; - AZ(close(s->sock)); + TCP_close(&s->sock); s->sock = -1; } From phk at projects.linpro.no Tue Aug 26 08:06:28 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 10:06:28 +0200 (CEST) Subject: r3128 - trunk/varnish-cache/etc Message-ID: <20080826080628.8359A1EC10F@projects.linpro.no> Author: phk Date: 2008-08-26 10:06:27 +0200 (Tue, 26 Aug 2008) New Revision: 3128 Modified: trunk/varnish-cache/etc/Makefile.am Log: Correctly quote backend data in default vcl example. Submitted by: ingvar Fixes: #298 Modified: trunk/varnish-cache/etc/Makefile.am =================================================================== --- trunk/varnish-cache/etc/Makefile.am 2008-08-26 07:51:12 UTC (rev 3127) +++ trunk/varnish-cache/etc/Makefile.am 2008-08-26 08:06:27 UTC (rev 3128) @@ -12,8 +12,8 @@ server.\n\ \n\ backend default {\n\ - .host = "127.0.0.1";\n\ - .port = "8080";\n\ + .host = \"127.0.0.1\";\n\ + .port = \"8080\";\n\ }\n\ \n\ Below is a commented-out copy of the default VCL logic. If you\n\ From phk at projects.linpro.no Tue Aug 26 09:17:32 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 11:17:32 +0200 (CEST) Subject: r3129 - trunk/varnish-cache/bin/varnishd Message-ID: <20080826091732.7F89B1EC205@projects.linpro.no> Author: phk Date: 2008-08-26 11:17:32 +0200 (Tue, 26 Aug 2008) New Revision: 3129 Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/cache_backend.h trunk/varnish-cache/bin/varnishd/cache_center.c trunk/varnish-cache/bin/varnishd/cache_dir_random.c trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c trunk/varnish-cache/bin/varnishd/cache_dir_simple.c trunk/varnish-cache/bin/varnishd/cache_fetch.c trunk/varnish-cache/bin/varnishd/cache_panic.c trunk/varnish-cache/bin/varnishd/cache_pipe.c Log: Give sessions a backend connection instead of a backend and have the directors provide that. Entirely a no-op, apart from a bugfix that just would screw you even more (than "totally") if socket(2) should ever fail. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-26 09:17:32 UTC (rev 3129) @@ -354,7 +354,7 @@ VTAILQ_ENTRY(sess) list; struct director *director; - struct backend *backend; + struct vbe_conn *vbe; struct bereq *bereq; struct object *obj; struct objhead *objhead; @@ -397,9 +397,9 @@ /* cache_backend.c */ -struct vbe_conn *VBE_GetFd(struct sess *sp); -void VBE_ClosedFd(struct worker *w, struct vbe_conn *vc); -void VBE_RecycleFd(struct worker *w, struct vbe_conn *vc); +void VBE_GetFd(struct sess *sp); +void VBE_ClosedFd(struct sess *sp); +void VBE_RecycleFd(struct sess *sp); struct bereq * VBE_new_bereq(void); void VBE_free_bereq(struct bereq *bereq); void VBE_AddHostHeader(const struct sess *sp); Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -66,9 +66,10 @@ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->bereq, BEREQ_MAGIC); CHECK_OBJ_NOTNULL(sp->bereq->http, HTTP_MAGIC); - CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC); + CHECK_OBJ_NOTNULL(sp->vbe, VBE_CONN_MAGIC); + CHECK_OBJ_NOTNULL(sp->vbe->backend, BACKEND_MAGIC); http_PrintfHeader(sp->wrk, sp->fd, sp->bereq->http, - "Host: %s", sp->backend->hosthdr); + "Host: %s", sp->vbe->backend->hosthdr); } /*-------------------------------------------------------------------- @@ -81,24 +82,21 @@ */ static int -VBE_TryConnect(const struct sess *sp, int pf, const struct sockaddr *sa, socklen_t salen) +VBE_TryConnect(const struct sess *sp, int pf, const struct sockaddr *sa, socklen_t salen, const struct backend *bp) { int s, i, tmo; char abuf1[TCP_ADDRBUFSIZE], abuf2[TCP_ADDRBUFSIZE]; char pbuf1[TCP_PORTBUFSIZE], pbuf2[TCP_PORTBUFSIZE]; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC); s = socket(pf, SOCK_STREAM, 0); - if (s < 0) { - LOCK(&sp->backend->mtx); + if (s < 0) return (s); - } tmo = params->connect_timeout; - if (sp->backend->connect_timeout > 10e-3) - tmo = (int)(sp->backend->connect_timeout * 1000); + if (bp->connect_timeout > 10e-3) + tmo = (int)(bp->connect_timeout * 1000); if (tmo > 0) i = TCP_connect(s, sa, salen, tmo); @@ -113,7 +111,7 @@ TCP_myname(s, abuf1, sizeof abuf1, pbuf1, sizeof pbuf1); TCP_name(sa, salen, abuf2, sizeof abuf2, pbuf2, sizeof pbuf2); WSL(sp->wrk, SLT_BackendOpen, s, "%s %s %s %s %s", - sp->backend->vcl_name, abuf1, pbuf1, abuf2, pbuf2); + bp->vcl_name, abuf1, pbuf1, abuf2, pbuf2); return (s); } @@ -250,11 +248,11 @@ /* release lock during stuff that can take a long time */ if (params->prefer_ipv6 && bp->ipv6 != NULL) - s = VBE_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len); + s = VBE_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len, bp); if (s == -1 && bp->ipv4 != NULL) - s = VBE_TryConnect(sp, PF_INET, bp->ipv4, bp->ipv4len); + s = VBE_TryConnect(sp, PF_INET, bp->ipv4, bp->ipv4len, bp); if (s == -1 && !params->prefer_ipv6 && bp->ipv6 != NULL) - s = VBE_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len); + s = VBE_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len, bp); if (s < 0) { LOCK(&bp->mtx); @@ -269,20 +267,15 @@ * should contact. */ -struct vbe_conn * +void VBE_GetFd(struct sess *sp) { CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); - if (sp->director->getfd != NULL) - return (sp->director->getfd(sp)); - - sp->backend = sp->director->choose(sp); - CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC); - return (VBE_GetVbe(sp)); + AN (sp->director->getfd); + sp->vbe = sp->director->getfd(sp); } /*-------------------------------------------------------------------- @@ -290,12 +283,11 @@ */ struct vbe_conn * -VBE_GetVbe(const struct sess *sp) +VBE_GetVbe(struct sess *sp, struct backend *bp) { - struct backend *bp; struct vbe_conn *vc; - bp = sp->backend; + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); /* first look for vbe_conn's we can recycle */ @@ -317,7 +309,8 @@ VSL_stats->backend_conn++; return (vc); } - VBE_ClosedFd(sp->wrk, vc); + sp->vbe = vc; + VBE_ClosedFd(sp); } vc = VBE_NewConn(); @@ -337,37 +330,41 @@ /* Close a connection ------------------------------------------------*/ void -VBE_ClosedFd(struct worker *w, struct vbe_conn *vc) +VBE_ClosedFd(struct sess *sp) { - struct backend *b; + struct backend *bp; - CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC); - CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC); - b = vc->backend; - assert(vc->fd >= 0); - WSL(w, SLT_BackendClose, vc->fd, "%s", vc->backend->vcl_name); - TCP_close(&vc->fd); - VBE_DropRef(vc->backend); - vc->backend = NULL; - VBE_ReleaseConn(vc); - CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC); + CHECK_OBJ_NOTNULL(sp->vbe, VBE_CONN_MAGIC); + CHECK_OBJ_NOTNULL(sp->vbe->backend, BACKEND_MAGIC); + assert(sp->vbe->fd >= 0); + + bp = sp->vbe->backend; + + WSL(sp->wrk, SLT_BackendClose, sp->vbe->fd, "%s", bp->vcl_name); + TCP_close(&sp->vbe->fd); + VBE_DropRef(bp); + sp->vbe->backend = NULL; + VBE_ReleaseConn(sp->vbe); + sp->vbe = NULL; } /* Recycle a connection ----------------------------------------------*/ void -VBE_RecycleFd(struct worker *w, struct vbe_conn *vc) +VBE_RecycleFd(struct sess *sp) { struct backend *bp; - CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC); - CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC); - assert(vc->fd >= 0); - bp = vc->backend; - WSL(w, SLT_BackendReuse, vc->fd, "%s", vc->backend->vcl_name); - LOCK(&vc->backend->mtx); + CHECK_OBJ_NOTNULL(sp->vbe, VBE_CONN_MAGIC); + CHECK_OBJ_NOTNULL(sp->vbe->backend, BACKEND_MAGIC); + assert(sp->vbe->fd >= 0); + + bp = sp->vbe->backend; + + WSL(sp->wrk, SLT_BackendReuse, sp->vbe->fd, "%s", bp->vcl_name); + LOCK(&bp->mtx); VSL_stats->backend_recycle++; - VTAILQ_INSERT_HEAD(&bp->connlist, vc, list); - VBE_DropRefLocked(vc->backend); - CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); + VTAILQ_INSERT_HEAD(&bp->connlist, sp->vbe, list); + sp->vbe = NULL; + VBE_DropRefLocked(bp); } Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-26 09:17:32 UTC (rev 3129) @@ -78,14 +78,12 @@ */ typedef struct vbe_conn *vdi_getfd_f(struct sess *sp); -typedef struct backend *vdi_choose_f(struct sess *sp); typedef void vdi_fini_f(struct director *d); struct director { unsigned magic; #define DIRECTOR_MAGIC 0x3336351d const char *name; - vdi_choose_f *choose; vdi_getfd_f *getfd; vdi_fini_f *fini; void *priv; @@ -123,7 +121,7 @@ /* cache_backend.c */ void VBE_ReleaseConn(struct vbe_conn *vc); -struct vbe_conn *VBE_GetVbe(const struct sess *sp); +struct vbe_conn *VBE_GetVbe(struct sess *sp, struct backend *bp); /* cache_backend_cfg.c */ extern MTX VBE_mtx; Modified: trunk/varnish-cache/bin/varnishd/cache_center.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_center.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -175,10 +175,6 @@ sp->director = NULL; sp->restarts = 0; - sp->backend = NULL; /* - * XXX: we may want to leave this - * behind to hint directors ? - */ RES_WriteObj(sp); HSH_Deref(sp->obj); @@ -209,13 +205,10 @@ CHECK_OBJ_ORNULL(sp->vcl, VCL_CONF_MAGIC); AZ(sp->obj); + AZ(sp->vbe); AZ(sp->bereq); sp->director = NULL; sp->restarts = 0; - sp->backend = NULL; /* - * XXX: we may want to leave this - * behind to hint directors ? - */ if (sp->vcl != NULL && sp->esis == 0) { if (sp->wrk->vcl != NULL) @@ -389,7 +382,9 @@ AN(sp->bereq); AN(sp->director); + AZ(sp->vbe); i = Fetch(sp); + AZ(sp->vbe); AN(sp->director); if (i) { Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -62,15 +62,15 @@ }; -/*lint -e{818} not const-able */ -static struct backend * -vdi_random_choose(struct sess *sp) +static struct vbe_conn * +vdi_random_getfd(struct sess *sp) { int i; struct vdi_random *vs; uint32_t r; struct vdi_random_host *vh; + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_RANDOM_MAGIC); r = random(); @@ -78,7 +78,7 @@ for (i = 0, vh = vs->hosts; i < vs->nhosts; vh++) if (r < vh->weight) - return (vh->backend); + return (VBE_GetVbe(sp, vh->backend)); assert(0 == __LINE__); return (NULL); } @@ -122,7 +122,7 @@ vs->dir.magic = DIRECTOR_MAGIC; vs->dir.priv = vs; vs->dir.name = "random"; - vs->dir.choose = vdi_random_choose; + vs->dir.getfd = vdi_random_getfd; vs->dir.fini = vdi_random_fini; s = 0; Modified: trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -59,21 +59,20 @@ unsigned next_host; }; - -/*lint -e{818} not const-able */ -static struct backend * -vdi_round_robin_choose(struct sess *sp) +static struct vbe_conn * +vdi_round_robin_getfd(struct sess *sp) { struct vdi_round_robin *vs; struct backend *backend; + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_ROUND_ROBIN_MAGIC); backend = vs->hosts[ vs->next_host ].backend; vs->next_host = (vs->next_host + 1) % vs->nhosts; - return (backend); + return (VBE_GetVbe(sp, backend)); } /*lint -e{818} not const-able */ @@ -114,7 +113,7 @@ vs->dir.magic = DIRECTOR_MAGIC; vs->dir.priv = vs; vs->dir.name = "round_robin"; - vs->dir.choose = vdi_round_robin_choose; + vs->dir.getfd = vdi_round_robin_getfd; vs->dir.fini = vdi_round_robin_fini; vh = vs->hosts; Modified: trunk/varnish-cache/bin/varnishd/cache_dir_simple.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_simple.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_dir_simple.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -55,15 +55,15 @@ struct backend *backend; }; -/*lint -e{818} not const-able */ -static struct backend * -vdi_simple_choose(struct sess *sp) +static struct vbe_conn * +vdi_simple_getfd(struct sess *sp) { struct vdi_simple *vs; + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_SIMPLE_MAGIC); - return (vs->backend); + return (VBE_GetVbe(sp, vs->backend)); } /*lint -e{818} not const-able */ @@ -92,7 +92,7 @@ vs->dir.magic = DIRECTOR_MAGIC; vs->dir.priv = vs; vs->dir.name = "simple"; - vs->dir.choose = vdi_simple_choose; + vs->dir.getfd = vdi_simple_getfd; vs->dir.fini = vdi_simple_fini; vs->backend = VBE_AddBackend(cli, t->host); Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_fetch.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -332,9 +332,10 @@ /* Set up obj's workspace */ WS_Assert(sp->obj->ws_o); - vc = VBE_GetFd(sp); - if (vc == NULL) + VBE_GetFd(sp); + if (sp->vbe == NULL) return (__LINE__); + vc = sp->vbe; /* * Now that we know our backend, we can set a default Host: @@ -351,12 +352,12 @@ /* Deal with any message-body the request might have */ i = FetchReqBody(sp); if (i > 0) { - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); return (__LINE__); } if (WRK_Flush(w)) { - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); /* XXX: other cleanup ? */ return (__LINE__); } @@ -370,13 +371,13 @@ while (i == 0); if (i < 0) { - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); /* XXX: other cleanup ? */ return (__LINE__); } if (http_DissectResponse(sp->wrk, htc, hp)) { - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); /* XXX: other cleanup ? */ return (__LINE__); } @@ -408,7 +409,7 @@ } else if (http_GetHdr(hp, H_Transfer_Encoding, &b)) { /* XXX: AUGH! */ WSL(sp->wrk, SLT_Debug, vc->fd, "Invalid Transfer-Encoding"); - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); return (__LINE__); } else { switch (http_GetStatus(hp)) { @@ -428,7 +429,7 @@ VTAILQ_REMOVE(&sp->obj->store, st, list); STV_free(st); } - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); sp->obj->len = 0; return (__LINE__); } @@ -451,9 +452,9 @@ cls = 1; if (cls) - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); else - VBE_RecycleFd(sp->wrk, vc); + VBE_RecycleFd(sp); return (0); } Modified: trunk/varnish-cache/bin/varnishd/cache_panic.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_panic.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_panic.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -83,10 +83,14 @@ /*--------------------------------------------------------------------*/ static void -pan_backend(const struct backend *be) +pan_vbe(const struct vbe_conn *vbe) { - vsb_printf(vsp, " backend = %p {\n", be); + struct backend *be; + + be = vbe->backend; + + vsb_printf(vsp, " backend = %p fd = %d {\n", be, vbe->fd); vsb_printf(vsp, " vcl_name = \"%s\",\n", be->vcl_name); vsb_printf(vsp, " },\n"); } @@ -242,8 +246,8 @@ if (VALID_OBJ(sp->vcl, VCL_CONF_MAGIC)) pan_vcl(sp->vcl); - if (VALID_OBJ(sp->backend, BACKEND_MAGIC)) - pan_backend(sp->backend); + if (VALID_OBJ(sp->vbe, BACKEND_MAGIC)) + pan_vbe(sp->vbe); if (VALID_OBJ(sp->obj, OBJECT_MAGIC)) pan_object(sp->obj); Modified: trunk/varnish-cache/bin/varnishd/cache_pipe.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_pipe.c 2008-08-26 08:06:27 UTC (rev 3128) +++ trunk/varnish-cache/bin/varnishd/cache_pipe.c 2008-08-26 09:17:32 UTC (rev 3129) @@ -77,9 +77,10 @@ bereq = sp->bereq; sp->bereq = NULL; - vc = VBE_GetFd(sp); - if (vc == NULL) + VBE_GetFd(sp); + if (sp->vbe == NULL) return; + vc = sp->vbe; TCP_blocking(vc->fd); WRK_Reset(w, &vc->fd); @@ -91,7 +92,7 @@ if (WRK_Flush(w)) { vca_close_session(sp, "pipe"); - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); return; } @@ -134,5 +135,5 @@ (void)shutdown(vc->fd, SHUT_WR); } vca_close_session(sp, "pipe"); - VBE_ClosedFd(sp->wrk, vc); + VBE_ClosedFd(sp); } From ingvar at projects.linpro.no Tue Aug 26 09:23:29 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Tue, 26 Aug 2008 11:23:29 +0200 (CEST) Subject: r3130 - trunk/varnish-cache/redhat Message-ID: <20080826092329.34CC91EC7C3@projects.linpro.no> Author: ingvar Date: 2008-08-26 11:23:29 +0200 (Tue, 26 Aug 2008) New Revision: 3130 Modified: trunk/varnish-cache/redhat/varnish.initrc Log: Fixed an error in the argument passing from the init script. Added some more info text to the stop action. Modified: trunk/varnish-cache/redhat/varnish.initrc =================================================================== --- trunk/varnish-cache/redhat/varnish.initrc 2008-08-26 09:17:32 UTC (rev 3129) +++ trunk/varnish-cache/redhat/varnish.initrc 2008-08-26 09:23:29 UTC (rev 3130) @@ -62,7 +62,7 @@ return 6 else # Varnish always gives output on STDOUT - daemon $exec "$DAEMON_OPTS" --pidfile $pidfile > /dev/null 2>&1 + daemon --pidfile $pidfile $exec "$DAEMON_OPTS" > /dev/null 2>&1 retval=$? if [ $retval -eq 0 ] then @@ -77,7 +77,7 @@ } stop() { - echo -n "Stopping $prog: " + echo -n "Stopping varnish HTTP accelerator: " killproc $prog retval=$? echo From phk at projects.linpro.no Tue Aug 26 09:32:24 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 11:32:24 +0200 (CEST) Subject: r3131 - trunk/varnish-cache/bin/varnishd Message-ID: <20080826093224.BD0A51EC10F@projects.linpro.no> Author: phk Date: 2008-08-26 11:32:24 +0200 (Tue, 26 Aug 2008) New Revision: 3131 Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c Log: Mark all nonprobed backends healty Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-26 09:23:29 UTC (rev 3130) +++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2008-08-26 09:32:24 UTC (rev 3131) @@ -417,6 +417,8 @@ AN(vt); if (!memcmp(&vt->probe, p, sizeof *p)) { FREE_OBJ(vt); + /* No probe defined for this backend, set it healthy */ + b->healthy = 1; return; } vt->backend = b; From phk at projects.linpro.no Tue Aug 26 09:47:50 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 11:47:50 +0200 (CEST) Subject: r3132 - in trunk/varnish-cache: bin/varnishd include Message-ID: <20080826094750.158AB1EC7C3@projects.linpro.no> Author: phk Date: 2008-08-26 11:47:49 +0200 (Tue, 26 Aug 2008) New Revision: 3132 Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/include/stat_field.h Log: Tada! First step in activating backend polling: Do not attempt to open connections to a unhealthy backend. Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-26 09:32:24 UTC (rev 3131) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-26 09:47:49 UTC (rev 3132) @@ -313,6 +313,11 @@ VBE_ClosedFd(sp); } + if (!bp->healthy) { + VSL_stats->backend_unhealthy++; + return (NULL); + } + vc = VBE_NewConn(); assert(vc->fd == -1); AZ(vc->backend); Modified: trunk/varnish-cache/include/stat_field.h =================================================================== --- trunk/varnish-cache/include/stat_field.h 2008-08-26 09:32:24 UTC (rev 3131) +++ trunk/varnish-cache/include/stat_field.h 2008-08-26 09:47:49 UTC (rev 3132) @@ -37,6 +37,7 @@ MAC_STAT(cache_miss, uint64_t, 'a', "Cache misses") MAC_STAT(backend_conn, uint64_t, 'a', "Backend connections success") +MAC_STAT(backend_unhealthy, uint64_t, 'a', "Backend connections not attempted") MAC_STAT(backend_fail, uint64_t, 'a', "Backend connections failures") MAC_STAT(backend_reuse, uint64_t, 'a', "Backend connections reuses") MAC_STAT(backend_recycle, uint64_t, 'a', "Backend connections recycles") From ingvar at projects.linpro.no Tue Aug 26 13:09:28 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Tue, 26 Aug 2008 15:09:28 +0200 (CEST) Subject: r3133 - trunk/varnish-cache/redhat Message-ID: <20080826130928.2C93D1EC205@projects.linpro.no> Author: ingvar Date: 2008-08-26 15:09:27 +0200 (Tue, 26 Aug 2008) New Revision: 3133 Modified: trunk/varnish-cache/redhat/varnish.spec Log: make check now runs without races Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-26 09:47:49 UTC (rev 3132) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-26 13:09:27 UTC (rev 3133) @@ -1,7 +1,7 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: 0.3.20080826svn3125%{?dist} +Release: 0.3.20080826svn3132%{?dist} License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ @@ -82,7 +82,7 @@ s|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool %{__make} %{?_smp_mflags} -#%{__make} check LD_LIBRARY_PATH="../../lib/libvarnish/.libs:../../lib/libvarnishcompat/.libs:../../lib/libvarnishapi/.libs:../../lib/libvcl/.libs" +%{__make} check LD_LIBRARY_PATH="../../lib/libvarnish/.libs:../../lib/libvarnishcompat/.libs:../../lib/libvarnishapi/.libs:../../lib/libvcl/.libs" head -6 etc/default.vcl > redhat/default.vcl From phk at projects.linpro.no Tue Aug 26 19:26:47 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 21:26:47 +0200 (CEST) Subject: r3134 - trunk/varnish-cache/bin/varnishd Message-ID: <20080826192647.6821D1EC10F@projects.linpro.no> Author: phk Date: 2008-08-26 21:26:46 +0200 (Tue, 26 Aug 2008) New Revision: 3134 Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c Log: Make the random and round-robin directors avoid backends which are polled as unhealty. This technically makes Varnish 2.0 "feature complete", but some further polishing is to be expected. Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-26 13:09:27 UTC (rev 3133) +++ trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-26 19:26:46 UTC (rev 3134) @@ -50,7 +50,7 @@ struct vdi_random_host { struct backend *backend; - unsigned weight; + double weight; }; struct vdi_random { @@ -61,25 +61,60 @@ unsigned nhosts; }; - static struct vbe_conn * vdi_random_getfd(struct sess *sp) { - int i; + int i, j, k; struct vdi_random *vs; - uint32_t r; - struct vdi_random_host *vh; + double r, s1, s2; + struct vbe_conn *vbe; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_RANDOM_MAGIC); - r = random(); - r &= 0x7fffffff; - for (i = 0, vh = vs->hosts; i < vs->nhosts; vh++) - if (r < vh->weight) - return (VBE_GetVbe(sp, vh->backend)); - assert(0 == __LINE__); + k = 0; + for (k = 0; k < 4; ) { /* XXX: 4 is arbitrary */ + + r = random() / 2147483648.0; /* 2^31 */ + assert(r >= 0.0 && r < 1.0); + + s1 = 0.0; + j = 0; + for (i = 0; i < vs->nhosts; i++) { + if (!vs->hosts[i].backend->healthy) + continue; + s1 += vs->hosts[i].weight; + j++; + } + + if (j == 0) /* No healthy hosts */ + return (NULL); + + r *= s1; + + s2 = 0; + j = 0; + for (i = 0; i < vs->nhosts; i++) { + if (!vs->hosts[i].backend->healthy) + continue; + s2 += vs->hosts[i].weight; + if (r > s2) + j = i + 1; + } + if (s2 != s1) { + /* + * Health bit changed in an unusable way while we + * worked the problem. Usable changes are any that + * result in the same sum we prepared for. + */ + continue; + } + vbe = VBE_GetVbe(sp, vs->hosts[j].backend); + if (vbe != NULL) + return (vbe); + k++; + } return (NULL); } @@ -108,8 +143,7 @@ struct vdi_random *vs; const struct vrt_dir_random_entry *te; struct vdi_random_host *vh; - double s, a, b; - unsigned v; + double s; int i; (void)cli; @@ -130,24 +164,9 @@ te = t->members; for (i = 0; i < t->nmember; i++, vh++, te++) { assert(te->weight > 0.0); - s += te->weight; + vh->weight = te->weight; vh->backend = VBE_AddBackend(cli, te->host); } vs->nhosts = t->nmember; - - /* Normalize weights */ - i = 0; - a = 0.0; - assert(s > 0.0); - for (te = t->members; i < t->nmember; te++, i++) { - /* First normalize the specified weight in FP */ - b = te->weight / s; /*lint !e795 not zero division */ - /* Then accumulate to eliminate rounding errors */ - a += b; - /* Convert to unsigned in random() range */ - v = (unsigned)((1U<<31) * a); - vs->hosts[i].weight = v; - } - assert(vs->hosts[t->nmember - 1].weight > 0x7fffffff); *bp = &vs->dir; } Modified: trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c 2008-08-26 13:09:27 UTC (rev 3133) +++ trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c 2008-08-26 19:26:46 UTC (rev 3134) @@ -47,32 +47,41 @@ /*--------------------------------------------------------------------*/ struct vdi_round_robin_host { - struct backend *backend; + struct backend *backend; }; struct vdi_round_robin { - unsigned magic; -#define VDI_ROUND_ROBIN_MAGIC 0x2114a178 - struct director dir; + unsigned magic; +#define VDI_ROUND_ROBIN_MAGIC 0x2114a178 + struct director dir; struct vdi_round_robin_host *hosts; - unsigned nhosts; - unsigned next_host; + unsigned nhosts; + unsigned next_host; }; static struct vbe_conn * vdi_round_robin_getfd(struct sess *sp) { + int i; struct vdi_round_robin *vs; struct backend *backend; + struct vbe_conn *vbe; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC); CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_ROUND_ROBIN_MAGIC); - backend = vs->hosts[ vs->next_host ].backend; - vs->next_host = (vs->next_host + 1) % vs->nhosts; + for (i = 0; i < vs->nhosts; i++) { + backend = vs->hosts[vs->next_host].backend; + vs->next_host = (vs->next_host + 1) % vs->nhosts; + if (!backend->healthy) + continue; + vbe = VBE_GetVbe(sp, backend); + if (vbe != NULL) + return (vbe); + } - return (VBE_GetVbe(sp, backend)); + return (NULL); } /*lint -e{818} not const-able */ From phk at projects.linpro.no Tue Aug 26 19:59:23 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Tue, 26 Aug 2008 21:59:23 +0200 (CEST) Subject: r3135 - in trunk/varnish-cache: bin/varnishd bin/varnishtest/tests include lib/libvcl Message-ID: <20080826195923.CA9071EC10F@projects.linpro.no> Author: phk Date: 2008-08-26 21:59:23 +0200 (Tue, 26 Aug 2008) New Revision: 3135 Added: trunk/varnish-cache/bin/varnishtest/tests/v00012.vtc Modified: trunk/varnish-cache/bin/varnishd/cache.h trunk/varnish-cache/bin/varnishd/cache_backend.c trunk/varnish-cache/bin/varnishd/cache_backend.h trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c trunk/varnish-cache/include/stat_field.h trunk/varnish-cache/include/vrt.h trunk/varnish-cache/lib/libvcl/vcc_backend.c trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c Log: Varnish 2.0 bonus feature #1: backend->max_connections backend default { .host = "127.0.0.1"; .port = "9080"; .max_connections = 100; } will limit the simultaneous TCP connections to this backend to 100. Stats counter backend_busy == "Backend connections too many" tells how often we have hit this limit for a backend. Modified: trunk/varnish-cache/bin/varnishd/cache.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache.h 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/bin/varnishd/cache.h 2008-08-26 19:59:23 UTC (rev 3135) @@ -407,7 +407,6 @@ /* cache_backend_cfg.c */ void VBE_Init(void); -void VBE_DropRef(struct backend *); struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb); /* cache_backend_poll.c */ Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2008-08-26 19:59:23 UTC (rev 3135) @@ -240,6 +240,7 @@ LOCK(&bp->mtx); bp->refcount++; + bp->n_conn++; /* It mostly works */ UNLOCK(&bp->mtx); s = -1; @@ -256,6 +257,7 @@ if (s < 0) { LOCK(&bp->mtx); + bp->n_conn--; bp->refcount--; /* Only keep ref on success */ UNLOCK(&bp->mtx); } @@ -318,6 +320,11 @@ return (NULL); } + if (bp->max_conn > 0 && bp->n_conn >= bp->max_conn) { + VSL_stats->backend_busy++; + return (NULL); + } + vc = VBE_NewConn(); assert(vc->fd == -1); AZ(vc->backend); @@ -347,7 +354,7 @@ WSL(sp->wrk, SLT_BackendClose, sp->vbe->fd, "%s", bp->vcl_name); TCP_close(&sp->vbe->fd); - VBE_DropRef(bp); + VBE_DropRefConn(bp); sp->vbe->backend = NULL; VBE_ReleaseConn(sp->vbe); sp->vbe = NULL; Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/bin/varnishd/cache_backend.h 2008-08-26 19:59:23 UTC (rev 3135) @@ -113,6 +113,8 @@ struct sockaddr *ipv6; socklen_t ipv6len; + unsigned max_conn; + unsigned n_conn; VTAILQ_HEAD(, vbe_conn) connlist; struct vbp_target *probe; @@ -125,6 +127,8 @@ /* cache_backend_cfg.c */ extern MTX VBE_mtx; +void VBE_DropRefConn(struct backend *); +void VBE_DropRef(struct backend *); void VBE_DropRefLocked(struct backend *b); /* cache_backend_poll.c */ Modified: trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2008-08-26 19:59:23 UTC (rev 3135) @@ -132,6 +132,18 @@ VBE_DropRefLocked(b); } +void +VBE_DropRefConn(struct backend *b) +{ + + CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC); + + LOCK(&b->mtx); + assert(b->n_conn > 0); + b->n_conn--; + VBE_DropRefLocked(b); +} + /*--------------------------------------------------------------------*/ static void @@ -210,6 +222,7 @@ REPLACE(b->hosthdr, vb->hosthdr); b->connect_timeout = vb->connect_timeout; + b->max_conn = vb->max_connections; /* * Copy over the sockaddrs @@ -252,10 +265,9 @@ ASSERT_CLI(); VTAILQ_FOREACH(b, &backends, list) { CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC); - cli_out(cli, "%p %s %d\n", - b, - b->vcl_name, - b->refcount); + cli_out(cli, "%p %s %d %d/%d\n", + b, b->vcl_name, b->refcount, + b->n_conn, b->max_conn); } } Added: trunk/varnish-cache/bin/varnishtest/tests/v00012.vtc =================================================================== --- trunk/varnish-cache/bin/varnishtest/tests/v00012.vtc (rev 0) +++ trunk/varnish-cache/bin/varnishtest/tests/v00012.vtc 2008-08-26 19:59:23 UTC (rev 3135) @@ -0,0 +1,43 @@ +# $Id$ + +test "Check backend connection limit" + +server s1 { + rxreq + sema r1 sync 2 + sema r2 sync 2 + txresp +} -start + +varnish v1 -vcl { + + backend default { + .host = "127.0.0.1"; + .port = "9080"; + .max_connections = 1; + } + sub vcl_recv { + pass; + } +} -start + +client c1 { + txreq + rxresp + expect resp.status == 200 +} -start + + +client c2 { + sema r1 sync 2 + txreq + rxresp + expect resp.status == 503 +} -run + +varnish v1 -cli "debug.backend" + +sema r2 sync 2 +client c1 -wait + +varnish v1 -expect backend_busy == 1 Modified: trunk/varnish-cache/include/stat_field.h =================================================================== --- trunk/varnish-cache/include/stat_field.h 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/include/stat_field.h 2008-08-26 19:59:23 UTC (rev 3135) @@ -38,6 +38,7 @@ MAC_STAT(backend_conn, uint64_t, 'a', "Backend connections success") MAC_STAT(backend_unhealthy, uint64_t, 'a', "Backend connections not attempted") +MAC_STAT(backend_busy, uint64_t, 'a', "Backend connections too many") MAC_STAT(backend_fail, uint64_t, 'a', "Backend connections failures") MAC_STAT(backend_reuse, uint64_t, 'a', "Backend connections reuses") MAC_STAT(backend_recycle, uint64_t, 'a', "Backend connections recycles") Modified: trunk/varnish-cache/include/vrt.h =================================================================== --- trunk/varnish-cache/include/vrt.h 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/include/vrt.h 2008-08-26 19:59:23 UTC (rev 3135) @@ -69,6 +69,7 @@ const unsigned char *ipv6_sockaddr; double connect_timeout; + unsigned max_connections; struct vrt_backend_probe probe; }; Modified: trunk/varnish-cache/lib/libvcl/vcc_backend.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/lib/libvcl/vcc_backend.c 2008-08-26 19:59:23 UTC (rev 3135) @@ -476,13 +476,16 @@ const char *ep; struct fld_spec *fs; struct vsb *vsb; + unsigned u; fs = vcc_FldSpec(tl, "!host", "?port", "?host_header", "?connect_timeout", - "?probe", NULL); + "?probe", + "?max_connections", + NULL); t_first = tl->t; ExpectErr(tl, '{'); @@ -546,6 +549,13 @@ Fb(tl, 0, ",\n"); ExpectErr(tl, ';'); vcc_NextToken(tl); + } else if (vcc_IdIs(t_field, "max_connections")) { + u = vcc_UintVal(tl); + vcc_NextToken(tl); + ERRCHK(tl); + ExpectErr(tl, ';'); + vcc_NextToken(tl); + Fb(tl, 0, "\t.max_connections = %u,\n", u); } else if (vcc_IdIs(t_field, "probe")) { vcc_ParseProbe(tl); ERRCHK(tl); Modified: trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-26 19:26:46 UTC (rev 3134) +++ trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-26 19:59:23 UTC (rev 3135) @@ -349,6 +349,7 @@ vsb_cat(sb, " const unsigned char *ipv6_sockaddr;\n"); vsb_cat(sb, "\n"); vsb_cat(sb, " double connect_timeout;\n"); + vsb_cat(sb, " unsigned max_connections;\n"); vsb_cat(sb, " struct vrt_backend_probe probe;\n"); vsb_cat(sb, "};\n"); vsb_cat(sb, "\n"); From ingvar at projects.linpro.no Wed Aug 27 07:13:26 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Wed, 27 Aug 2008 09:13:26 +0200 (CEST) Subject: r3136 - trunk/varnish-cache/redhat Message-ID: <20080827071326.AAF721EC10B@projects.linpro.no> Author: ingvar Date: 2008-08-27 09:13:26 +0200 (Wed, 27 Aug 2008) New Revision: 3136 Modified: trunk/varnish-cache/redhat/varnish.spec trunk/varnish-cache/redhat/varnishlog.initrc Log: Fixed up init script for varnishlog Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-26 19:59:23 UTC (rev 3135) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-27 07:13:26 UTC (rev 3136) @@ -1,7 +1,7 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: 0.3.20080826svn3132%{?dist} +Release: 0.4.20080827svn3135%{?dist} License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ @@ -197,6 +197,9 @@ %postun libs -p /sbin/ldconfig %changelog +* Wed Aug 27 2008 Ingvar Hagelund - 2.0-0.4.20080827svn3136 +- Fixed up init script for varnishlog too + * Mon Aug 25 2008 Ingvar Hagelund - 2.0-0.3.20080825svn3125 - Fixing up init script according to newer Fedora standards - The build now runs the test suite after compiling Modified: trunk/varnish-cache/redhat/varnishlog.initrc =================================================================== --- trunk/varnish-cache/redhat/varnishlog.initrc 2008-08-26 19:59:23 UTC (rev 3135) +++ trunk/varnish-cache/redhat/varnishlog.initrc 2008-08-27 07:13:26 UTC (rev 3136) @@ -1,77 +1,116 @@ #! /bin/sh # -# varnishlog Control the varnish HTTP accelerator logging daemon +# varnishlog Control the varnish logging daemon # # chkconfig: - 90 10 -# description: HTTP accelerator logging daemon +# description: Varnish logging daemon # processname: varnishlog # config: # pidfile: /var/run/varnish/varnishlog.pid +### BEGIN INIT INFO +# Provides: varnishlog +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Short-Description: start and stop varnishlog +# Description: Varnish HTTP accelerator logging daemon +### END INIT INFO + # Source function library. . /etc/init.d/functions -RETVAL=0 -PROCNAME=varnishlog +retval=0 +pidfile="/var/run/varnishlog.pid" +lockfile="/var/lock/subsys/varnishlog" +logfile="/var/log/varnish/varnish.log" -DAEMON="/usr/bin/varnishlog" -PIDFILE="/var/run/varnish/varnishlog.pid" -LOCKFILE="/var/lock/subsys/varnishlog" -LOGFILE="/var/log/varnish/varnish.log" +exec="/usr/bin/varnishlog" +prog="varnishlog" -DAEMON_OPTS="-a -w ${LOGFILE} -D -P $PIDFILE" +DAEMON_OPTS="-a -w $logfile -D -P $pidfile" -mkdir -p /var/run/varnish 2>/dev/null +# Include varnish defaults +[ -e /etc/sysconfig/varnishlog ] && . /etc/sysconfig/varnishlog -# See how we were called. -case "$1" in - start) - echo -n "Starting varnish logging daeon: " - daemon --pidfile $PIDFILE $DAEMON "$DAEMON_OPTS" - sleep 1 - pkill -0 $PROCNAME - RETVAL=$? - if [ $RETVAL -eq 0 ] +lockfile=/var/lock/subsys/$prog + +start() { + + if [ ! -x $exec ] then - echo_success - touch $LOCKFILE - else - echo_failure + echo $exec not found + exit 5 fi + + echo -n "Starting varnish logging daemon: " + + daemon --pidfile $pidfile $exec "$DAEMON_OPTS" echo - ;; - stop) - echo -n "Stopping varnish logging daemon: " - killproc -p $PIDFILE $DAEMON - RETVAL=$? - if [ $RETVAL -eq 0 ] - then - echo_success - rm -f $LOCKFILE $PIDFILE - else - echo_failure - fi + return $retval +} + +stop() { + echo -n "Stopping varnish daemon: " + killproc $prog + retval=$? echo - ;; - status) - status -p $PIDFILE $PROCNAME - RETVAL=$? - ;; - restart|reload) - $0 stop - $0 start - RETVAL=$? - ;; - condrestart) - if [ -f $PIDFILE ]; then - $0 stop - $0 start - RETVAL=$? - fi - ;; - *) - echo "Usage: $0 {start|stop|status|restart|condrestart}" - exit 1 + [ $retval -eq 0 ] && rm -f $lockfile + return $retval +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + status -p $pidfile $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + +# See how we were called. +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + + exit 2 esac -exit $RETVAL +exit $? + From phk at projects.linpro.no Wed Aug 27 14:22:03 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Wed, 27 Aug 2008 16:22:03 +0200 (CEST) Subject: r3137 - trunk/varnish-cache/bin/varnishd Message-ID: <20080827142203.E1AC11EC11B@projects.linpro.no> Author: phk Date: 2008-08-27 16:22:03 +0200 (Wed, 27 Aug 2008) New Revision: 3137 Modified: trunk/varnish-cache/bin/varnishd/varnishd.c Log: Add runtime check that parsing of timestamps actually work. Modified: trunk/varnish-cache/bin/varnishd/varnishd.c =================================================================== --- trunk/varnish-cache/bin/varnishd/varnishd.c 2008-08-27 07:13:26 UTC (rev 3136) +++ trunk/varnish-cache/bin/varnishd/varnishd.c 2008-08-27 14:22:03 UTC (rev 3137) @@ -446,6 +446,9 @@ */ AZ(setenv("TZ", "UTC", 1)); tzset(); + assert(TIM_parse("Sun, 06 Nov 1994 08:49:37 GMT") == 784111777); + assert(TIM_parse("Sunday, 06-Nov-94 08:49:37 GMT") == 784111777); + assert(TIM_parse("Sun Nov 6 08:49:37 1994") == 784111777); memset(cli, 0, sizeof cli); cli[0].sb = vsb_newauto(); From phk at projects.linpro.no Thu Aug 28 09:11:57 2008 From: phk at projects.linpro.no (phk at projects.linpro.no) Date: Thu, 28 Aug 2008 11:11:57 +0200 (CEST) Subject: r3138 - in trunk/varnish-cache: bin/varnishd include lib/libvcl Message-ID: <20080828091157.7A4741EC10B@projects.linpro.no> Author: phk Date: 2008-08-28 11:11:41 +0200 (Thu, 28 Aug 2008) New Revision: 3138 Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c trunk/varnish-cache/include/vrt.h trunk/varnish-cache/lib/libvcl/vcc_dir_random.c trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c Log: Make it possible to configure the number of retries the random director will make at getting a backend connection. By default it tries as many times as it has members. Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c =================================================================== --- trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-27 14:22:03 UTC (rev 3137) +++ trunk/varnish-cache/bin/varnishd/cache_dir_random.c 2008-08-28 09:11:41 UTC (rev 3138) @@ -57,6 +57,8 @@ unsigned magic; #define VDI_RANDOM_MAGIC 0x3771ae23 struct director dir; + + unsigned retries; struct vdi_random_host *hosts; unsigned nhosts; }; @@ -74,7 +76,7 @@ CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_RANDOM_MAGIC); k = 0; - for (k = 0; k < 4; ) { /* XXX: 4 is arbitrary */ + for (k = 0; k < vs->retries; ) { r = random() / 2147483648.0; /* 2^31 */ assert(r >= 0.0 && r < 1.0); @@ -143,7 +145,6 @@ struct vdi_random *vs; const struct vrt_dir_random_entry *te; struct vdi_random_host *vh; - double s; int i; (void)cli; @@ -159,7 +160,9 @@ vs->dir.getfd = vdi_random_getfd; vs->dir.fini = vdi_random_fini; - s = 0; + vs->retries = t->retries; + if (vs->retries == 0) + vs->retries = t->nmember; vh = vs->hosts; te = t->members; for (i = 0; i < t->nmember; i++, vh++, te++) { Modified: trunk/varnish-cache/include/vrt.h =================================================================== --- trunk/varnish-cache/include/vrt.h 2008-08-27 14:22:03 UTC (rev 3137) +++ trunk/varnish-cache/include/vrt.h 2008-08-28 09:11:41 UTC (rev 3138) @@ -93,6 +93,7 @@ struct vrt_dir_random { const char *name; + unsigned retries; unsigned nmember; const struct vrt_dir_random_entry *members; }; Modified: trunk/varnish-cache/lib/libvcl/vcc_dir_random.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_dir_random.c 2008-08-27 14:22:03 UTC (rev 3137) +++ trunk/varnish-cache/lib/libvcl/vcc_dir_random.c 2008-08-28 09:11:41 UTC (rev 3138) @@ -54,12 +54,30 @@ { struct token *t_field, *t_be; int nbh, nelem; - struct fld_spec *fs; - unsigned u; + struct fld_spec *fs, *mfs; + unsigned u, retries; const char *first; - fs = vcc_FldSpec(tl, "!backend", "!weight", NULL); + fs = vcc_FldSpec(tl, "?retries", NULL); + retries = 0; + while (tl->t->tok != '{') { + vcc_IsField(tl, &t_field, fs); + ERRCHK(tl); + if (vcc_IdIs(t_field, "retries")) { + ExpectErr(tl, CNUM); + retries = vcc_UintVal(tl); + ERRCHK(tl); + vcc_NextToken(tl); + ExpectErr(tl, ';'); + vcc_NextToken(tl); + } else { + ErrInternal(tl); + } + } + + mfs = vcc_FldSpec(tl, "!backend", "!weight", NULL); + Fc(tl, 0, "\nstatic const struct vrt_dir_random_entry vdre_%.*s[] = {\n", PF(t_dir)); @@ -67,7 +85,7 @@ for (nelem = 0; tl->t->tok != '}'; nelem++) { /* List of members */ first = ""; t_be = tl->t; - vcc_ResetFldSpec(fs); + vcc_ResetFldSpec(mfs); nbh = -1; ExpectErr(tl, '{'); @@ -75,7 +93,7 @@ Fc(tl, 0, "\t{"); while (tl->t->tok != '}') { /* Member fields */ - vcc_IsField(tl, &t_field, fs); + vcc_IsField(tl, &t_field, mfs); ERRCHK(tl); if (vcc_IdIs(t_field, "backend")) { vcc_ParseBackendHost(tl, &nbh, @@ -85,6 +103,7 @@ } else if (vcc_IdIs(t_field, "weight")) { ExpectErr(tl, CNUM); u = vcc_UintVal(tl); + ERRCHK(tl); if (u == 0) { vsb_printf(tl->sb, "The .weight must be higher " @@ -103,7 +122,7 @@ } first = ", "; } - vcc_FieldsOk(tl, fs); + vcc_FieldsOk(tl, mfs); if (tl->err) { vsb_printf(tl->sb, "\nIn member host specfication starting at:\n"); @@ -118,6 +137,7 @@ "\nstatic const struct vrt_dir_random vdr_%.*s = {\n", PF(t_dir)); Fc(tl, 0, "\t.name = \"%.*s\",\n", PF(t_dir)); + Fc(tl, 0, "\t.retries = %u,\n", retries); Fc(tl, 0, "\t.nmember = %d,\n", nelem); Fc(tl, 0, "\t.members = vdre_%.*s,\n", PF(t_dir)); Fc(tl, 0, "};\n"); Modified: trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c =================================================================== --- trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-27 14:22:03 UTC (rev 3137) +++ trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c 2008-08-28 09:11:41 UTC (rev 3138) @@ -373,6 +373,7 @@ vsb_cat(sb, "\n"); vsb_cat(sb, "struct vrt_dir_random {\n"); vsb_cat(sb, " const char *name;\n"); + vsb_cat(sb, " unsigned retries;\n"); vsb_cat(sb, " unsigned nmember;\n"); vsb_cat(sb, " const struct vrt_dir_random_entry *members;\n"); vsb_cat(sb, "};\n"); From tfheen at projects.linpro.no Thu Aug 28 11:03:24 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Thu, 28 Aug 2008 13:03:24 +0200 (CEST) Subject: r3139 - trunk/varnish-cache/bin/varnishtest Message-ID: <20080828110324.6F5DA1EC209@projects.linpro.no> Author: tfheen Date: 2008-08-28 13:03:23 +0200 (Thu, 28 Aug 2008) New Revision: 3139 Modified: trunk/varnish-cache/bin/varnishtest/Makefile.am Log: Add _.ok to the list of files we clean on make distclean Modified: trunk/varnish-cache/bin/varnishtest/Makefile.am =================================================================== --- trunk/varnish-cache/bin/varnishtest/Makefile.am 2008-08-28 09:11:41 UTC (rev 3138) +++ trunk/varnish-cache/bin/varnishtest/Makefile.am 2008-08-28 11:03:23 UTC (rev 3139) @@ -3,6 +3,8 @@ TESTS_ENVIRONMENT = ./varnishtest TESTS = $(srcdir)/tests/*.vtc +DISTCLEANFILES = _.ok + INCLUDES = -I$(top_srcdir)/include bin_PROGRAMS = varnishtest From tfheen at projects.linpro.no Fri Aug 29 09:37:20 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Fri, 29 Aug 2008 11:37:20 +0200 (CEST) Subject: r3140 - in trunk/varnish-cache/lib: libvarnish libvarnishapi libvarnishcompat libvcl Message-ID: <20080829093720.070881EC46B@projects.linpro.no> Author: tfheen Date: 2008-08-29 11:37:19 +0200 (Fri, 29 Aug 2008) New Revision: 3140 Modified: trunk/varnish-cache/lib/libvarnish/Makefile.am trunk/varnish-cache/lib/libvarnishapi/Makefile.am trunk/varnish-cache/lib/libvarnishcompat/Makefile.am trunk/varnish-cache/lib/libvcl/Makefile.am Log: Bump SONAME We're not binary compatible, so bump soname. Closes: #293 Modified: trunk/varnish-cache/lib/libvarnish/Makefile.am =================================================================== --- trunk/varnish-cache/lib/libvarnish/Makefile.am 2008-08-28 11:03:23 UTC (rev 3139) +++ trunk/varnish-cache/lib/libvarnish/Makefile.am 2008-08-29 09:37:19 UTC (rev 3140) @@ -4,6 +4,8 @@ lib_LTLIBRARIES = libvarnish.la +libvarnish_la_LDFLAGS = -version-info 1:0:0 + libvarnish_la_SOURCES = \ argv.c \ assert.c \ Modified: trunk/varnish-cache/lib/libvarnishapi/Makefile.am =================================================================== --- trunk/varnish-cache/lib/libvarnishapi/Makefile.am 2008-08-28 11:03:23 UTC (rev 3139) +++ trunk/varnish-cache/lib/libvarnishapi/Makefile.am 2008-08-29 09:37:19 UTC (rev 3140) @@ -4,6 +4,8 @@ lib_LTLIBRARIES = libvarnishapi.la +libvarnishapi_la_LDFLAGS = -version-info 1:0:0 + libvarnishapi_la_SOURCES = \ base64.c \ instance.c \ Modified: trunk/varnish-cache/lib/libvarnishcompat/Makefile.am =================================================================== --- trunk/varnish-cache/lib/libvarnishcompat/Makefile.am 2008-08-28 11:03:23 UTC (rev 3139) +++ trunk/varnish-cache/lib/libvarnishcompat/Makefile.am 2008-08-29 09:37:19 UTC (rev 3140) @@ -4,6 +4,8 @@ lib_LTLIBRARIES = libvarnishcompat.la +libvarnishcompat_la_LDFLAGS = -version-info 1:0:0 + libvarnishcompat_la_SOURCES = \ asprintf.c \ daemon.c \ Modified: trunk/varnish-cache/lib/libvcl/Makefile.am =================================================================== --- trunk/varnish-cache/lib/libvcl/Makefile.am 2008-08-28 11:03:23 UTC (rev 3139) +++ trunk/varnish-cache/lib/libvcl/Makefile.am 2008-08-29 09:37:19 UTC (rev 3140) @@ -4,6 +4,8 @@ lib_LTLIBRARIES = libvcl.la +libvcl_la_LDFLAGS = -version-info 1:0:0 + libvcl_la_SOURCES = \ vcc_priv.h \ vcc_compile.h \ From tfheen at projects.linpro.no Fri Aug 29 10:54:30 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Fri, 29 Aug 2008 12:54:30 +0200 (CEST) Subject: r3141 - trunk/varnish-cache Message-ID: <20080829105430.569D71EC815@projects.linpro.no> Author: tfheen Date: 2008-08-29 12:54:30 +0200 (Fri, 29 Aug 2008) New Revision: 3141 Modified: trunk/varnish-cache/configure.ac Log: Release 2.0-beta1 Modified: trunk/varnish-cache/configure.ac =================================================================== --- trunk/varnish-cache/configure.ac 2008-08-29 09:37:19 UTC (rev 3140) +++ trunk/varnish-cache/configure.ac 2008-08-29 10:54:30 UTC (rev 3141) @@ -3,7 +3,7 @@ AC_PREREQ(2.59) AC_COPYRIGHT([Copyright (c) 2006-2008 Linpro AS / Verdens Gang AS]) AC_REVISION([$Id$]) -AC_INIT([Varnish], [trunk], [varnish-dev at projects.linpro.no]) +AC_INIT([Varnish], [2.0-beta1], [varnish-dev at projects.linpro.no]) AC_CONFIG_SRCDIR(include/varnishapi.h) AM_CONFIG_HEADER(config.h) From tfheen at projects.linpro.no Fri Aug 29 10:54:50 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Fri, 29 Aug 2008 12:54:50 +0200 (CEST) Subject: r3142 - tags Message-ID: <20080829105450.12A4B1EC46B@projects.linpro.no> Author: tfheen Date: 2008-08-29 12:54:49 +0200 (Fri, 29 Aug 2008) New Revision: 3142 Added: tags/varnish-2.0-beta1/ Log: Tag 2.0-beta1 Copied: tags/varnish-2.0-beta1 (from rev 3141, trunk) From tfheen at projects.linpro.no Fri Aug 29 10:55:14 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Fri, 29 Aug 2008 12:55:14 +0200 (CEST) Subject: r3143 - trunk/varnish-cache Message-ID: <20080829105514.B8EB51EC815@projects.linpro.no> Author: tfheen Date: 2008-08-29 12:55:14 +0200 (Fri, 29 Aug 2008) New Revision: 3143 Modified: trunk/varnish-cache/configure.ac Log: Set release back to trunk in configure.ac Modified: trunk/varnish-cache/configure.ac =================================================================== --- trunk/varnish-cache/configure.ac 2008-08-29 10:54:49 UTC (rev 3142) +++ trunk/varnish-cache/configure.ac 2008-08-29 10:55:14 UTC (rev 3143) @@ -3,7 +3,7 @@ AC_PREREQ(2.59) AC_COPYRIGHT([Copyright (c) 2006-2008 Linpro AS / Verdens Gang AS]) AC_REVISION([$Id$]) -AC_INIT([Varnish], [2.0-beta1], [varnish-dev at projects.linpro.no]) +AC_INIT([Varnish], [trunk], [varnish-dev at projects.linpro.no]) AC_CONFIG_SRCDIR(include/varnishapi.h) AM_CONFIG_HEADER(config.h) From ingvar at projects.linpro.no Fri Aug 29 11:52:26 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Fri, 29 Aug 2008 13:52:26 +0200 (CEST) Subject: r3144 - trunk/varnish-cache/redhat Message-ID: <20080829115226.7B9431EC815@projects.linpro.no> Author: ingvar Date: 2008-08-29 13:52:26 +0200 (Fri, 29 Aug 2008) New Revision: 3144 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Bumped version numbers and source url for first beta release Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-29 10:55:14 UTC (rev 3143) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-29 11:52:26 UTC (rev 3144) @@ -1,12 +1,13 @@ Summary: Varnish is a high-performance HTTP accelerator Name: varnish Version: 2.0 -Release: 0.4.20080827svn3135%{?dist} +Release: 0.5.beta1%{?dist} License: BSD Group: System Environment/Daemons URL: http://www.varnish-cache.org/ -Source0: http://downloads.sourceforge.net/varnish/varnish-%{version}.tar.gz #Source0: http://varnish.projects.linpro.no/static/varnish-cache.tar.gz +#Source0: http://downloads.sourceforge.net/varnish/varnish-%{version}.tar.gz +Source0: http://downloads.sourceforge.net/varnish/varnish-2.0-beta1.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) # The svn sources needs autoconf, automake and libtool to generate a suitable # configure script. Release tarballs would not need this @@ -61,8 +62,8 @@ #Varnish is a high-performance HTTP accelerator %prep -%setup -q -#%setup -n varnish-cache +#%setup -q +%setup -n varnish-2.0-beta1 # The svn sources needs to generate a suitable configure script # Release tarballs would not need this @@ -197,6 +198,9 @@ %postun libs -p /sbin/ldconfig %changelog +* Fri Aug 29 2008 Ingvar Hagelund - 2.0-0.5.beta1 +- Bumped version numbers and source url for first beta release \o/ + * Wed Aug 27 2008 Ingvar Hagelund - 2.0-0.4.20080827svn3136 - Fixed up init script for varnishlog too From tfheen at projects.linpro.no Fri Aug 29 12:35:00 2008 From: tfheen at projects.linpro.no (tfheen at projects.linpro.no) Date: Fri, 29 Aug 2008 14:35:00 +0200 (CEST) Subject: r3145 - trunk/varnish-cache/bin/varnishd Message-ID: <20080829123500.E7B7F1EC200@projects.linpro.no> Author: tfheen Date: 2008-08-29 14:35:00 +0200 (Fri, 29 Aug 2008) New Revision: 3145 Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c Log: Make it possible to get core dumps on Linux too When starting as root and then setuid-ing, we need to set the dumpable bit to get core dumps on Linux. Do so. Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c =================================================================== --- trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-29 11:52:26 UTC (rev 3144) +++ trunk/varnish-cache/bin/varnishd/mgt_child.c 2008-08-29 12:35:00 UTC (rev 3145) @@ -50,6 +50,10 @@ #include "compat/setproctitle.h" #endif +#ifdef __linux__ +#include +#endif + #include "heritage.h" #include "mgt.h" #include "cli.h" @@ -283,6 +287,15 @@ XXXAZ(setuid(params->uid)); } + /* On Linux >= 2.4, you need to set the dumpable flag + to get core dumps after you have done a setuid. */ +#ifdef __linux__ + if (prctl(PR_SET_DUMPABLE, 1) != 0) { + printf("Could not set dumpable bit. Core dumps turned " + "off\n"); + } +#endif + /* Redirect stdin/out/err */ AZ(close(STDIN_FILENO)); assert(open("/dev/null", O_RDONLY) == STDIN_FILENO); From ingvar at projects.linpro.no Fri Aug 29 12:41:27 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Fri, 29 Aug 2008 14:41:27 +0200 (CEST) Subject: r3146 - trunk/varnish-cache/redhat Message-ID: <20080829124127.A9DC41EC1FE@projects.linpro.no> Author: ingvar Date: 2008-08-29 14:41:27 +0200 (Fri, 29 Aug 2008) New Revision: 3146 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Added a missing directory to the libs-devel package (Michael Schwendt) Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-29 12:35:00 UTC (rev 3145) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-29 12:41:27 UTC (rev 3146) @@ -154,6 +154,7 @@ %{_libdir}/libvarnishapi.so %{_libdir}/libvarnishcompat.so %{_libdir}/libvcl.so +%dir %{_includedir}/varnish %{_includedir}/varnish/shmlog.h %{_includedir}/varnish/shmlog_tags.h %{_includedir}/varnish/stat_field.h @@ -200,6 +201,7 @@ %changelog * Fri Aug 29 2008 Ingvar Hagelund - 2.0-0.5.beta1 - Bumped version numbers and source url for first beta release \o/ +- Added a missing directory to the libs-devel package (Michael Schwendt) * Wed Aug 27 2008 Ingvar Hagelund - 2.0-0.4.20080827svn3136 - Fixed up init script for varnishlog too From ingvar at projects.linpro.no Fri Aug 29 20:25:37 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Fri, 29 Aug 2008 22:25:37 +0200 (CEST) Subject: r3147 - trunk/varnish-cache/redhat Message-ID: <20080829202537.E39521EC46B@projects.linpro.no> Author: ingvar Date: 2008-08-29 22:25:37 +0200 (Fri, 29 Aug 2008) New Revision: 3147 Modified: trunk/varnish-cache/redhat/varnish.spec Log: Make setup quiet in specfile => one less warning from rpmlint Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-29 12:41:27 UTC (rev 3146) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-29 20:25:37 UTC (rev 3147) @@ -63,7 +63,7 @@ %prep #%setup -q -%setup -n varnish-2.0-beta1 +%setup -q -n varnish-2.0-beta1 # The svn sources needs to generate a suitable configure script # Release tarballs would not need this From ingvar at projects.linpro.no Fri Aug 29 20:44:00 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Fri, 29 Aug 2008 22:44:00 +0200 (CEST) Subject: r3148 - trunk/varnish-cache/redhat Message-ID: <20080829204400.ACD4D1EC200@projects.linpro.no> Author: ingvar Date: 2008-08-29 22:44:00 +0200 (Fri, 29 Aug 2008) New Revision: 3148 Modified: trunk/varnish-cache/redhat/varnish.spec Log: specfile changes - Added the LICENSE file to the libs-devel package - Moved make check to its proper place Modified: trunk/varnish-cache/redhat/varnish.spec =================================================================== --- trunk/varnish-cache/redhat/varnish.spec 2008-08-29 20:25:37 UTC (rev 3147) +++ trunk/varnish-cache/redhat/varnish.spec 2008-08-29 20:44:00 UTC (rev 3148) @@ -83,7 +83,6 @@ s|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool %{__make} %{?_smp_mflags} -%{__make} check LD_LIBRARY_PATH="../../lib/libvarnish/.libs:../../lib/libvarnishcompat/.libs:../../lib/libvarnishapi/.libs:../../lib/libvcl/.libs" head -6 etc/default.vcl > redhat/default.vcl @@ -104,6 +103,9 @@ redhat/varnish.initrc redhat/varnishlog.initrc %endif +%check +%{__make} check LD_LIBRARY_PATH="../../lib/libvarnish/.libs:../../lib/libvarnishcompat/.libs:../../lib/libvarnishapi/.libs:../../lib/libvcl/.libs" + %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} INSTALL="install -p" @@ -161,6 +163,7 @@ %{_includedir}/varnish/stats.h %{_includedir}/varnish/varnishapi.h %{_libdir}/pkgconfig/varnishapi.pc +%doc LICENSE #%files libs-static #%{_libdir}/libvarnish.a @@ -202,6 +205,8 @@ * Fri Aug 29 2008 Ingvar Hagelund - 2.0-0.5.beta1 - Bumped version numbers and source url for first beta release \o/ - Added a missing directory to the libs-devel package (Michael Schwendt) +- Added the LICENSE file to the libs-devel package +- Moved make check to its proper place * Wed Aug 27 2008 Ingvar Hagelund - 2.0-0.4.20080827svn3136 - Fixed up init script for varnishlog too From ingvar at projects.linpro.no Fri Aug 29 20:49:47 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Fri, 29 Aug 2008 22:49:47 +0200 (CEST) Subject: r3149 - trunk/varnish-cache/redhat Message-ID: <20080829204947.E013E1EC1FE@projects.linpro.no> Author: ingvar Date: 2008-08-29 22:49:47 +0200 (Fri, 29 Aug 2008) New Revision: 3149 Modified: trunk/varnish-cache/redhat/varnish.initrc Log: Red Hat initscript: Removed a superfluous lockfile definiton Modified: trunk/varnish-cache/redhat/varnish.initrc =================================================================== --- trunk/varnish-cache/redhat/varnish.initrc 2008-08-29 20:44:00 UTC (rev 3148) +++ trunk/varnish-cache/redhat/varnish.initrc 2008-08-29 20:49:47 UTC (rev 3149) @@ -22,7 +22,6 @@ retval=0 pidfile=/var/run/varnish.pid -lockfile=/var/lock/subsys/varnish exec="/usr/sbin/varnishd" prog="varnishd" From ingvar at projects.linpro.no Fri Aug 29 21:38:01 2008 From: ingvar at projects.linpro.no (ingvar at projects.linpro.no) Date: Fri, 29 Aug 2008 23:38:01 +0200 (CEST) Subject: r3150 - trunk/varnish-cache/redhat Message-ID: <20080829213801.8D8851EC200@projects.linpro.no> Author: ingvar Date: 2008-08-29 23:38:01 +0200 (Fri, 29 Aug 2008) New Revision: 3150 Modified: trunk/varnish-cache/redhat/varnish.initrc trunk/varnish-cache/redhat/varnishlog.initrc Log: Red Hat init scripts: Fix previous fix. Makes rpmlint happy. Modified: trunk/varnish-cache/redhat/varnish.initrc =================================================================== --- trunk/varnish-cache/redhat/varnish.initrc 2008-08-29 20:49:47 UTC (rev 3149) +++ trunk/varnish-cache/redhat/varnish.initrc 2008-08-29 21:38:01 UTC (rev 3150) @@ -26,11 +26,11 @@ exec="/usr/sbin/varnishd" prog="varnishd" config="/etc/sysconfig/varnish" +lockfile="/var/lock/subsys/varnish" # Include varnish defaults [ -e /etc/sysconfig/varnish ] && . /etc/sysconfig/varnish -lockfile=/var/lock/subsys/$prog start() { Modified: trunk/varnish-cache/redhat/varnishlog.initrc =================================================================== --- trunk/varnish-cache/redhat/varnishlog.initrc 2008-08-29 20:49:47 UTC (rev 3149) +++ trunk/varnish-cache/redhat/varnishlog.initrc 2008-08-29 21:38:01 UTC (rev 3150) @@ -32,8 +32,6 @@ # Include varnish defaults [ -e /etc/sysconfig/varnishlog ] && . /etc/sysconfig/varnishlog -lockfile=/var/lock/subsys/$prog - start() { if [ ! -x $exec ]