From dc5d7a4a18e585020c7feb55aabbadfa85872a11 Mon Sep 17 00:00:00 2001 From: phk Date: Sat, 16 Sep 2006 20:17:15 +0000 Subject: [PATCH] VCL configs change relatively seldom so we can cache the requests VCL reference in the worker thread when the request is done and with a cheap check reuse it for the next request handled by this thread. This should reduce mutex contention. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1032 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache.h | 6 +++-- varnish-cache/bin/varnishd/cache_center.c | 8 +++++-- varnish-cache/bin/varnishd/cache_expire.c | 6 ++--- varnish-cache/bin/varnishd/cache_pool.c | 2 ++ varnish-cache/bin/varnishd/cache_vcl.c | 28 ++++++++++++++++------- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index b8d664cb..587138e4 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -113,6 +113,7 @@ struct worker { size_t liov; struct acct acct; + struct VCL_conf *vcl; }; struct workreq { @@ -415,8 +416,9 @@ void RES_WriteObj(struct sess *sp); /* cache_vcl.c */ void VCL_Init(void); -void VCL_Rel(struct VCL_conf *vc); -struct VCL_conf *VCL_Get(void); +void VCL_Refresh(struct VCL_conf **vcc); +void VCL_Rel(struct VCL_conf **vcc); +void VCL_Get(struct VCL_conf **vcc); #define VCL_RET_MAC(l,u,b,n) #define VCL_MET_MAC(l,u,b) void VCL_##l##_method(struct sess *); diff --git a/varnish-cache/bin/varnishd/cache_center.c b/varnish-cache/bin/varnishd/cache_center.c index 6d577d20..29ebba40 100644 --- a/varnish-cache/bin/varnishd/cache_center.c +++ b/varnish-cache/bin/varnishd/cache_center.c @@ -130,7 +130,9 @@ cnt_done(struct sess *sp) vca_close_session(sp, sp->doclose); sp->backend = NULL; if (sp->vcl != NULL) { - VCL_Rel(sp->vcl); + if (sp->wrk->vcl != NULL) + VCL_Rel(&sp->wrk->vcl); + sp->wrk->vcl = sp->vcl; sp->vcl = NULL; } @@ -653,7 +655,9 @@ cnt_recv(struct sess *sp) VSL(SLT_ReqStart, sp->fd, "%s %s %u", sp->addr, sp->port, sp->xid); AZ(sp->vcl); - sp->vcl = VCL_Get(); + VCL_Refresh(&sp->wrk->vcl); + sp->vcl = sp->wrk->vcl; + sp->wrk->vcl = NULL; AZ(sp->obj); AZ(sp->vbc); diff --git a/varnish-cache/bin/varnishd/cache_expire.c b/varnish-cache/bin/varnishd/cache_expire.c index 90c8207f..72247ee5 100644 --- a/varnish-cache/bin/varnishd/cache_expire.c +++ b/varnish-cache/bin/varnishd/cache_expire.c @@ -113,7 +113,7 @@ exp_prefetch(void *arg) sp = SES_New(NULL, 0); XXXAN(sp); sleep(10); /* Takes time for VCL to arrive */ - sp->vcl = VCL_Get(); + VCL_Get(&sp->vcl); t = time(NULL); while (1) { LOCK(&exp_mtx); @@ -122,9 +122,9 @@ exp_prefetch(void *arg) CHECK_OBJ(o, OBJECT_MAGIC); if (o == NULL || o->ttl > t + expearly) { UNLOCK(&exp_mtx); - VCL_Rel(sp->vcl); + VCL_Rel(&sp->vcl); AZ(sleep(1)); - sp->vcl = VCL_Get(); + VCL_Get(&sp->vcl); t = time(NULL); continue; } diff --git a/varnish-cache/bin/varnishd/cache_pool.c b/varnish-cache/bin/varnishd/cache_pool.c index 658c7d03..84b89ffe 100644 --- a/varnish-cache/bin/varnishd/cache_pool.c +++ b/varnish-cache/bin/varnishd/cache_pool.c @@ -218,6 +218,8 @@ wrk_thread(void *priv) VSL_stats->n_wrk--; UNLOCK(&tmtx); VSL(SLT_WorkThread, 0, "%p end", w); + if (w->vcl != NULL) + VCL_Rel(&w->vcl); close(w->pipe[0]); close(w->pipe[1]); return (NULL); diff --git a/varnish-cache/bin/varnishd/cache_vcl.c b/varnish-cache/bin/varnishd/cache_vcl.c index 19647b32..01a55147 100644 --- a/varnish-cache/bin/varnishd/cache_vcl.c +++ b/varnish-cache/bin/varnishd/cache_vcl.c @@ -41,24 +41,36 @@ static MTX vcl_mtx; /*--------------------------------------------------------------------*/ -struct VCL_conf * -VCL_Get(void) +void +VCL_Refresh(struct VCL_conf **vcc) +{ + if (*vcc == vcl_active->conf) + return; + if (*vcc != NULL) + VCL_Rel(vcc); + VCL_Get(vcc); +} + +void +VCL_Get(struct VCL_conf **vcc) { - struct VCL_conf *vc; LOCK(&vcl_mtx); AN(vcl_active); - vc = vcl_active->conf; - AN(vc); - vc->busy++; + *vcc = vcl_active->conf; + AN(*vcc); + (*vcc)->busy++; UNLOCK(&vcl_mtx); - return (vc); } void -VCL_Rel(struct VCL_conf *vc) +VCL_Rel(struct VCL_conf **vcc) { struct vcls *vcl; + struct VCL_conf *vc; + + vc = *vcc; + *vcc = NULL; LOCK(&vcl_mtx); assert(vc->busy > 0); -- 2.39.5