Commit 120480f4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

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: http://www.varnish-cache.org/svn/trunk/varnish-cache@1032 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 3878ccf7
......@@ -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 *);
......
......@@ -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);
......
......@@ -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;
}
......
......@@ -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);
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment