From cbe287ab10afef117cff318e7dc2c07becb82933 Mon Sep 17 00:00:00 2001 From: phk Date: Thu, 30 Mar 2006 09:26:34 +0000 Subject: [PATCH] Add the beginning of a backend connection pool git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@86 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/Makefile.am | 1 + varnish-cache/bin/varnishd/cache.h | 3 + varnish-cache/bin/varnishd/cache_backend.c | 92 ++++++++++++++++++++++ varnish-cache/bin/varnishd/cache_main.c | 1 + varnish-cache/bin/varnishd/cache_pool.c | 1 + varnish-cache/bin/varnishd/varnishd.c | 2 +- varnish-cache/include/vcl_lang.h | 14 ++-- varnish-cache/lib/libvcl/vcl_compile.c | 5 +- varnish-cache/lib/libvcl/vcl_fixed_token.c | 14 ++-- 9 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 varnish-cache/bin/varnishd/cache_backend.c diff --git a/varnish-cache/bin/varnishd/Makefile.am b/varnish-cache/bin/varnishd/Makefile.am index a822cc26..ddea6a70 100644 --- a/varnish-cache/bin/varnishd/Makefile.am +++ b/varnish-cache/bin/varnishd/Makefile.am @@ -6,6 +6,7 @@ bin_PROGRAMS = varnishd varnishd_SOURCES = \ cache_acceptor.c \ + cache_backend.c \ cache_httpd.c \ cache_main.c \ cache_pool.c \ diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index 2e87481b..e69b631a 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -5,6 +5,9 @@ /* cache_acceptor.c */ void *vca_main(void *arg); +/* cache_backend.c */ +void VBE_Init(void); + /* cache_httpd.c */ void HttpdAnalyze(struct sess *sp); diff --git a/varnish-cache/bin/varnishd/cache_backend.c b/varnish-cache/bin/varnishd/cache_backend.c new file mode 100644 index 00000000..84f8fe08 --- /dev/null +++ b/varnish-cache/bin/varnishd/cache_backend.c @@ -0,0 +1,92 @@ +/* + * $Id$ + */ + +#include +#include +#include +#include "libvarnish.h" +#include "vcl_lang.h" + +/* + * The internal backend structure for managing connection pools per + * backend. We need to shadow the backend stucture from the VCL + * in order let connections live across VCL switches. + */ + +struct vbe_conn { + TAILQ_ENTRY(vbe_conn) list; + struct vbe *vbe; + int fd; +}; + +struct vbe { + unsigned ip; + TAILQ_ENTRY(vbe) list; + TAILQ_HEAD(,vbe_conn) fconn; + TAILQ_HEAD(,vbe_conn) bconn; + unsigned nconn; +}; + +static TAILQ_HEAD(,vbe) vbe_head = TAILQ_HEAD_INITIALIZER(vbe_head); + +static pthread_mutex_t vbemtx; + +/*--------------------------------------------------------------------*/ +void +connect_to_backend(struct vbe_conn *vc, struct backend *bp) +{ +} + +/*--------------------------------------------------------------------*/ + +int +VBE_GetFd(struct backend *bp) +{ + struct vbe *vp; + struct vbe_conn *vc; + + AZ(pthread_mutex_lock(&vbemtx)); + vp = bp->vbe; + if (vp == NULL) { + TAILQ_FOREACH(vp, &vbe_head, list) + if (vp->ip == bp->ip) + break; + } + if (vp == NULL) { + vp = calloc(sizeof *vp, 1); + assert(vp != NULL); + TAILQ_INIT(&vp->fconn); + TAILQ_INIT(&vp->bconn); + vp->ip = bp->ip; + bp->vbe = vp; + TAILQ_INSERT_TAIL(&vbe_head, vp, list); + } + /* XXX: check nconn vs backend->maxcon */ + vc = TAILQ_FIRST(&vp->fconn); + if (vc != NULL) { + TAILQ_REMOVE(&vp->fconn, vc, list); + TAILQ_INSERT_TAIL(&vp->bconn, vc, list); + AZ(pthread_mutex_unlock(&vbemtx)); + return (vc->fd); + } + vc = calloc(sizeof *vc, 1); + assert(vc != NULL); + vc->vbe = vp; + TAILQ_INSERT_TAIL(&vp->bconn, vc, list); + AZ(pthread_mutex_unlock(&vbemtx)); + connect_to_backend(vc, bp); + + /* XXX */ + return (-1); +} + + + + +void +VBE_Init(void) +{ + + AZ(pthread_mutex_init(&vbemtx, NULL)); +} diff --git a/varnish-cache/bin/varnishd/cache_main.c b/varnish-cache/bin/varnishd/cache_main.c index 9fcb1c60..e67101d1 100644 --- a/varnish-cache/bin/varnishd/cache_main.c +++ b/varnish-cache/bin/varnishd/cache_main.c @@ -103,6 +103,7 @@ child_main(void) printf("Child starts\n"); AZ(pthread_mutex_init(&sessmtx, NULL)); + VBE_Init(); VSL_Init(); CacheInitPool(); diff --git a/varnish-cache/bin/varnishd/cache_pool.c b/varnish-cache/bin/varnishd/cache_pool.c index 58cc0028..0e294c45 100644 --- a/varnish-cache/bin/varnishd/cache_pool.c +++ b/varnish-cache/bin/varnishd/cache_pool.c @@ -33,6 +33,7 @@ CacheWorker(void *priv __unused) HttpdAnalyze(sp); + sp->backend = sp->vcl->default_backend; /* Call the VCL program */ sp->vcl->main_func(sp); diff --git a/varnish-cache/bin/varnishd/varnishd.c b/varnish-cache/bin/varnishd/varnishd.c index 6266f638..3ee9f9b8 100644 --- a/varnish-cache/bin/varnishd/varnishd.c +++ b/varnish-cache/bin/varnishd/varnishd.c @@ -68,7 +68,7 @@ vcl_default(const char *bflag) buf = NULL; asprintf(&buf, - "backend default { set backend.ip = %s; }\n" + "backend default { set backend.host = \"%s\"; }\n" "sub main {\n" " pass;\n" #if 0 diff --git a/varnish-cache/include/vcl_lang.h b/varnish-cache/include/vcl_lang.h index fcb5e095..182a2025 100644 --- a/varnish-cache/include/vcl_lang.h +++ b/varnish-cache/include/vcl_lang.h @@ -53,6 +53,7 @@ struct sess { TAILQ_ENTRY(sess) list; + struct backend *backend; struct VCL_conf *vcl; /* Various internal stuff */ @@ -60,21 +61,18 @@ struct sess { struct sessmem *mem; }; -struct be_conn { - TAILQ_ENTRY(be_conn) list; - int fd; -}; - struct backend { + const char *hostname; + const char *portname; + struct addrinfo *addr; unsigned ip; double responsetime; double timeout; double bandwidth; int down; - /* Internals */ - TAILQ_HEAD(,be_conn) bec_head; - unsigned nbec; + /* internal stuff */ + struct vbe *vbe; }; #define VCL_FARGS struct sess *sess diff --git a/varnish-cache/lib/libvcl/vcl_compile.c b/varnish-cache/lib/libvcl/vcl_compile.c index eeb31b33..47f7f49b 100644 --- a/varnish-cache/lib/libvcl/vcl_compile.c +++ b/varnish-cache/lib/libvcl/vcl_compile.c @@ -109,6 +109,9 @@ struct ref { static struct var vars[] = { + { "backend.host", STRING, 0, "backend->hostname" }, + { "backend.port", STRING, 0, "backend->portname" }, +#if 0 { "req.ttlfactor", FLOAT, 0, "req->ttlfactor" }, { "req.url.host", STRING, 0, "req->url.host" }, { "req.url.path", STRING, 0, "req->url.path" }, @@ -116,7 +119,6 @@ static struct var vars[] = { { "req.backend", BACKEND, 0, "req->backend" }, { "client.ip", IP, 0, "client->ip" }, { "backend.response_time", TIME, 0, "backend->responsetime" }, - { "backend.ip", IP, 0, "backend->ip" }, { "backend.down", BOOL, 0, "backend->down" }, { "backend.timeout", TIME, 0, "backend->timeout" }, { "backend.bandwidth", RATE, 0, "backend->bandwidth" }, @@ -125,6 +127,7 @@ static struct var vars[] = { { "obj.result", INT, 0, "obj->result" }, { "obj.size", SIZE, 0, "obj->size" }, { "obj.usage", INT, 0, "obj->usage" }, +#endif { NULL, INT, 0, "NULL" } }; diff --git a/varnish-cache/lib/libvcl/vcl_fixed_token.c b/varnish-cache/lib/libvcl/vcl_fixed_token.c index 9fd5f86e..80733ce4 100644 --- a/varnish-cache/lib/libvcl/vcl_fixed_token.c +++ b/varnish-cache/lib/libvcl/vcl_fixed_token.c @@ -434,6 +434,7 @@ vcl_output_lang_h(FILE *f) fputs("\n", f); fputs(" TAILQ_ENTRY(sess) list;\n", f); fputs("\n", f); + fputs(" struct backend *backend;\n", f); fputs(" struct VCL_conf *vcl;\n", f); fputs("\n", f); fputs(" /* Various internal stuff */\n", f); @@ -441,21 +442,18 @@ vcl_output_lang_h(FILE *f) fputs(" struct sessmem *mem;\n", f); fputs("};\n", f); fputs("\n", f); - fputs("struct be_conn {\n", f); - fputs(" TAILQ_ENTRY(be_conn) list;\n", f); - fputs(" int fd;\n", f); - fputs("};\n", f); - fputs("\n", f); fputs("struct backend {\n", f); + fputs(" const char *hostname;\n", f); + fputs(" const char *portname;\n", f); + fputs(" struct addrinfo *addr;\n", f); fputs(" unsigned ip;\n", f); fputs(" double responsetime;\n", f); fputs(" double timeout;\n", f); fputs(" double bandwidth;\n", f); fputs(" int down;\n", f); fputs("\n", f); - fputs(" /* Internals */\n", f); - fputs(" TAILQ_HEAD(,be_conn) bec_head;\n", f); - fputs(" unsigned nbec;\n", f); + fputs(" /* internal stuff */\n", f); + fputs(" struct vbe *vbe;\n", f); fputs("};\n", f); fputs("\n", f); fputs("#define VCL_FARGS struct sess *sess\n", f); -- 2.39.5