]> err.no Git - varnish/commitdiff
Support for multiple cache files. The selecting of a cache file is done by a simple...
authorcecilihf <cecilihf@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 20 Jul 2007 08:16:44 +0000 (08:16 +0000)
committercecilihf <cecilihf@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 20 Jul 2007 08:16:44 +0000 (08:16 +0000)
the first file in the list, and then moves it to the end. If the selected file hasn't got enough space, the next
one is tried. If no file has enough space, the LRU discarding is applied to the first file in the list.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1724 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_main.c
varnish-cache/bin/varnishd/heritage.h
varnish-cache/bin/varnishd/stevedore.c
varnish-cache/bin/varnishd/stevedore.h
varnish-cache/bin/varnishd/varnishd.c

index c8d9506d85dd3a3e15e8dff64d29420204557d67..4c085c74467b3512d37f90a2ef9c58cdc3790296 100644 (file)
@@ -221,7 +221,7 @@ struct storage {
  * XXX: selected by some kind of heuristics based on size, lifetime
  * XXX: etc etc.  For now we support only one.
  */
-extern struct stevedore *stevedore;
+extern struct stevedore_head *stevedore_h;
 
 /* -------------------------------------------------------------------*/
 
index 92fc0b399bdd3360d618a2a764128c7b66ba08bd..24a185a13cb79ec2c233ec93a039bec9dc5117c7 100644 (file)
@@ -38,7 +38,7 @@
 #include "shmlog.h"
 #include "cache.h"
 
-struct stevedore       *stevedore;
+struct stevedore_head          *stevedore_h;
 
 /*--------------------------------------------------------------------
  * XXX: Think more about which order we start things
@@ -47,6 +47,7 @@ struct stevedore      *stevedore;
 void
 child_main(void)
 {
+       struct stevedore *st;
 
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
@@ -66,9 +67,11 @@ child_main(void)
        HSH_Init();
        BAN_Init();
 
-       stevedore = heritage.stevedore;
-       if (stevedore->open != NULL)
-               stevedore->open(stevedore);
+       stevedore_h = &heritage.stevedore_h;
+       TAILQ_FOREACH(st, stevedore_h, stevedore_list) {
+               if (st->open != NULL)
+                       st->open(st);
+       }
 
        printf("Ready\n");
        VSL_stats->start_time = (time_t)TIM_real();
index ad471ec2b3207441ab9585edd2ceddd261766a7f..d70e3589d8690db08f5fa4a603aab41a5a31378c 100644 (file)
@@ -40,6 +40,7 @@ struct listen_sock {
 };
 
 TAILQ_HEAD(listen_sock_head, listen_sock);
+TAILQ_HEAD(stevedore_head, stevedore);
 
 struct heritage {
 
@@ -58,7 +59,7 @@ struct heritage {
        unsigned                        vsl_size;
 
        /* Storage method */
-       struct stevedore                *stevedore;
+       struct stevedore_head           stevedore_h;
 
        /* Hash method */
        struct hash_slinger             *hash;
index e609346f61dda3fbf0c44847f7bd25266e5fdc20..1ef53f424e0974d2df6e99ad016e976ccfc733c8 100644 (file)
  * $Id$
  */
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "cache.h"
+#include "heritage.h"
+
+extern struct stevedore sma_stevedore;
+extern struct stevedore smf_stevedore;
+
 
 struct storage *
 STV_alloc(size_t size)
 {
        struct storage *st;
+       struct stevedore *stv, *stv_first;
 
-       AN(stevedore);
-       AN(stevedore->alloc);
+       /* Simple round robin selecting of a stevedore.
+        */
+       stv_first = TAILQ_FIRST(stevedore_h);
+       stv = stv_first;
+       do {
+               AN(stv->alloc);
+               st = stv->alloc(stv, size);
+               TAILQ_REMOVE(stevedore_h, stv, stevedore_list);
+               TAILQ_INSERT_TAIL(stevedore_h, stv, stevedore_list);
+               if (st != NULL)
+                       return (st);
+       } while ((stv = TAILQ_FIRST(stevedore_h)) != stv_first);
+       
+       /* No stevedore with enough space is found. Make room in the first
+        * one in the list, and move it to the end. Ensuring the round-robin.
+        */
+       stv = TAILQ_FIRST(stevedore_h);
+       TAILQ_REMOVE(stevedore_h, stv, stevedore_list);
+       TAILQ_INSERT_TAIL(stevedore_h, stv, stevedore_list);
+       
        do {
-               if ((st = stevedore->alloc(stevedore, size)) == NULL)
+               if ((st = stv->alloc(stv, size)) == NULL)
                        AN(LRU_DiscardOne());
        } while (st == NULL);
+       
        return (st);
 }
 
@@ -58,6 +87,47 @@ STV_free(struct storage *st)
 {
 
        AN(st->stevedore);
-       AN(stevedore->free);
+       AN(st->stevedore->free);
        st->stevedore->free(st);
 }
+
+static int
+cmp_storage(struct stevedore *s, const char *p, const char *q)
+{
+       if (strlen(s->name) != q - p)
+               return (1);
+       if (strncmp(s->name, p, q - p))
+               return (1);
+       return (0);
+}
+
+
+void
+STV_add(const char *spec)
+{
+       const char *p, *q;
+       struct stevedore *stp;
+
+       p = strchr(spec, ',');
+       if (p == NULL)
+               q = p = strchr(spec, '\0');
+       else
+               q = p + 1;
+       xxxassert(p != NULL);
+       xxxassert(q != NULL);
+       
+       stp = malloc(sizeof *stp);
+       
+       if (!cmp_storage(&sma_stevedore, spec, p)) {
+               *stp = sma_stevedore;
+       } else if (!cmp_storage(&smf_stevedore, spec, p)) {
+               *stp = smf_stevedore;
+       } else {
+               fprintf(stderr, "Unknown storage method \"%.*s\"\n",
+                   (int)(p - spec), spec);
+               exit (2);
+       }
+       TAILQ_INSERT_HEAD(&heritage.stevedore_h, stp, stevedore_list);
+       if (stp->init != NULL)
+               stp->init(stp, q);
+}
index f88c11c91f2c0d7e91d8c42f7ae39fbf6ce64f93..10b7f17a1649a9cd9eb682d044752e558934d26a 100644 (file)
@@ -28,6 +28,9 @@
  *
  * $Id$
  */
+
+#include "queue.h"
 
 struct stevedore;
 struct sess;
@@ -49,8 +52,10 @@ struct stevedore {
 
        /* private fields */
        void                    *priv;
+       TAILQ_ENTRY(stevedore)  stevedore_list;
 };
 
 struct storage *STV_alloc(size_t size);
 void STV_trim(struct storage *st, size_t size);
 void STV_free(struct storage *st);
+void STV_add(const char *spec);
index aa0495a692a08dbf688ca4ed5b5567fa439a0c8a..f9fc09ed3f1d64539bed33d3c703c38e9de6ff35 100644 (file)
@@ -120,46 +120,6 @@ setup_hash(const char *s_arg)
 
 /*--------------------------------------------------------------------*/
 
-static int
-cmp_storage(struct stevedore *s, const char *p, const char *q)
-{
-       if (strlen(s->name) != q - p)
-               return (1);
-       if (strncmp(s->name, p, q - p))
-               return (1);
-       return (0);
-}
-
-static void
-setup_storage(const char *s_arg)
-{
-       const char *p, *q;
-       struct stevedore *stp;
-
-       p = strchr(s_arg, ',');
-       if (p == NULL)
-               q = p = strchr(s_arg, '\0');
-       else
-               q = p + 1;
-       xxxassert(p != NULL);
-       xxxassert(q != NULL);
-       if (!cmp_storage(&sma_stevedore, s_arg, p)) {
-               stp = &sma_stevedore;
-       } else if (!cmp_storage(&smf_stevedore, s_arg, p)) {
-               stp = &smf_stevedore;
-       } else {
-               fprintf(stderr, "Unknown storage method \"%.*s\"\n",
-                   (int)(p - s_arg), s_arg);
-               exit (2);
-       }
-       heritage.stevedore = malloc(sizeof *heritage.stevedore);
-       *heritage.stevedore = *stp;
-       if (stp->init != NULL)
-               stp->init(heritage.stevedore, q);
-}
-
-/*--------------------------------------------------------------------*/
-
 static void
 usage(void)
 {
@@ -416,6 +376,7 @@ main(int argc, char *argv[])
        const char *n_arg = NULL;
        const char *P_arg = NULL;
        const char *s_arg = "file";
+       int s_arg_given = 0;
        const char *T_arg = NULL;
        char *p;
        struct cli cli[1];
@@ -431,6 +392,8 @@ main(int argc, char *argv[])
        cli[0].result = CLIS_OK;
 
        TAILQ_INIT(&heritage.socks);
+       TAILQ_INIT(&heritage.stevedore_h);
+       
        mgt_vcc_init();
 
        MCF_ParamInit(cli);
@@ -479,7 +442,8 @@ main(int argc, char *argv[])
                        cli_check(cli);
                        break;
                case 's':
-                       s_arg = optarg;
+                       s_arg_given = 1;
+                       STV_add(optarg);
                        break;
                case 't':
                        MCF_ParamSet(cli, "default_ttl", optarg);
@@ -570,7 +534,9 @@ main(int argc, char *argv[])
        if (C_flag)
                exit (0);
 
-       setup_storage(s_arg);
+       if (!s_arg_given)
+               STV_add(s_arg);
+       
        setup_hash(h_arg);
 
        VSL_MgtInit(SHMLOG_FILENAME, 8*1024*1024);