]> err.no Git - varnish/commitdiff
VCL configs change relatively seldom so we can cache the requests
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 20:17:15 +0000 (20:17 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 20:17:15 +0000 (20:17 +0000)
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
varnish-cache/bin/varnishd/cache_center.c
varnish-cache/bin/varnishd/cache_expire.c
varnish-cache/bin/varnishd/cache_pool.c
varnish-cache/bin/varnishd/cache_vcl.c

index b8d664cbc3abc9cf760e92b170caf5c449269509..587138e425bd9af6f4f1e72d0b552b8862e630b1 100644 (file)
@@ -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 *);
index 6d577d20323cd2c15fb9dc0d1d4b94a8b0f07827..29ebba4014c49760885035974400ff9efcef4576 100644 (file)
@@ -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);
index 90c8207fc4a41f560e58ef02687d879a6c3af29a..72247ee5d3d5510e15e72a135709425fb08f57b3 100644 (file)
@@ -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;
                }
index 658c7d03e6c48b830bb696e98b87e67047611a82..84b89ffe99c0f6d48e2ab703faf8135447aebe3f 100644 (file)
@@ -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);
index 19647b325e6e038c9487035b2296d02bb12e5fc4..01a5514721977ec32ccf6120c7b0a2a7bf18f30a 100644 (file)
@@ -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);