[4.1] 315bdbc Introduce barriers in varnishtest

Lasse Karstensen lkarsten at varnish-software.com
Tue Jun 14 11:19:08 CEST 2016


commit 315bdbcc039cc5ae489bf3e8a6f3073c60e8d9e5
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Tue Dec 22 18:16:08 2015 +0100

    Introduce barriers in varnishtest
    
    They work like semaphores, except that they need explicit initialization
    and can optionally be shared between processes.
    
     Conflicts:
    	bin/varnishtest/tests/c00073.vtc

diff --git a/bin/varnishtest/Makefile.am b/bin/varnishtest/Makefile.am
index 2506a8a..a748fee 100644
--- a/bin/varnishtest/Makefile.am
+++ b/bin/varnishtest/Makefile.am
@@ -27,6 +27,7 @@ varnishtest_SOURCES = \
 		vtc.h \
 		vmods.h \
 		programs.h \
+		vtc_barrier.c \
 		vtc_client.c \
 		vtc_http.c \
 		vtc_main.c \
diff --git a/bin/varnishtest/Makefile.phk b/bin/varnishtest/Makefile.phk
index 438bfed..5c80efd 100644
--- a/bin/varnishtest/Makefile.phk
+++ b/bin/varnishtest/Makefile.phk
@@ -5,6 +5,7 @@ PROG_SRC += vtc_log.c
 PROG_SRC += vtc_logexp.c
 PROG_SRC += vtc_main.c
 PROG_SRC += vtc_sema.c
+PROG_SRC += vtc_barrier.c
 PROG_SRC += vtc_server.c
 PROG_SRC += vtc_varnish.c
 PROG_SRC += vtc_process.c
diff --git a/bin/varnishtest/tests/a00008.vtc b/bin/varnishtest/tests/a00008.vtc
index 3a581c8..6fe35c9 100644
--- a/bin/varnishtest/tests/a00008.vtc
+++ b/bin/varnishtest/tests/a00008.vtc
@@ -1,22 +1,25 @@
-varnishtest "Sema operations"
+varnishtest "Barrier operations"
+
+barrier b1 cond 4
+barrier b2 cond 4
 
 server s1 {
 	rxreq
-	sema r1 sync 4
+	barrier b1 sync
 	delay .9
 	txresp
 } -start
 
 server s2 {
 	rxreq
-	sema r1 sync 4
+	barrier b1 sync
 	delay .6
 	txresp
 } -start
 
 server s3 {
 	rxreq
-	sema r1 sync 4
+	barrier b1 sync
 	delay .2
 	txresp
 } -start
@@ -25,25 +28,25 @@ client c1 -connect ${s1_sock} {
 	delay .2
 	txreq
 	rxresp
-	sema r1 sync 4
+	barrier b2 sync
 } -start
 
 client c2 -connect ${s2_sock} {
 	delay .6
 	txreq
 	rxresp
-	sema r1 sync 4
+	barrier b2 sync
 } -start
 
 client c3 -connect ${s3_sock} {
 	delay .9
 	txreq
 	rxresp
-	sema r1 sync 4
+	barrier b2 sync
 } -start
 
 # Wait for all servers to have received requests
-sema r1 sync 4
+barrier b1 sync
 
 # Wait for all clients to have received responses
-sema r1 sync 4
+barrier b2 sync
diff --git a/bin/varnishtest/tests/c00073.vtc b/bin/varnishtest/tests/c00073.vtc
new file mode 100644
index 0000000..4c8d4d0
--- /dev/null
+++ b/bin/varnishtest/tests/c00073.vtc
@@ -0,0 +1,32 @@
+varnishtest "Test object trimming"
+
+barrier b1 cond 2
+barrier b2 cond 2
+
+server s1 {
+	rxreq
+	txresp -nolen -hdr "Transfer-encoding: chunked"
+	delay .2
+	chunkedlen 4096
+	barrier b1 sync
+	barrier b2 sync
+	chunkedlen 0
+} -start
+
+varnish v1 \
+	-arg "-s malloc,1m" -vcl+backend { } -start
+
+client c1 {
+	txreq
+	rxresp
+} -start
+
+barrier b1 sync
+varnish v1 -expect SMA.s0.g_bytes > 10000
+
+barrier b2 sync
+
+client c1 -wait
+
+# Removed when adopting to 4.1. VTC kept since it uses barriers.
+#varnish v1 -expect SMA.s0.g_bytes < 6000
diff --git a/bin/varnishtest/vtc.c b/bin/varnishtest/vtc.c
index aea1081..7c1ee4d 100644
--- a/bin/varnishtest/vtc.c
+++ b/bin/varnishtest/vtc.c
@@ -632,6 +632,7 @@ static const struct cmds cmds[] = {
 	{ "shell",	cmd_shell },
 	{ "err_shell",	cmd_err_shell },
 	{ "sema",	cmd_sema },
+	{ "barrier",	cmd_barrier },
 	{ "random",	cmd_random },
 	{ "feature",	cmd_feature },
 	{ "logexpect",	cmd_logexp },
@@ -655,6 +656,7 @@ exec_file(const char *fn, const char *script, const char *tmpdir,
 
 	init_macro();
 	init_sema();
+	init_barrier();
 	init_server();
 
 	/* Apply extmacro definitions */
diff --git a/bin/varnishtest/vtc.h b/bin/varnishtest/vtc.h
index 518494c..584b1ba 100644
--- a/bin/varnishtest/vtc.h
+++ b/bin/varnishtest/vtc.h
@@ -62,6 +62,7 @@ cmd_f cmd_server;
 cmd_f cmd_client;
 cmd_f cmd_varnish;
 cmd_f cmd_sema;
+cmd_f cmd_barrier;
 cmd_f cmd_logexp;
 cmd_f cmd_process;
 
@@ -74,6 +75,7 @@ extern int vtc_witness;
 extern int feature_dns;
 
 void init_sema(void);
+void init_barrier(void);
 void init_server(void);
 
 int http_process(struct vtclog *vl, const char *spec, int sock, int *sfd);
diff --git a/bin/varnishtest/vtc_barrier.c b/bin/varnishtest/vtc_barrier.c
new file mode 100644
index 0000000..448eb0d
--- /dev/null
+++ b/bin/varnishtest/vtc_barrier.c
@@ -0,0 +1,239 @@
+/*-
+ * Copyright (c) 2005 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Dridi Boukelmoune <dridi at varnish-software.com>
+ *
+ * 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.
+ */
+
+#include "config.h"
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "vtc.h"
+
+enum barrier_e {
+	BARRIER_NONE = 0,
+	BARRIER_COND,
+	BARRIER_SOCK,
+};
+
+struct barrier {
+	unsigned		magic;
+#define BARRIER_MAGIC		0x7b54c275
+	char			*name;
+	VTAILQ_ENTRY(barrier)	list;
+	pthread_mutex_t		mtx;
+	pthread_cond_t		cond;
+
+	unsigned		waiters;
+	unsigned		expected;
+
+	enum barrier_e		type;
+};
+
+static pthread_mutex_t		barrier_mtx;
+static VTAILQ_HEAD(, barrier)	barriers = VTAILQ_HEAD_INITIALIZER(barriers);
+
+static struct barrier *
+barrier_new(char *name, struct vtclog *vl)
+{
+	struct barrier *b;
+
+	ALLOC_OBJ(b, BARRIER_MAGIC);
+	AN(b);
+	AN(name);
+	if (*name != 'b')
+		vtc_log(vl, 0, "Barrier name must start with 'b' (%s)", name);
+	REPLACE(b->name, name);
+
+	AZ(pthread_mutex_init(&b->mtx, NULL));
+	AZ(pthread_cond_init(&b->cond, NULL));
+	b->waiters = 0;
+	b->expected = 0;
+	VTAILQ_INSERT_TAIL(&barriers, b, list);
+	return (b);
+}
+
+/**********************************************************************
+ * Init a barrier
+ */
+
+static void
+barrier_expect(struct barrier *b, const char *av, struct vtclog *vl)
+{
+	unsigned expected;
+
+	if (b->type != BARRIER_NONE)
+		vtc_log(vl, 0,
+		    "Barrier(%s) use error: already initialized", b->name);
+
+	AZ(b->expected);
+	AZ(b->waiters);
+	expected = strtoul(av, NULL, 0);
+	if (expected < 2)
+		vtc_log(vl, 0,
+		    "Barrier(%s) use error: wrong expectation (%u)",
+		    b->name, expected);
+
+	b->expected = expected;
+}
+
+static void
+barrier_cond(struct barrier *b, const char *av, struct vtclog *vl)
+{
+
+	CHECK_OBJ_NOTNULL(b, BARRIER_MAGIC);
+	barrier_expect(b, av, vl);
+	b->type = BARRIER_COND;
+}
+
+static void
+barrier_sock(struct barrier *b, const char *av, struct vtclog *vl)
+{
+
+	CHECK_OBJ_NOTNULL(b, BARRIER_MAGIC);
+	barrier_expect(b, av, vl);
+	b->type = BARRIER_SOCK;
+	INCOMPL();
+}
+
+/**********************************************************************
+ * Sync a barrier
+ */
+
+static void
+barrier_cond_sync(struct barrier *b, struct vtclog *vl)
+{
+
+	CHECK_OBJ_NOTNULL(b, BARRIER_MAGIC);
+	assert(b->type == BARRIER_COND);
+
+	assert(b->waiters <= b->expected);
+	if (b->waiters == b->expected)
+		vtc_log(vl, 0,
+		    "Barrier(%s) use error: more waiters than the %u expected",
+		    b->name, b->expected);
+
+	if (++b->waiters == b->expected) {
+		vtc_log(vl, 4, "Barrier(%s) wake %u", b->name, b->expected);
+		AZ(pthread_cond_broadcast(&b->cond));
+	}
+	else {
+		vtc_log(vl, 4, "Barrier(%s) wait %u of %u",
+		    b->name, b->waiters, b->expected);
+		AZ(pthread_cond_wait(&b->cond, &b->mtx));
+	}
+}
+
+static void
+barrier_sync(struct barrier *b, struct vtclog *vl)
+{
+
+	CHECK_OBJ_NOTNULL(b, BARRIER_MAGIC);
+
+	switch (b->type) {
+	case BARRIER_NONE:
+		vtc_log(vl, 0,
+		    "Barrier(%s) use error: not initialized", b->name);
+	case BARRIER_COND:
+		barrier_cond_sync(b, vl);
+		break;
+	case BARRIER_SOCK:
+		INCOMPL();
+		break;
+	default:
+		WRONG("Wrong barrier type");
+	}
+}
+
+/**********************************************************************
+ * Barrier command dispatch
+ */
+
+void
+cmd_barrier(CMD_ARGS)
+{
+	struct barrier *b, *b2;
+
+	(void)priv;
+	(void)cmd;
+
+	if (av == NULL) {
+		AZ(pthread_mutex_lock(&barrier_mtx));
+		/* Reset and free */
+		VTAILQ_FOREACH_SAFE(b, &barriers, list, b2) {
+			AZ(pthread_mutex_lock(&b->mtx));
+			assert(b->type != BARRIER_NONE);
+			assert(b->waiters == b->expected);
+			AZ(pthread_mutex_unlock(&b->mtx));
+		}
+		AZ(pthread_mutex_unlock(&barrier_mtx));
+		return;
+	}
+
+	AZ(strcmp(av[0], "barrier"));
+	av++;
+
+	AZ(pthread_mutex_lock(&barrier_mtx));
+	VTAILQ_FOREACH(b, &barriers, list)
+		if (!strcmp(b->name, av[0]))
+			break;
+	if (b == NULL)
+		b = barrier_new(av[0], vl);
+	av++;
+	AZ(pthread_mutex_lock(&b->mtx));
+	AZ(pthread_mutex_unlock(&barrier_mtx));
+
+	for (; *av != NULL; av++) {
+		if (!strcmp(*av, "cond")) {
+			av++;
+			AN(*av);
+			barrier_cond(b, *av, vl);
+			continue;
+		}
+		if (!strcmp(*av, "sock")) {
+			av++;
+			AN(*av);
+			barrier_sock(b, *av, vl);
+			continue;
+		}
+		if (!strcmp(*av, "sync")) {
+			barrier_sync(b, vl);
+			continue;
+		}
+		vtc_log(vl, 0, "Unknown barrier argument: %s", *av);
+	}
+	AZ(pthread_mutex_unlock(&b->mtx));
+}
+
+void
+init_barrier(void)
+{
+
+	AZ(pthread_mutex_init(&barrier_mtx, NULL));
+}
diff --git a/bin/varnishtest/vtc_http.c b/bin/varnishtest/vtc_http.c
index 5144d36..48759de 100644
--- a/bin/varnishtest/vtc_http.c
+++ b/bin/varnishtest/vtc_http.c
@@ -1378,6 +1378,7 @@ static const struct cmds http_cmds[] = {
 	{ "chunked",		cmd_http_chunked },
 	{ "chunkedlen",		cmd_http_chunkedlen },
 	{ "delay",		cmd_delay },
+	{ "barrier",		cmd_barrier },
 	{ "sema",		cmd_sema },
 	{ "expect_close",	cmd_http_expect_close },
 	{ "close",		cmd_http_close },
diff --git a/doc/graphviz/cache_fetch.svg b/doc/graphviz/cache_fetch.svg
deleted file mode 100644
index ecd062a..0000000
--- a/doc/graphviz/cache_fetch.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.38.0 (20140413.2041)
- -->
-<!-- Title: cache_fetch Pages: 1 -->
-<svg width="842pt" height="723pt"
- viewBox="36.00 36.00 806.00 686.74" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(40 682.74)">
-<title>cache_fetch</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-646.74 766,-646.74 766,4 -4,4"/>
-<g id="clust1" class="cluster"><title>cluster_backend</title>
-<polygon fill="aliceblue" stroke="aliceblue" points="8,-8 8,-634.74 754,-634.74 754,-8 8,-8"/>
-</g>
-<!-- RETRY -->
-<g id="node1" class="node"><title>RETRY</title>
-<text text-anchor="middle" x="416" y="-613.04" font-family="Times,serif" font-size="14.00">RETRY</text>
-</g>
-<!-- v_b_f -->
-<g id="node4" class="node"><title>v_b_f</title>
-<polygon fill="none" stroke="black" points="190.5,-492.24 190.5,-561.24 379.5,-561.24 379.5,-492.24 190.5,-492.24"/>
-<text text-anchor="middle" x="285" y="-546.04" font-family="Times,serif" font-size="14.00">vbf_stp_startfetch:</text>
-<polyline fill="none" stroke="black" points="190.5,-538.24 379.5,-538.24 "/>
-<text text-anchor="middle" x="256.5" y="-523.04" font-family="Times,serif" font-size="14.00">vcl_backend_fetch{}</text>
-<polyline fill="none" stroke="black" points="322.5,-515.24 322.5,-538.24 "/>
-<text text-anchor="middle" x="351" y="-523.04" font-family="Times,serif" font-size="14.00">bereq.*</text>
-<polyline fill="none" stroke="black" points="190.5,-515.24 379.5,-515.24 "/>
-<text text-anchor="middle" x="242" y="-500.04" font-family="Times,serif" font-size="14.00">abandon</text>
-<polyline fill="none" stroke="black" points="293.5,-492.24 293.5,-515.24 "/>
-<text text-anchor="middle" x="336.5" y="-500.04" font-family="Times,serif" font-size="14.00">fetch</text>
-</g>
-<!-- RETRY->v_b_f -->
-<g id="edge4" class="edge"><title>RETRY->v_b_f</title>
-<path fill="none" stroke="purple" d="M390.431,-598.564C376.989,-589.534 359.918,-578.067 343.449,-567.003"/>
-<polygon fill="purple" stroke="purple" points="345.166,-563.941 334.914,-561.27 341.263,-569.752 345.166,-563.941"/>
-</g>
-<!-- v_b_f_BGFETCH -->
-<g id="node2" class="node"><title>v_b_f_BGFETCH</title>
-<polygon fill="turquoise" stroke="turquoise" points="367,-634.74 289,-634.74 289,-598.74 367,-598.74 367,-634.74"/>
-<text text-anchor="middle" x="328" y="-613.04" font-family="Times,serif" font-size="14.00">BGFETCH</text>
-</g>
-<!-- v_b_f_BGFETCH->v_b_f -->
-<g id="edge1" class="edge"><title>v_b_f_BGFETCH->v_b_f</title>
-<path fill="none" stroke="green" stroke-width="2" d="M319.505,-598.354C315.569,-590.301 310.703,-580.342 305.879,-570.468"/>
-<polygon fill="green" stroke="green" stroke-width="2" points="309.023,-568.93 301.488,-561.482 302.733,-572.003 309.023,-568.93"/>
-</g>
-<!-- v_b_f_FETCH -->
-<g id="node3" class="node"><title>v_b_f_FETCH</title>
-<polygon fill="turquoise" stroke="turquoise" points="270.5,-634.74 211.5,-634.74 211.5,-598.74 270.5,-598.74 270.5,-634.74"/>
-<text text-anchor="middle" x="241" y="-613.04" font-family="Times,serif" font-size="14.00">FETCH</text>
-</g>
-<!-- v_b_f_FETCH->v_b_f -->
-<g id="edge2" class="edge"><title>v_b_f_FETCH->v_b_f</title>
-<path fill="none" stroke="blue" stroke-width="2" d="M244.189,-598.354C247.348,-590.301 251.913,-580.342 256.888,-570.468"/>
-<polygon fill="blue" stroke="blue" stroke-width="2" points="260.052,-571.971 261.545,-561.482 253.836,-568.751 260.052,-571.971"/>
-</g>
-<!-- v_b_f_FETCH->v_b_f -->
-<g id="edge3" class="edge"><title>v_b_f_FETCH->v_b_f</title>
-<path fill="none" stroke="red" stroke-width="2" d="M255.197,-598.354C260.042,-590.383 265.376,-580.545 270.233,-570.771"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="273.521,-572.01 274.713,-561.482 267.217,-568.969 273.521,-572.01"/>
-</g>
-<!-- v_b_hdrs -->
-<g id="node5" class="node"><title>v_b_hdrs</title>
-<ellipse fill="none" stroke="black" cx="337" cy="-427.87" rx="94.0904" ry="26.7407"/>
-<text text-anchor="middle" x="337" y="-431.67" font-family="Times,serif" font-size="14.00">send bereq,</text>
-<text text-anchor="middle" x="337" y="-416.67" font-family="Times,serif" font-size="14.00">read beresp (headers)</text>
-</g>
-<!-- v_b_f->v_b_hdrs -->
-<g id="edge5" class="edge"><title>v_b_f:fetch:s->v_b_hdrs</title>
-<path fill="none" stroke="black" stroke-width="2" d="M337,-491.74C337,-483.127 337,-473.849 337,-465.136"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="340.5,-464.87 337,-454.87 333.5,-464.87 340.5,-464.87"/>
-</g>
-<!-- v_b_r -->
-<g id="node6" class="node"><title>v_b_r</title>
-<polygon fill="none" stroke="black" points="343,-248.5 343,-363.5 581,-363.5 581,-248.5 343,-248.5"/>
-<text text-anchor="middle" x="462" y="-348.3" font-family="Times,serif" font-size="14.00">vbf_stp_startfetch:</text>
-<polyline fill="none" stroke="black" points="343,-340.5 581,-340.5 "/>
-<text text-anchor="middle" x="425" y="-313.8" font-family="Times,serif" font-size="14.00">vcl_backend_response{}</text>
-<polyline fill="none" stroke="black" points="507,-294.5 507,-340.5 "/>
-<text text-anchor="middle" x="544" y="-325.3" font-family="Times,serif" font-size="14.00">bereq.*</text>
-<polyline fill="none" stroke="black" points="507,-317.5 581,-317.5 "/>
-<text text-anchor="middle" x="544" y="-302.3" font-family="Times,serif" font-size="14.00">beresp.*</text>
-<polyline fill="none" stroke="black" points="343,-294.5 581,-294.5 "/>
-<text text-anchor="middle" x="384.5" y="-279.3" font-family="Times,serif" font-size="14.00">retry</text>
-<polyline fill="none" stroke="black" points="343,-271.5 426,-271.5 "/>
-<text text-anchor="middle" x="366.5" y="-256.3" font-family="Times,serif" font-size="14.00">max?</text>
-<polyline fill="none" stroke="black" points="390,-248.5 390,-271.5 "/>
-<text text-anchor="middle" x="408" y="-256.3" font-family="Times,serif" font-size="14.00">ok?</text>
-<polyline fill="none" stroke="black" points="426,-248.5 426,-294.5 "/>
-<text text-anchor="middle" x="457" y="-267.8" font-family="Times,serif" font-size="14.00">abandon</text>
-<polyline fill="none" stroke="black" points="488,-248.5 488,-294.5 "/>
-<text text-anchor="middle" x="534.5" y="-279.3" font-family="Times,serif" font-size="14.00">deliver</text>
-<polyline fill="none" stroke="black" points="488,-271.5 581,-271.5 "/>
-<text text-anchor="middle" x="509.5" y="-256.3" font-family="Times,serif" font-size="14.00">304?</text>
-<polyline fill="none" stroke="black" points="531,-248.5 531,-271.5 "/>
-<text text-anchor="middle" x="556" y="-256.3" font-family="Times,serif" font-size="14.00">other?</text>
-</g>
-<!-- v_b_hdrs->v_b_r -->
-<g id="edge6" class="edge"><title>v_b_hdrs->v_b_r</title>
-<path fill="none" stroke="black" stroke-width="2" d="M362.9,-402.033C372.553,-392.776 384.004,-381.795 395.634,-370.642"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="398.089,-373.137 402.885,-363.689 393.244,-368.085 398.089,-373.137"/>
-</g>
-<!-- v_b_e -->
-<g id="node7" class="node"><title>v_b_e</title>
-<polygon fill="none" stroke="black" points="160.5,-95.5 160.5,-210.5 359.5,-210.5 359.5,-95.5 160.5,-95.5"/>
-<text text-anchor="middle" x="260" y="-195.3" font-family="Times,serif" font-size="14.00">vbf_stp_error:</text>
-<polyline fill="none" stroke="black" points="160.5,-187.5 359.5,-187.5 "/>
-<text text-anchor="middle" x="227.5" y="-160.8" font-family="Times,serif" font-size="14.00">vcl_backend_error{}</text>
-<polyline fill="none" stroke="black" points="294.5,-141.5 294.5,-187.5 "/>
-<text text-anchor="middle" x="327" y="-172.3" font-family="Times,serif" font-size="14.00">bereq.*</text>
-<polyline fill="none" stroke="black" points="294.5,-164.5 359.5,-164.5 "/>
-<text text-anchor="middle" x="327" y="-149.3" font-family="Times,serif" font-size="14.00">beresp.*</text>
-<polyline fill="none" stroke="black" points="160.5,-141.5 359.5,-141.5 "/>
-<text text-anchor="middle" x="202" y="-126.3" font-family="Times,serif" font-size="14.00">retry</text>
-<polyline fill="none" stroke="black" points="160.5,-118.5 243.5,-118.5 "/>
-<text text-anchor="middle" x="184" y="-103.3" font-family="Times,serif" font-size="14.00">max?</text>
-<polyline fill="none" stroke="black" points="207.5,-95.5 207.5,-118.5 "/>
-<text text-anchor="middle" x="225.5" y="-103.3" font-family="Times,serif" font-size="14.00">ok?</text>
-<polyline fill="none" stroke="black" points="243.5,-95.5 243.5,-141.5 "/>
-<text text-anchor="middle" x="274.5" y="-114.8" font-family="Times,serif" font-size="14.00">abandon</text>
-<polyline fill="none" stroke="black" points="305.5,-95.5 305.5,-141.5 "/>
-<text text-anchor="middle" x="332.5" y="-114.8" font-family="Times,serif" font-size="14.00">deliver</text>
-</g>
-<!-- v_b_hdrs->v_b_e -->
-<g id="edge7" class="edge"><title>v_b_hdrs->v_b_e</title>
-<path fill="none" stroke="black" d="M329.617,-400.706C317.999,-359.535 295.09,-278.35 278.724,-220.355"/>
-<polygon fill="black" stroke="black" points="282.038,-219.209 275.953,-210.535 275.301,-221.11 282.038,-219.209"/>
-</g>
-<!-- v_b_r->v_b_e -->
-<g id="edge9" class="edge"><title>v_b_r:max->v_b_e</title>
-<path fill="none" stroke="black" d="M342,-260C316.941,-260 298.454,-241.238 285.443,-219.501"/>
-<polygon fill="black" stroke="black" points="288.476,-217.753 280.549,-210.724 282.363,-221.162 288.476,-217.753"/>
-</g>
-<!-- v_b_r_retry -->
-<g id="node8" class="node"><title>v_b_r_retry</title>
-<text text-anchor="middle" x="408" y="-149.3" font-family="Times,serif" font-size="14.00">RETRY</text>
-</g>
-<!-- v_b_r->v_b_r_retry -->
-<g id="edge8" class="edge"><title>v_b_r:retry->v_b_r_retry</title>
-<path fill="none" stroke="purple" d="M408,-248C408,-225.627 408,-200.259 408,-181.52"/>
-<polygon fill="purple" stroke="purple" points="411.5,-181.325 408,-171.325 404.5,-181.325 411.5,-181.325"/>
-</g>
-<!-- vbf_stp_condfetch -->
-<g id="node9" class="node"><title>vbf_stp_condfetch</title>
-<polygon fill="none" stroke="grey" points="456.5,-107 456.5,-199 577.5,-199 577.5,-107 456.5,-107"/>
-<text text-anchor="middle" x="517" y="-183.8" font-family="Times,serif" font-size="14.00" fill="grey">vbf_stp_condfetch:</text>
-<polyline fill="none" stroke="grey" points="456.5,-176 577.5,-176 "/>
-<text text-anchor="middle" x="517" y="-160.8" font-family="Times,serif" font-size="14.00" fill="grey">copy obj attr</text>
-<polyline fill="none" stroke="grey" points="456.5,-153 577.5,-153 "/>
-<text text-anchor="middle" x="517" y="-137.8" font-family="Times,serif" font-size="14.00" fill="grey">steal body</text>
-<polyline fill="none" stroke="grey" points="456.5,-130 577.5,-130 "/>
-<text text-anchor="middle" x="496" y="-114.8" font-family="Times,serif" font-size="14.00" fill="grey">fetch_fail?</text>
-<polyline fill="none" stroke="grey" points="535.5,-107 535.5,-130 "/>
-<text text-anchor="middle" x="556.5" y="-114.8" font-family="Times,serif" font-size="14.00" fill="grey">ok?</text>
-</g>
-<!-- v_b_r->vbf_stp_condfetch -->
-<g id="edge10" class="edge"><title>v_b_r:fetch_304:s->vbf_stp_condfetch</title>
-<path fill="none" stroke="black" d="M510,-248C510,-235.475 510.626,-222.036 511.503,-209.351"/>
-<polygon fill="black" stroke="black" points="514.994,-209.604 512.253,-199.37 508.013,-209.08 514.994,-209.604"/>
-</g>
-<!-- vbf_stp_fetch -->
-<g id="node10" class="node"><title>vbf_stp_fetch</title>
-<polygon fill="none" stroke="grey" points="595.5,-107 595.5,-199 754.5,-199 754.5,-107 595.5,-107"/>
-<text text-anchor="middle" x="675" y="-183.8" font-family="Times,serif" font-size="14.00" fill="grey">vbf_stp_fetch:</text>
-<polyline fill="none" stroke="grey" points="595.5,-176 754.5,-176 "/>
-<text text-anchor="middle" x="675" y="-160.8" font-family="Times,serif" font-size="14.00" fill="grey">setup VFPs</text>
-<polyline fill="none" stroke="grey" points="595.5,-153 754.5,-153 "/>
-<text text-anchor="middle" x="675" y="-137.8" font-family="Times,serif" font-size="14.00" fill="grey">fetch</text>
-<polyline fill="none" stroke="grey" points="595.5,-130 754.5,-130 "/>
-<text text-anchor="middle" x="632.5" y="-114.8" font-family="Times,serif" font-size="14.00" fill="grey">fetch_fail?</text>
-<polyline fill="none" stroke="grey" points="669.5,-107 669.5,-130 "/>
-<text text-anchor="middle" x="694" y="-114.8" font-family="Times,serif" font-size="14.00" fill="grey">error?</text>
-<polyline fill="none" stroke="grey" points="718.5,-107 718.5,-130 "/>
-<text text-anchor="middle" x="736.5" y="-114.8" font-family="Times,serif" font-size="14.00" fill="grey">ok?</text>
-</g>
-<!-- v_b_r->vbf_stp_fetch -->
-<g id="edge11" class="edge"><title>v_b_r:non_304:s->vbf_stp_fetch</title>
-<path fill="none" stroke="black" d="M556,-248C556,-240.963 576.756,-223.409 600.93,-205.349"/>
-<polygon fill="black" stroke="black" points="603.268,-207.974 609.235,-199.219 599.111,-202.342 603.268,-207.974"/>
-</g>
-<!-- FETCH_DONE -->
-<g id="node11" class="node"><title>FETCH_DONE</title>
-<polygon fill="turquoise" stroke="turquoise" points="609,-44 505,-44 505,-8 609,-8 609,-44"/>
-<text text-anchor="middle" x="557" y="-22.3" font-family="Times,serif" font-size="14.00">FETCH_DONE</text>
-</g>
-<!-- v_b_e->FETCH_DONE -->
-<g id="edge15" class="edge"><title>v_b_e:deliver->FETCH_DONE</title>
-<path fill="none" stroke="black" d="M361,-118C371.823,-118 361.394,-102.7 369,-95 402.574,-61.0096 454.397,-43.9123 495.137,-35.3685"/>
-<polygon fill="black" stroke="black" points="495.84,-38.7973 504.972,-33.4249 494.483,-31.9301 495.84,-38.7973"/>
-<text text-anchor="middle" x="457.5" y="-65.8" font-family="Times,serif" font-size="14.00">"backend synth"</text>
-</g>
-<!-- FETCH_FAIL -->
-<g id="node13" class="node"><title>FETCH_FAIL</title>
-<polygon fill="turquoise" stroke="turquoise" points="159,-44 63,-44 63,-8 159,-8 159,-44"/>
-<text text-anchor="middle" x="111" y="-22.3" font-family="Times,serif" font-size="14.00">FETCH_FAIL</text>
-</g>
-<!-- v_b_e->FETCH_FAIL -->
-<g id="edge17" class="edge"><title>v_b_e:max:s->FETCH_FAIL</title>
-<path fill="none" stroke="black" d="M184,-95C184,-76.148 170.804,-61.0342 155.633,-49.8878"/>
-<polygon fill="black" stroke="black" points="157.318,-46.8026 147.072,-44.105 153.399,-52.6031 157.318,-46.8026"/>
-</g>
-<!-- v_b_e_retry -->
-<g id="node14" class="node"><title>v_b_e_retry</title>
-<text text-anchor="middle" x="225" y="-22.3" font-family="Times,serif" font-size="14.00">RETRY</text>
-</g>
-<!-- v_b_e->v_b_e_retry -->
-<g id="edge16" class="edge"><title>v_b_e:retry->v_b_e_retry</title>
-<path fill="none" stroke="purple" d="M225,-95C225,-81.5776 225,-66.665 225,-54.2333"/>
-<polygon fill="purple" stroke="purple" points="228.5,-54.0469 225,-44.0469 221.5,-54.0469 228.5,-54.0469"/>
-</g>
-<!-- vbf_stp_condfetch->FETCH_DONE -->
-<g id="edge13" class="edge"><title>vbf_stp_condfetch:ok:s->FETCH_DONE</title>
-<path fill="none" stroke="black" d="M557,-106C557,-88.8934 557,-69.7032 557,-54.5204"/>
-<polygon fill="black" stroke="black" points="560.5,-54.2602 557,-44.2603 553.5,-54.2603 560.5,-54.2602"/>
-</g>
-<!-- vbf_stp_fetch->FETCH_DONE -->
-<g id="edge12" class="edge"><title>vbf_stp_fetch:ok:s->FETCH_DONE</title>
-<path fill="none" stroke="black" d="M737,-106C737,-53.2094 671.279,-35.3719 619.261,-29.5215"/>
-<polygon fill="black" stroke="black" points="619.361,-26.0142 609.063,-28.5044 618.667,-32.9797 619.361,-26.0142"/>
-</g>
-<!-- error -->
-<g id="node12" class="node"><title>error</title>
-<text text-anchor="middle" x="35" y="-149.3" font-family="Times,serif" font-size="14.00">error</text>
-</g>
-<!-- error->FETCH_FAIL -->
-<g id="edge14" class="edge"><title>error->FETCH_FAIL</title>
-<path fill="none" stroke="black" d="M45.4081,-134.881C58.2412,-113.774 80.1833,-77.6853 95.124,-53.1119"/>
-<polygon fill="black" stroke="black" points="98.2691,-54.6759 100.474,-44.313 92.2879,-51.0393 98.2691,-54.6759"/>
-</g>
-<!-- abandon -->
-<g id="node15" class="node"><title>abandon</title>
-<text text-anchor="middle" x="111" y="-149.3" font-family="Times,serif" font-size="14.00">abandon</text>
-</g>
-<!-- abandon->FETCH_FAIL -->
-<g id="edge18" class="edge"><title>abandon->FETCH_FAIL</title>
-<path fill="none" stroke="black" d="M111,-134.881C111,-114.146 111,-78.9525 111,-54.4215"/>
-<polygon fill="black" stroke="black" points="114.5,-54.313 111,-44.313 107.5,-54.313 114.5,-54.313"/>
-</g>
-</g>
-</svg>
diff --git a/doc/graphviz/cache_http1_fsm.svg b/doc/graphviz/cache_http1_fsm.svg
deleted file mode 100644
index 65617c7..0000000
--- a/doc/graphviz/cache_http1_fsm.svg
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.38.0 (20140413.2041)
- -->
-<!-- Title: vcl_center Pages: 1 -->
-<svg width="614pt" height="606pt"
- viewBox="36.00 36.00 577.54 570.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(40 566)">
-<title>vcl_center</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-530 537.544,-530 537.544,4 -4,4"/>
-<!-- acceptor -->
-<g id="node1" class="node"><title>acceptor</title>
-<ellipse fill="none" stroke="black" cx="413.544" cy="-508" rx="40.0939" ry="18"/>
-<text text-anchor="middle" x="413.544" y="-504.3" font-family="Times,serif" font-size="14.00">acceptor</text>
-</g>
-<!-- http1_wait -->
-<g id="node2" class="node"><title>http1_wait</title>
-<ellipse fill="none" stroke="black" cx="413.544" cy="-421" rx="48.1917" ry="18"/>
-<text text-anchor="middle" x="413.544" y="-417.3" font-family="Times,serif" font-size="14.00">http1_wait</text>
-</g>
-<!-- acceptor->http1_wait -->
-<g id="edge1" class="edge"><title>acceptor->http1_wait</title>
-<path fill="none" stroke="black" d="M413.544,-489.799C413.544,-478.163 413.544,-462.548 413.544,-449.237"/>
-<polygon fill="black" stroke="black" points="417.044,-449.175 413.544,-439.175 410.044,-449.175 417.044,-449.175"/>
-<text text-anchor="middle" x="465.044" y="-460.8" font-family="Times,serif" font-size="14.00">S_STP_NEWREQ</text>
-</g>
-<!-- CNT_Request -->
-<g id="node4" class="node"><title>CNT_Request</title>
-<ellipse fill="none" stroke="black" cx="123.544" cy="-319" rx="61.1893" ry="18"/>
-<text text-anchor="middle" x="123.544" y="-315.3" font-family="Times,serif" font-size="14.00">CNT_Request</text>
-</g>
-<!-- http1_wait->CNT_Request -->
-<g id="edge4" class="edge"><title>http1_wait->CNT_Request</title>
-<path fill="none" stroke="black" d="M365.828,-418.624C301.217,-415.905 190.213,-407.948 157.544,-385 144.546,-375.87 136.143,-360.207 130.942,-346.544"/>
-<polygon fill="black" stroke="black" points="134.25,-345.4 127.702,-337.071 127.627,-347.665 134.25,-345.4"/>
-<text text-anchor="middle" x="213.044" y="-373.8" font-family="Times,serif" font-size="14.00">S_STP_WORKING</text>
-<text text-anchor="middle" x="213.044" y="-358.8" font-family="Times,serif" font-size="14.00">R_STP_RECV</text>
-</g>
-<!-- disembark -->
-<g id="node5" class="node"><title>disembark</title>
-<ellipse fill="none" stroke="black" cx="331.544" cy="-91" rx="48.1917" ry="18"/>
-<text text-anchor="middle" x="331.544" y="-87.3" font-family="Times,serif" font-size="14.00">disembark</text>
-</g>
-<!-- http1_wait->disembark -->
-<g id="edge5" class="edge"><title>http1_wait->disembark</title>
-<path fill="none" stroke="black" d="M415.457,-402.989C417.361,-378.708 417.784,-333.462 399.544,-301 393.185,-289.684 382.782,-294.383 376.544,-283 343.071,-221.917 388.812,-191.094 361.544,-127 359.933,-123.214 357.76,-119.538 355.315,-116.079"/>
-<polygon fill="black" stroke="black" points="357.823,-113.612 348.842,-107.992 352.358,-117.987 357.823,-113.612"/>
-<text text-anchor="middle" x="413.044" y="-264.3" font-family="Times,serif" font-size="14.00">Session close</text>
-</g>
-<!-- http1_wait->disembark -->
-<g id="edge6" class="edge"><title>http1_wait->disembark</title>
-<path fill="none" stroke="green" d="M422.307,-403.301C437.002,-373.118 463.679,-307.551 449.544,-253 433.475,-190.986 421.974,-174.996 379.544,-127 375.151,-122.031 369.936,-117.349 364.589,-113.125"/>
-<polygon fill="green" stroke="green" points="366.294,-110.032 356.177,-106.886 362.124,-115.654 366.294,-110.032"/>
-<text text-anchor="middle" x="476.044" y="-264.3" font-family="Times,serif" font-size="14.00">Timeout</text>
-</g>
-<!-- hash -->
-<g id="node3" class="node"><title>hash</title>
-<ellipse fill="none" stroke="black" cx="136.544" cy="-18" rx="27" ry="18"/>
-<text text-anchor="middle" x="136.544" y="-14.3" font-family="Times,serif" font-size="14.00">hash</text>
-</g>
-<!-- hash->CNT_Request -->
-<g id="edge2" class="edge"><title>hash->CNT_Request</title>
-<path fill="none" stroke="blue" d="M115.322,-29.1756C84.8323,-45.1329 29.8514,-79.2306 7.54392,-127 -22.451,-191.231 49.4699,-261.077 93.1002,-295.8"/>
-<polygon fill="blue" stroke="blue" points="91.1075,-298.684 101.149,-302.065 95.4073,-293.16 91.1075,-298.684"/>
-<text text-anchor="middle" x="63.0439" y="-160.8" font-family="Times,serif" font-size="14.00">Busy object</text>
-<text text-anchor="middle" x="63.0439" y="-145.8" font-family="Times,serif" font-size="14.00">S_STP_WORKING</text>
-<text text-anchor="middle" x="63.0439" y="-130.8" font-family="Times,serif" font-size="14.00">R_STP_LOOKUP</text>
-</g>
-<!-- CNT_Request->disembark -->
-<g id="edge9" class="edge"><title>CNT_Request->disembark</title>
-<path fill="none" stroke="blue" d="M114.911,-301.078C102.927,-274.969 85.1119,-224.299 107.544,-190 144.65,-133.264 222.638,-109.177 276.058,-99.084"/>
-<polygon fill="blue" stroke="blue" points="276.832,-102.501 286.063,-97.3019 275.604,-95.6098 276.832,-102.501"/>
-<text text-anchor="middle" x="163.044" y="-223.8" font-family="Times,serif" font-size="14.00">Busy object</text>
-<text text-anchor="middle" x="163.044" y="-208.8" font-family="Times,serif" font-size="14.00">S_STP_WORKING</text>
-<text text-anchor="middle" x="163.044" y="-193.8" font-family="Times,serif" font-size="14.00">R_STP_LOOKUP</text>
-</g>
-<!-- http1_cleanup -->
-<g id="node7" class="node"><title>http1_cleanup</title>
-<ellipse fill="none" stroke="black" cx="287.544" cy="-212.5" rx="60.3893" ry="18"/>
-<text text-anchor="middle" x="287.544" y="-208.8" font-family="Times,serif" font-size="14.00">http1_cleanup</text>
-</g>
-<!-- CNT_Request->http1_cleanup -->
-<g id="edge10" class="edge"><title>CNT_Request->http1_cleanup</title>
-<path fill="none" stroke="black" d="M122.518,-300.739C122.631,-286.098 125.264,-265.533 137.544,-253 161.837,-228.206 179.978,-243.845 213.544,-235 221.094,-233.011 229.047,-230.811 236.828,-228.6"/>
-<polygon fill="black" stroke="black" points="237.902,-231.933 246.547,-225.809 235.969,-225.205 237.902,-231.933"/>
-</g>
-<!-- disembark->hash -->
-<g id="edge3" class="edge"><title>disembark->hash</title>
-<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M298.022,-77.7947C261.99,-64.6754 205.087,-43.9568 169.339,-30.9408"/>
-<polygon fill="blue" stroke="blue" points="170.446,-27.6192 159.852,-27.4866 168.051,-34.1967 170.446,-27.6192"/>
-</g>
-<!-- waiter -->
-<g id="node6" class="node"><title>waiter</title>
-<ellipse fill="none" stroke="black" cx="376.544" cy="-18" rx="32.4942" ry="18"/>
-<text text-anchor="middle" x="376.544" y="-14.3" font-family="Times,serif" font-size="14.00">waiter</text>
-</g>
-<!-- disembark->waiter -->
-<g id="edge7" class="edge"><title>disembark->waiter</title>
-<path fill="none" stroke="green" stroke-dasharray="1,5" d="M342.208,-73.174C347.78,-64.3831 354.705,-53.4564 360.874,-43.7236"/>
-<polygon fill="green" stroke="green" points="363.869,-45.5366 366.266,-35.2165 357.956,-41.7892 363.869,-45.5366"/>
-</g>
-<!-- waiter->http1_wait -->
-<g id="edge8" class="edge"><title>waiter->http1_wait</title>
-<path fill="none" stroke="green" d="M409.074,-19.7692C455.061,-22.7818 533.544,-35.8546 533.544,-90 533.544,-320 533.544,-320 533.544,-320 533.544,-361.025 491.641,-388.484 457.357,-404.084"/>
-<polygon fill="green" stroke="green" points="455.714,-400.982 447.931,-408.171 458.498,-407.404 455.714,-400.982"/>
-</g>
-<!-- http1_cleanup->http1_wait -->
-<g id="edge13" class="edge"><title>http1_cleanup->http1_wait</title>
-<path fill="none" stroke="black" d="M284.429,-230.778C280.813,-255.928 277.543,-303.29 296.544,-337 313.554,-367.178 346.622,-389.066 373.275,-402.763"/>
-<polygon fill="black" stroke="black" points="371.882,-405.979 382.398,-407.266 374.981,-399.702 371.882,-405.979"/>
-<text text-anchor="middle" x="348.044" y="-315.3" font-family="Times,serif" font-size="14.00">S_STP_NEWREQ</text>
-</g>
-<!-- http1_cleanup->CNT_Request -->
-<g id="edge12" class="edge"><title>http1_cleanup->CNT_Request</title>
-<path fill="none" stroke="black" d="M246.12,-225.676C208.748,-236.723 159.343,-251.509 157.544,-253 145.588,-262.907 137.308,-278.12 131.915,-291.339"/>
-<polygon fill="black" stroke="black" points="128.55,-290.345 128.34,-300.938 135.11,-292.788 128.55,-290.345"/>
-<text text-anchor="middle" x="213.044" y="-271.8" font-family="Times,serif" font-size="14.00">S_STP_WORKING</text>
-<text text-anchor="middle" x="213.044" y="-256.8" font-family="Times,serif" font-size="14.00">R_STP_RECV</text>
-</g>
-<!-- http1_cleanup->disembark -->
-<g id="edge11" class="edge"><title>http1_cleanup->disembark</title>
-<path fill="none" stroke="black" d="M283.67,-194.346C280.556,-176.557 278.212,-148.404 288.544,-127 291.002,-121.907 294.597,-117.309 298.677,-113.246"/>
-<polygon fill="black" stroke="black" points="301.159,-115.725 306.404,-106.52 296.563,-110.445 301.159,-115.725"/>
-<text text-anchor="middle" x="325.044" y="-145.8" font-family="Times,serif" font-size="14.00">Session close</text>
-</g>
-</g>
-</svg>
diff --git a/doc/graphviz/cache_req_fsm.svg b/doc/graphviz/cache_req_fsm.svg
deleted file mode 100644
index d9976c3..0000000
--- a/doc/graphviz/cache_req_fsm.svg
+++ /dev/null
@@ -1,438 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.38.0 (20140413.2041)
- -->
-<!-- Title: cache_req_fsm Pages: 1 -->
-<svg width="837pt" height="1349pt"
- viewBox="18.00 18.00 819.46 1331.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(22 1327)">
-<title>cache_req_fsm</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-1309 797.459,-1309 797.459,4 -4,4"/>
-<g id="clust3" class="cluster"><title>cluster_backend</title>
-<polygon fill="aliceblue" stroke="aliceblue" points="47,-299 47,-408 338,-408 338,-299 47,-299"/>
-</g>
-<!-- acceptor -->
-<g id="node1" class="node"><title>acceptor</title>
-<polygon fill="none" stroke="black" points="502.608,-1208.5 461.304,-1226.5 378.696,-1226.5 337.392,-1208.5 378.696,-1190.5 461.304,-1190.5 502.608,-1208.5"/>
-<text text-anchor="middle" x="420" y="-1204.8" font-family="Times,serif" font-size="14.00">Request received</text>
-</g>
-<!-- recv -->
-<g id="node4" class="node"><title>recv</title>
-<polygon fill="none" stroke="black" points="466,-1078.5 466,-1147.5 680,-1147.5 680,-1078.5 466,-1078.5"/>
-<text text-anchor="middle" x="573" y="-1132.3" font-family="Times,serif" font-size="14.00">cnt_recv:</text>
-<polyline fill="none" stroke="black" points="466,-1124.5 680,-1124.5 "/>
-<text text-anchor="middle" x="527.5" y="-1109.3" font-family="Times,serif" font-size="14.00">vcl_recv{}</text>
-<polyline fill="none" stroke="black" points="589,-1101.5 589,-1124.5 "/>
-<text text-anchor="middle" x="634.5" y="-1109.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="466,-1101.5 680,-1101.5 "/>
-<text text-anchor="middle" x="486.5" y="-1086.3" font-family="Times,serif" font-size="14.00">hash</text>
-<polyline fill="none" stroke="black" points="507,-1078.5 507,-1101.5 "/>
-<text text-anchor="middle" x="530.5" y="-1086.3" font-family="Times,serif" font-size="14.00">purge</text>
-<polyline fill="none" stroke="black" points="554,-1078.5 554,-1101.5 "/>
-<text text-anchor="middle" x="574" y="-1086.3" font-family="Times,serif" font-size="14.00">pass</text>
-<polyline fill="none" stroke="black" points="594,-1078.5 594,-1101.5 "/>
-<text text-anchor="middle" x="614" y="-1086.3" font-family="Times,serif" font-size="14.00">pipe</text>
-<polyline fill="none" stroke="black" points="634,-1078.5 634,-1101.5 "/>
-<text text-anchor="middle" x="657" y="-1086.3" font-family="Times,serif" font-size="14.00">synth</text>
-</g>
-<!-- acceptor->recv -->
-<g id="edge2" class="edge"><title>acceptor->recv</title>
-<path fill="none" stroke="black" stroke-width="2" d="M448.063,-1190.35C465.274,-1179.83 488.043,-1165.92 509.425,-1152.85"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="511.458,-1155.71 518.165,-1147.51 507.807,-1149.74 511.458,-1155.71"/>
-</g>
-<!-- ESI_REQ -->
-<g id="node2" class="node"><title>ESI_REQ</title>
-<polygon fill="none" stroke="black" points="627.07,-1208.5 600.535,-1226.5 547.465,-1226.5 520.93,-1208.5 547.465,-1190.5 600.535,-1190.5 627.07,-1208.5"/>
-<text text-anchor="middle" x="574" y="-1204.8" font-family="Times,serif" font-size="14.00">ESI_REQ</text>
-</g>
-<!-- ESI_REQ->recv -->
-<g id="edge1" class="edge"><title>ESI_REQ->recv</title>
-<path fill="none" stroke="black" d="M573.817,-1190.35C573.718,-1181.14 573.592,-1169.31 573.468,-1157.74"/>
-<polygon fill="black" stroke="black" points="576.967,-1157.66 573.36,-1147.7 569.968,-1157.74 576.967,-1157.66"/>
-</g>
-<!-- RESTART -->
-<g id="node3" class="node"><title>RESTART</title>
-<text text-anchor="middle" x="710" y="-1283.3" font-family="Times,serif" font-size="14.00">RESTART</text>
-</g>
-<!-- restart -->
-<g id="node22" class="node"><title>restart</title>
-<polygon fill="none" stroke="grey" points="646,-1185.5 646,-1231.5 774,-1231.5 774,-1185.5 646,-1185.5"/>
-<text text-anchor="middle" x="710" y="-1216.3" font-family="Times,serif" font-size="14.00" fill="grey">cnt_restart:</text>
-<polyline fill="none" stroke="grey" points="646,-1208.5 774,-1208.5 "/>
-<text text-anchor="middle" x="664" y="-1193.3" font-family="Times,serif" font-size="14.00" fill="grey">ok?</text>
-<polyline fill="none" stroke="grey" points="682,-1185.5 682,-1208.5 "/>
-<text text-anchor="middle" x="728" y="-1193.3" font-family="Times,serif" font-size="14.00" fill="grey">max_restarts?</text>
-</g>
-<!-- RESTART->restart -->
-<g id="edge28" class="edge"><title>RESTART->restart</title>
-<path fill="none" stroke="purple" d="M710,-1268.64C710,-1260.7 710,-1251.02 710,-1241.81"/>
-<polygon fill="purple" stroke="purple" points="713.5,-1241.74 710,-1231.74 706.5,-1241.74 713.5,-1241.74"/>
-</g>
-<!-- pass -->
-<g id="node19" class="node"><title>pass</title>
-<polygon fill="none" stroke="black" points="223,-445.5 223,-514.5 363,-514.5 363,-445.5 223,-445.5"/>
-<text text-anchor="middle" x="293" y="-499.3" font-family="Times,serif" font-size="14.00">cnt_pass:</text>
-<polyline fill="none" stroke="black" points="223,-491.5 363,-491.5 "/>
-<text text-anchor="middle" x="266" y="-476.3" font-family="Times,serif" font-size="14.00">vcl_pass{}</text>
-<polyline fill="none" stroke="black" points="309,-468.5 309,-491.5 "/>
-<text text-anchor="middle" x="336" y="-476.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="223,-468.5 363,-468.5 "/>
-<text text-anchor="middle" x="245" y="-453.3" font-family="Times,serif" font-size="14.00">fetch</text>
-<polyline fill="none" stroke="black" points="267,-445.5 267,-468.5 "/>
-<text text-anchor="middle" x="290" y="-453.3" font-family="Times,serif" font-size="14.00">synth</text>
-<polyline fill="none" stroke="black" points="313,-445.5 313,-468.5 "/>
-<text text-anchor="middle" x="338" y="-453.3" font-family="Times,serif" font-size="14.00">restart</text>
-</g>
-<!-- recv->pass -->
-<g id="edge33" class="edge"><title>recv:pass->pass</title>
-<path fill="none" stroke="red" stroke-width="2" d="M574,-1078C574,-1036.22 575,-1025.78 575,-984 575,-984 575,-984 575,-615 575,-525.019 456.424,-495.389 373.053,-485.677"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="373.391,-482.193 363.07,-484.588 372.632,-489.152 373.391,-482.193"/>
-</g>
-<!-- pipe -->
-<g id="node20" class="node"><title>pipe</title>
-<polygon fill="none" stroke="black" points="619,-925.5 619,-1040.5 753,-1040.5 753,-925.5 619,-925.5"/>
-<text text-anchor="middle" x="686" y="-1025.3" font-family="Times,serif" font-size="14.00">cnt_pipe:</text>
-<polyline fill="none" stroke="black" points="619,-1017.5 753,-1017.5 "/>
-<text text-anchor="middle" x="686" y="-1002.3" font-family="Times,serif" font-size="14.00">filter req.*->bereq.*</text>
-<polyline fill="none" stroke="black" points="619,-994.5 753,-994.5 "/>
-<text text-anchor="middle" x="657.5" y="-967.8" font-family="Times,serif" font-size="14.00">vcl_pipe{}</text>
-<polyline fill="none" stroke="black" points="696,-948.5 696,-994.5 "/>
-<text text-anchor="middle" x="724.5" y="-979.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="696,-971.5 753,-971.5 "/>
-<text text-anchor="middle" x="724.5" y="-956.3" font-family="Times,serif" font-size="14.00">bereq.*</text>
-<polyline fill="none" stroke="black" points="619,-948.5 753,-948.5 "/>
-<text text-anchor="middle" x="651" y="-933.3" font-family="Times,serif" font-size="14.00">pipe</text>
-<polyline fill="none" stroke="black" points="683,-925.5 683,-948.5 "/>
-<text text-anchor="middle" x="718" y="-933.3" font-family="Times,serif" font-size="14.00">synth</text>
-</g>
-<!-- recv->pipe -->
-<g id="edge32" class="edge"><title>recv:pipe->pipe</title>
-<path fill="none" stroke="orange" stroke-width="2" d="M614,-1078C614,-1068.08 616.557,-1058.57 620.707,-1049.65"/>
-<polygon fill="orange" stroke="orange" stroke-width="2" points="623.927,-1051.05 625.568,-1040.58 617.758,-1047.74 623.927,-1051.05"/>
-</g>
-<!-- hash -->
-<g id="node24" class="node"><title>hash</title>
-<polygon fill="none" stroke="black" points="423,-948.5 423,-1017.5 545,-1017.5 545,-948.5 423,-948.5"/>
-<text text-anchor="middle" x="484" y="-1002.3" font-family="Times,serif" font-size="14.00">cnt_recv:</text>
-<polyline fill="none" stroke="black" points="423,-994.5 545,-994.5 "/>
-<text text-anchor="middle" x="462" y="-979.3" font-family="Times,serif" font-size="14.00">vcl_hash{}</text>
-<polyline fill="none" stroke="black" points="501,-971.5 501,-994.5 "/>
-<text text-anchor="middle" x="523" y="-979.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="423,-971.5 545,-971.5 "/>
-<text text-anchor="middle" x="484" y="-956.3" font-family="Times,serif" font-size="14.00">lookup</text>
-</g>
-<!-- recv->hash -->
-<g id="edge31" class="edge"><title>recv:hash->hash</title>
-<path fill="none" stroke="green" stroke-width="2" d="M486,-1078C486,-1061.66 485.694,-1043.73 485.322,-1027.95"/>
-<polygon fill="green" stroke="green" stroke-width="2" points="488.82,-1027.84 485.07,-1017.93 481.823,-1028.02 488.82,-1027.84"/>
-</g>
-<!-- recv->hash -->
-<g id="edge36" class="edge"><title>recv:purge:s->hash</title>
-<path fill="none" stroke="purple" stroke-width="2" d="M530,-1078C530,-1060.08 523.17,-1042.01 514.774,-1026.57"/>
-<polygon fill="purple" stroke="purple" stroke-width="2" points="517.735,-1024.7 509.69,-1017.81 511.68,-1028.21 517.735,-1024.7"/>
-</g>
-<!-- SYNTH -->
-<g id="node5" class="node"><title>SYNTH</title>
-<text text-anchor="middle" x="378" y="-313.3" font-family="Times,serif" font-size="14.00">SYNTH</text>
-</g>
-<!-- synth -->
-<g id="node10" class="node"><title>synth</title>
-<polygon fill="none" stroke="black" points="256.5,-158 256.5,-250 389.5,-250 389.5,-158 256.5,-158"/>
-<text text-anchor="middle" x="323" y="-234.8" font-family="Times,serif" font-size="14.00">cnt_synth:</text>
-<polyline fill="none" stroke="black" points="256.5,-227 389.5,-227 "/>
-<text text-anchor="middle" x="298" y="-200.3" font-family="Times,serif" font-size="14.00">vcl_synth{}</text>
-<polyline fill="none" stroke="black" points="339.5,-181 339.5,-227 "/>
-<text text-anchor="middle" x="364.5" y="-211.8" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="339.5,-204 389.5,-204 "/>
-<text text-anchor="middle" x="364.5" y="-188.8" font-family="Times,serif" font-size="14.00">resp.*</text>
-<polyline fill="none" stroke="black" points="256.5,-181 389.5,-181 "/>
-<text text-anchor="middle" x="290.5" y="-165.8" font-family="Times,serif" font-size="14.00">deliver</text>
-<polyline fill="none" stroke="black" points="324.5,-158 324.5,-181 "/>
-<text text-anchor="middle" x="357" y="-165.8" font-family="Times,serif" font-size="14.00">restart</text>
-</g>
-<!-- SYNTH->synth -->
-<g id="edge8" class="edge"><title>SYNTH->synth</title>
-<path fill="none" stroke="purple" d="M369.406,-298.656C364.152,-288.052 357.113,-273.847 350.109,-259.71"/>
-<polygon fill="purple" stroke="purple" points="353.105,-257.875 345.529,-250.468 346.833,-260.983 353.105,-257.875"/>
-</g>
-<!-- deliver -->
-<g id="node6" class="node"><title>deliver</title>
-<polygon fill="none" stroke="black" points="88,-146.5 88,-261.5 238,-261.5 238,-146.5 88,-146.5"/>
-<text text-anchor="middle" x="163" y="-246.3" font-family="Times,serif" font-size="14.00">cnt_deliver:</text>
-<polyline fill="none" stroke="black" points="88,-238.5 238,-238.5 "/>
-<text text-anchor="middle" x="163" y="-223.3" font-family="Times,serif" font-size="14.00">Filter obj.->resp.</text>
-<polyline fill="none" stroke="black" points="88,-215.5 238,-215.5 "/>
-<text text-anchor="middle" x="135.5" y="-188.8" font-family="Times,serif" font-size="14.00">vcl_deliver{}</text>
-<polyline fill="none" stroke="black" points="183,-169.5 183,-215.5 "/>
-<text text-anchor="middle" x="210.5" y="-200.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="183,-192.5 238,-192.5 "/>
-<text text-anchor="middle" x="210.5" y="-177.3" font-family="Times,serif" font-size="14.00">resp.*</text>
-<polyline fill="none" stroke="black" points="88,-169.5 238,-169.5 "/>
-<text text-anchor="middle" x="113" y="-154.3" font-family="Times,serif" font-size="14.00">restart</text>
-<polyline fill="none" stroke="black" points="138,-146.5 138,-169.5 "/>
-<text text-anchor="middle" x="165" y="-154.3" font-family="Times,serif" font-size="14.00">deliver</text>
-<polyline fill="none" stroke="black" points="192,-146.5 192,-169.5 "/>
-<text text-anchor="middle" x="215" y="-154.3" font-family="Times,serif" font-size="14.00">synth</text>
-</g>
-<!-- V1D_Deliver -->
-<g id="node7" class="node"><title>V1D_Deliver</title>
-<ellipse fill="none" stroke="black" cx="218" cy="-91" rx="58.4896" ry="18"/>
-<text text-anchor="middle" x="218" y="-87.3" font-family="Times,serif" font-size="14.00">V1D_Deliver</text>
-</g>
-<!-- deliver->V1D_Deliver -->
-<g id="edge3" class="edge"><title>deliver:deliver:s->V1D_Deliver</title>
-<path fill="none" stroke="green" stroke-width="2" d="M165,-146C157.436,-131.868 162.41,-120.078 172.056,-111.156"/>
-<polygon fill="green" stroke="green" stroke-width="2" points="174.406,-113.764 180.212,-104.902 170.147,-108.21 174.406,-113.764"/>
-</g>
-<!-- deliver->V1D_Deliver -->
-<g id="edge4" class="edge"><title>deliver:deliver:s->V1D_Deliver</title>
-<path fill="none" stroke="red" stroke-width="2" d="M165,-146C165,-133.044 172.868,-122.055 182.54,-113.441"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="184.925,-116.016 190.569,-107.05 180.565,-110.54 184.925,-116.016"/>
-</g>
-<!-- deliver->V1D_Deliver -->
-<g id="edge5" class="edge"><title>deliver:deliver:s->V1D_Deliver</title>
-<path fill="none" stroke="blue" stroke-width="2" d="M165,-146C171.668,-133.543 183.138,-122.906 194.023,-114.449"/>
-<polygon fill="blue" stroke="blue" stroke-width="2" points="196.205,-117.187 202.143,-108.412 192.029,-111.569 196.205,-117.187"/>
-</g>
-<!-- DONE -->
-<g id="node9" class="node"><title>DONE</title>
-<ellipse fill="none" stroke="black" cx="552" cy="-18" rx="35.194" ry="18"/>
-<text text-anchor="middle" x="552" y="-14.3" font-family="Times,serif" font-size="14.00">DONE</text>
-</g>
-<!-- V1D_Deliver->DONE -->
-<g id="edge7" class="edge"><title>V1D_Deliver->DONE</title>
-<path fill="none" stroke="black" d="M264.793,-80.053C330.099,-66.1707 447.576,-41.1979 510.132,-27.9001"/>
-<polygon fill="black" stroke="black" points="510.997,-31.2946 520.05,-25.7917 509.541,-24.4476 510.997,-31.2946"/>
-</g>
-<!-- stream -->
-<g id="node8" class="node"><title>stream</title>
-<ellipse fill="turquoise" stroke="turquoise" cx="449" cy="-204" rx="41.9398" ry="26.7407"/>
-<text text-anchor="middle" x="449" y="-207.8" font-family="Times,serif" font-size="14.00">stream?</text>
-<text text-anchor="middle" x="449" y="-192.8" font-family="Times,serif" font-size="14.00">body</text>
-</g>
-<!-- stream->V1D_Deliver -->
-<g id="edge6" class="edge"><title>stream->V1D_Deliver</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M432.499,-179.068C423.495,-167.606 411.448,-154.547 398,-146 362.135,-123.204 316.167,-109.626 279.663,-101.787"/>
-<polygon fill="black" stroke="black" points="280.134,-98.3108 269.634,-99.7253 278.724,-105.167 280.134,-98.3108"/>
-</g>
-<!-- synth->V1D_Deliver -->
-<g id="edge9" class="edge"><title>synth:del:s->V1D_Deliver</title>
-<path fill="none" stroke="purple" d="M290,-157C290,-137.353 275.047,-122.114 258.77,-111.346"/>
-<polygon fill="purple" stroke="purple" points="260.569,-108.343 250.209,-106.122 256.923,-114.319 260.569,-108.343"/>
-</g>
-<!-- see backend graph -->
-<g id="node11" class="node"><title>see backend graph</title>
-<text text-anchor="middle" x="279" y="-386.3" font-family="Times,serif" font-size="14.00">see backend graph</text>
-</g>
-<!-- BGFETCH -->
-<g id="node12" class="node"><title>BGFETCH</title>
-<polygon fill="turquoise" stroke="turquoise" points="125,-408 47,-408 47,-372 125,-372 125,-408"/>
-<text text-anchor="middle" x="86" y="-386.3" font-family="Times,serif" font-size="14.00">BGFETCH</text>
-</g>
-<!-- FETCH -->
-<g id="node13" class="node"><title>FETCH</title>
-<polygon fill="turquoise" stroke="turquoise" points="202.5,-408 143.5,-408 143.5,-372 202.5,-372 202.5,-408"/>
-<text text-anchor="middle" x="173" y="-386.3" font-family="Times,serif" font-size="14.00">FETCH</text>
-</g>
-<!-- FETCH_DONE -->
-<g id="node14" class="node"><title>FETCH_DONE</title>
-<polygon fill="turquoise" stroke="turquoise" points="215,-335 111,-335 111,-299 215,-299 215,-335"/>
-<text text-anchor="middle" x="163" y="-313.3" font-family="Times,serif" font-size="14.00">FETCH_DONE</text>
-</g>
-<!-- FETCH->FETCH_DONE -->
-<g id="edge14" class="edge"><title>FETCH->FETCH_DONE</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M170.579,-371.813C169.449,-363.789 168.077,-354.047 166.813,-345.069"/>
-<polygon fill="black" stroke="black" points="170.259,-344.443 165.398,-335.029 163.327,-345.419 170.259,-344.443"/>
-</g>
-<!-- FETCH_FAIL -->
-<g id="node15" class="node"><title>FETCH_FAIL</title>
-<polygon fill="turquoise" stroke="turquoise" points="329,-335 233,-335 233,-299 329,-299 329,-335"/>
-<text text-anchor="middle" x="281" y="-313.3" font-family="Times,serif" font-size="14.00">FETCH_FAIL</text>
-</g>
-<!-- FETCH->FETCH_FAIL -->
-<g id="edge15" class="edge"><title>FETCH->FETCH_FAIL</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M198.869,-371.994C213.058,-362.666 230.842,-350.974 246.23,-340.858"/>
-<polygon fill="black" stroke="black" points="248.535,-343.532 254.968,-335.114 244.689,-337.682 248.535,-343.532"/>
-</g>
-<!-- FETCH_DONE->deliver -->
-<g id="edge12" class="edge"><title>FETCH_DONE->deliver</title>
-<path fill="none" stroke="red" stroke-width="2" d="M157.938,-298.656C157.117,-291.065 156.595,-281.628 156.373,-271.691"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="159.873,-271.595 156.251,-261.638 152.873,-271.68 159.873,-271.595"/>
-</g>
-<!-- FETCH_DONE->deliver -->
-<g id="edge13" class="edge"><title>FETCH_DONE->deliver</title>
-<path fill="none" stroke="blue" stroke-width="2" d="M168.062,-298.656C168.883,-291.065 169.405,-281.628 169.627,-271.691"/>
-<polygon fill="blue" stroke="blue" stroke-width="2" points="173.127,-271.68 169.749,-261.638 166.127,-271.595 173.127,-271.68"/>
-</g>
-<!-- FETCH_FAIL->synth -->
-<g id="edge11" class="edge"><title>FETCH_FAIL->synth</title>
-<path fill="none" stroke="purple" d="M287.562,-298.656C291.537,-288.153 296.848,-274.117 302.146,-260.114"/>
-<polygon fill="purple" stroke="purple" points="305.53,-261.06 305.796,-250.468 298.983,-258.582 305.53,-261.06"/>
-</g>
-<!-- lookup2 -->
-<g id="node16" class="node"><title>lookup2</title>
-<polygon fill="none" stroke="black" points="0,-688.5 0,-780.5 232,-780.5 232,-688.5 0,-688.5"/>
-<text text-anchor="middle" x="116" y="-765.3" font-family="Times,serif" font-size="14.00">cnt_lookup:</text>
-<polyline fill="none" stroke="black" points="0,-757.5 232,-757.5 "/>
-<text text-anchor="middle" x="64" y="-730.8" font-family="Times,serif" font-size="14.00">vcl_hit{}</text>
-<polyline fill="none" stroke="black" points="128,-711.5 128,-757.5 "/>
-<text text-anchor="middle" x="180" y="-742.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="128,-734.5 232,-734.5 "/>
-<text text-anchor="middle" x="180" y="-719.3" font-family="Times,serif" font-size="14.00">obj.*</text>
-<polyline fill="none" stroke="black" points="0,-711.5 232,-711.5 "/>
-<text text-anchor="middle" x="27" y="-696.3" font-family="Times,serif" font-size="14.00">deliver</text>
-<polyline fill="none" stroke="black" points="54,-688.5 54,-711.5 "/>
-<text text-anchor="middle" x="75" y="-696.3" font-family="Times,serif" font-size="14.00">miss</text>
-<polyline fill="none" stroke="black" points="96,-688.5 96,-711.5 "/>
-<text text-anchor="middle" x="121" y="-696.3" font-family="Times,serif" font-size="14.00">restart</text>
-<polyline fill="none" stroke="black" points="146,-688.5 146,-711.5 "/>
-<text text-anchor="middle" x="169" y="-696.3" font-family="Times,serif" font-size="14.00">synth</text>
-<polyline fill="none" stroke="black" points="192,-688.5 192,-711.5 "/>
-<text text-anchor="middle" x="212" y="-696.3" font-family="Times,serif" font-size="14.00">pass</text>
-</g>
-<!-- lookup2->deliver -->
-<g id="edge20" class="edge"><title>lookup2:deliver:s->deliver:n</title>
-<path fill="none" stroke="green" stroke-width="2" d="M27,-688C27,-656.245 19,-648.755 19,-617 19,-617 19,-617 19,-316 19,-251.519 147.149,-321.468 161.666,-272.216"/>
-<polygon fill="green" stroke="green" stroke-width="2" points="165.176,-272.369 163,-262 158.235,-271.463 165.176,-272.369"/>
-</g>
-<!-- lookup2->BGFETCH -->
-<g id="edge10" class="edge"><title>lookup2:deliver:s->BGFETCH</title>
-<path fill="none" stroke="green" d="M27,-688C27,-679.567 30.9334,-678.176 33,-670 48.149,-610.069 45.481,-593.733 57,-533 64.6083,-492.885 74.2231,-446.572 80.2438,-418.035"/>
-<polygon fill="green" stroke="green" points="83.7172,-418.527 82.3636,-408.019 76.8689,-417.077 83.7172,-418.527"/>
-<text text-anchor="middle" x="94" y="-551.8" font-family="Times,serif" font-size="14.00">parallel</text>
-<text text-anchor="middle" x="94" y="-536.8" font-family="Times,serif" font-size="14.00">if obj expired</text>
-</g>
-<!-- miss -->
-<g id="node18" class="node"><title>miss</title>
-<polygon fill="none" stroke="black" points="85,-581.5 85,-650.5 265,-650.5 265,-581.5 85,-581.5"/>
-<text text-anchor="middle" x="175" y="-635.3" font-family="Times,serif" font-size="14.00">cnt_miss:</text>
-<polyline fill="none" stroke="black" points="85,-627.5 265,-627.5 "/>
-<text text-anchor="middle" x="138.5" y="-612.3" font-family="Times,serif" font-size="14.00">vcl_miss{}</text>
-<polyline fill="none" stroke="black" points="192,-604.5 192,-627.5 "/>
-<text text-anchor="middle" x="228.5" y="-612.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="85,-604.5 265,-604.5 "/>
-<text text-anchor="middle" x="107" y="-589.3" font-family="Times,serif" font-size="14.00">fetch</text>
-<polyline fill="none" stroke="black" points="129,-581.5 129,-604.5 "/>
-<text text-anchor="middle" x="152" y="-589.3" font-family="Times,serif" font-size="14.00">synth</text>
-<polyline fill="none" stroke="black" points="175,-581.5 175,-604.5 "/>
-<text text-anchor="middle" x="200" y="-589.3" font-family="Times,serif" font-size="14.00">restart</text>
-<polyline fill="none" stroke="black" points="225,-581.5 225,-604.5 "/>
-<text text-anchor="middle" x="245" y="-589.3" font-family="Times,serif" font-size="14.00">pass</text>
-</g>
-<!-- lookup2->miss -->
-<g id="edge21" class="edge"><title>lookup2:miss:s->miss</title>
-<path fill="none" stroke="blue" stroke-width="2" d="M75,-688C75,-676.143 79.7319,-666.085 87.137,-657.604"/>
-<polygon fill="blue" stroke="blue" stroke-width="2" points="89.6233,-660.068 94.281,-650.552 84.7056,-655.086 89.6233,-660.068"/>
-</g>
-<!-- lookup2->pass -->
-<g id="edge22" class="edge"><title>lookup2:pass:s->pass</title>
-<path fill="none" stroke="red" stroke-width="2" d="M212,-688C212,-655.911 256.629,-677.981 274,-651 298.143,-613.501 300.499,-561.496 298.321,-524.909"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="301.783,-524.27 297.56,-514.553 294.802,-524.783 301.783,-524.27"/>
-</g>
-<!-- lookup -->
-<g id="node17" class="node"><title>lookup</title>
-<polygon fill="none" stroke="grey" points="98,-818.5 98,-887.5 316,-887.5 316,-818.5 98,-818.5"/>
-<text text-anchor="middle" x="207" y="-872.3" font-family="Times,serif" font-size="14.00" fill="grey">cnt_lookup:</text>
-<polyline fill="none" stroke="grey" points="98,-864.5 316,-864.5 "/>
-<text text-anchor="middle" x="207" y="-849.3" font-family="Times,serif" font-size="14.00" fill="grey">hash lookup</text>
-<polyline fill="none" stroke="grey" points="98,-841.5 316,-841.5 "/>
-<text text-anchor="middle" x="116.5" y="-826.3" font-family="Times,serif" font-size="14.00" fill="grey">hit?</text>
-<polyline fill="none" stroke="grey" points="135,-818.5 135,-841.5 "/>
-<text text-anchor="middle" x="159" y="-826.3" font-family="Times,serif" font-size="14.00" fill="grey">miss?</text>
-<polyline fill="none" stroke="grey" points="183,-818.5 183,-841.5 "/>
-<text text-anchor="middle" x="225.5" y="-826.3" font-family="Times,serif" font-size="14.00" fill="grey">hit-for-pass?</text>
-<polyline fill="none" stroke="grey" points="268,-818.5 268,-841.5 "/>
-<text text-anchor="middle" x="292" y="-826.3" font-family="Times,serif" font-size="14.00" fill="grey">busy?</text>
-</g>
-<!-- lookup->lookup2 -->
-<g id="edge19" class="edge"><title>lookup:h:s->lookup2</title>
-<path fill="none" stroke="green" stroke-width="2" d="M116,-818C116,-809.259 116,-799.996 116,-790.958"/>
-<polygon fill="green" stroke="green" stroke-width="2" points="119.5,-790.888 116,-780.888 112.5,-790.889 119.5,-790.888"/>
-</g>
-<!-- lookup->lookup -->
-<g id="edge16" class="edge"><title>lookup:busy:e->lookup:top:e</title>
-<path fill="none" stroke="grey" d="M316,-830C322,-817 334,-817 334,-853 334,-877.75 328.328,-885.484 322.833,-883.677"/>
-<polygon fill="grey" stroke="grey" points="325.263,-881.142 316,-876 320.034,-885.797 325.263,-881.142"/>
-<text text-anchor="middle" x="367.5" y="-849.3" font-family="Times,serif" font-size="14.00" fill="grey">(waitinglist)</text>
-</g>
-<!-- lookup->miss -->
-<g id="edge17" class="edge"><title>lookup:miss:s->miss</title>
-<path fill="none" stroke="blue" stroke-width="2" d="M159,-818C159,-778.017 219.308,-814.587 241,-781 263.425,-746.279 256.118,-726.469 241,-688 236.81,-677.339 230.183,-667.328 222.711,-658.375"/>
-<polygon fill="blue" stroke="blue" stroke-width="2" points="225.227,-655.938 215.966,-650.79 219.996,-660.589 225.227,-655.938"/>
-</g>
-<!-- lookup->pass -->
-<g id="edge18" class="edge"><title>lookup:hfp:s->pass</title>
-<path fill="none" stroke="red" stroke-width="2" d="M226,-818C226,-794.744 251.216,-801.05 263,-781 313.367,-695.3 305.717,-662.137 313,-563 313.977,-549.703 315.434,-546.109 313,-533 312.47,-530.147 311.79,-527.249 311.002,-524.355"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="314.281,-523.113 307.968,-514.604 307.597,-525.193 314.281,-523.113"/>
-</g>
-<!-- miss->FETCH -->
-<g id="edge23" class="edge"><title>miss:fetch:s->FETCH</title>
-<path fill="none" stroke="blue" stroke-width="2" d="M107,-581C107,-566.206 126.544,-575.139 135,-563 165.653,-518.997 172.142,-454.572 173.188,-418.35"/>
-<polygon fill="blue" stroke="blue" stroke-width="2" points="176.693,-418.125 173.359,-408.068 169.694,-418.008 176.693,-418.125"/>
-</g>
-<!-- miss->pass -->
-<g id="edge24" class="edge"><title>miss:pass:s->pass</title>
-<path fill="none" stroke="red" stroke-width="2" d="M245,-581C245,-561.014 252.889,-540.798 262.27,-523.823"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="265.553,-525.144 267.594,-514.748 259.515,-521.602 265.553,-525.144"/>
-</g>
-<!-- pass->FETCH -->
-<g id="edge25" class="edge"><title>pass:fetch:s->FETCH</title>
-<path fill="none" stroke="red" stroke-width="2" d="M245,-445C245,-435.486 228.709,-422.805 211.625,-412.122"/>
-<polygon fill="red" stroke="red" stroke-width="2" points="213.073,-408.908 202.701,-406.745 209.46,-414.904 213.073,-408.908"/>
-</g>
-<!-- pipe_do -->
-<g id="node21" class="node"><title>pipe_do</title>
-<ellipse fill="none" stroke="black" cx="698" cy="-853" rx="95.4188" ry="26.7407"/>
-<text text-anchor="middle" x="698" y="-856.8" font-family="Times,serif" font-size="14.00">send bereq,</text>
-<text text-anchor="middle" x="698" y="-841.8" font-family="Times,serif" font-size="14.00">copy bytes until close</text>
-</g>
-<!-- pipe->pipe_do -->
-<g id="edge26" class="edge"><title>pipe:pipe->pipe_do</title>
-<path fill="none" stroke="orange" stroke-width="2" d="M651,-925C651,-911.335 657.128,-898.282 664.958,-887.18"/>
-<polygon fill="orange" stroke="orange" stroke-width="2" points="667.862,-889.146 671.205,-879.092 662.322,-884.867 667.862,-889.146"/>
-</g>
-<!-- pipe_do->DONE -->
-<g id="edge27" class="edge"><title>pipe_do->DONE</title>
-<path fill="none" stroke="orange" stroke-width="2" d="M682.476,-826.166C670.159,-803.197 655,-768.27 655,-735.5 655,-735.5 655,-735.5 655,-90 655,-58.2915 621.5,-39.6576 592.711,-29.4983"/>
-<polygon fill="orange" stroke="orange" stroke-width="2" points="593.776,-26.1642 583.183,-26.3712 591.593,-32.8151 593.776,-26.1642"/>
-</g>
-<!-- restart->recv -->
-<g id="edge29" class="edge"><title>restart:ok:s->recv</title>
-<path fill="none" stroke="black" d="M664,-1185C664,-1173.49 659.422,-1163.58 652.319,-1155.12"/>
-<polygon fill="black" stroke="black" points="654.629,-1152.47 645.145,-1147.75 649.615,-1157.36 654.629,-1152.47"/>
-</g>
-<!-- err_restart -->
-<g id="node23" class="node"><title>err_restart</title>
-<text text-anchor="middle" x="729" y="-1109.3" font-family="Times,serif" font-size="14.00">SYNTH</text>
-</g>
-<!-- restart->err_restart -->
-<g id="edge30" class="edge"><title>restart:max:s->err_restart</title>
-<path fill="none" stroke="purple" d="M728,-1185C728,-1170.65 728.207,-1154.67 728.432,-1141.51"/>
-<polygon fill="purple" stroke="purple" points="731.937,-1141.28 728.622,-1131.22 724.938,-1141.15 731.937,-1141.28"/>
-</g>
-<!-- hash->lookup -->
-<g id="edge34" class="edge"><title>hash:lookup:w->lookup</title>
-<path fill="none" stroke="green" stroke-width="2" d="M422,-960C359.706,-960 296.753,-923.759 255.21,-893.659"/>
-<polygon fill="green" stroke="green" stroke-width="2" points="257.057,-890.672 246.936,-887.539 252.895,-896.3 257.057,-890.672"/>
-</g>
-<!-- purge -->
-<g id="node25" class="node"><title>purge</title>
-<polygon fill="none" stroke="black" points="419,-818.5 419,-887.5 547,-887.5 547,-818.5 419,-818.5"/>
-<text text-anchor="middle" x="483" y="-872.3" font-family="Times,serif" font-size="14.00">cnt_purge:</text>
-<polyline fill="none" stroke="black" points="419,-864.5 547,-864.5 "/>
-<text text-anchor="middle" x="461" y="-849.3" font-family="Times,serif" font-size="14.00">vcl_purge{}</text>
-<polyline fill="none" stroke="black" points="503,-841.5 503,-864.5 "/>
-<text text-anchor="middle" x="525" y="-849.3" font-family="Times,serif" font-size="14.00">req.*</text>
-<polyline fill="none" stroke="black" points="419,-841.5 547,-841.5 "/>
-<text text-anchor="middle" x="450" y="-826.3" font-family="Times,serif" font-size="14.00">synth</text>
-<polyline fill="none" stroke="black" points="481,-818.5 481,-841.5 "/>
-<text text-anchor="middle" x="514" y="-826.3" font-family="Times,serif" font-size="14.00">restart</text>
-</g>
-<!-- hash->purge -->
-<g id="edge35" class="edge"><title>hash:lookup:s->purge:top:n</title>
-<path fill="none" stroke="purple" stroke-width="2" d="M484,-947C484,-924.462 483.261,-916.457 483.054,-898.006"/>
-<polygon fill="purple" stroke="purple" stroke-width="2" points="486.554,-897.981 483,-888 479.554,-898.019 486.554,-897.981"/>
-</g>
-</g>
-</svg>



More information about the varnish-commit mailing list