]> err.no Git - varnish/commitdiff
Code to create, map and ident the storage silo
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 23 Feb 2009 10:07:51 +0000 (10:07 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 23 Feb 2009 10:07:51 +0000 (10:07 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@3806 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/stevedore.c
varnish-cache/bin/varnishd/stevedore.h
varnish-cache/bin/varnishd/storage_persistent.c
varnish-cache/include/persistent.h

index 4cf46d0669768f9dccf0e95e59b3c467531adbdb..6e19b5df44c838eb9d18c4927458e61ab345e6ea 100644 (file)
@@ -128,6 +128,7 @@ STV_open(void)
 const struct choice STV_choice[] = {
        { "file",       &smf_stevedore },
        { "malloc",     &sma_stevedore },
+       { "persistent", &smp_stevedore },
 #ifdef HAVE_LIBUMEM
        { "umem",       &smu_stevedore },
 #endif
index c1c192d33de5edb00223ab1b20b5ab154398cabb..ed052a70a8a24b5d5775fe7380ca406cc6674b8d 100644 (file)
@@ -71,6 +71,7 @@ void SMS_Init(void);
 
 extern struct stevedore sma_stevedore;
 extern struct stevedore smf_stevedore;
+extern struct stevedore smp_stevedore;
 #ifdef HAVE_LIBUMEM
 extern struct stevedore smu_stevedore;
 #endif
index b039ec8b84241448e4f5ee42af4b3c8d7f8dcf1e..af4aea0f565ea2e472ecc33bffb183ff3547c74f 100644 (file)
 
 #include "config.h"
 
+#include <errno.h>
+#include <stdio.h>
 #include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/param.h>
+#include <sys/mman.h>
 
 #include "cache.h"
 #include "stevedore.h"
+#include "vsha256.h"
 
 #include "persistent.h"
 
+struct smp_sc {
+       unsigned                magic;
+#define SMP_SC_MAGIC           0x7b73af0a 
+
+       int                     fd;
+       const char              *filename;
+       off_t                   mediasize;
+       unsigned                granularity;
+
+       uint8_t                 *ptr;
+};
+
+/*--------------------------------------------------------------------*/
+
+static void
+smp_make_sign(const void *ptr, off_t len, uint8_t *dest)
+{
+       struct SHA256Context c;
+
+       SHA256_Init(&c);
+       SHA256_Update(&c, ptr, len);
+       SHA256_Final(dest, &c);
+}
+
+/*--------------------------------------------------------------------*/
+
+static int
+smp_check_sign(const void *ptr, off_t len, const void *sign)
+{
+       struct SHA256Context c;
+       unsigned char nsign[32];
+
+       SHA256_Init(&c);
+       SHA256_Update(&c, ptr, len);
+       SHA256_Final(nsign, &c);
+       return(memcmp(sign, nsign, sizeof nsign));
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+smp_newsilo(struct smp_sc *sc)
+{
+       struct smp_ident        *si;
+
+       assert(strlen(SMP_IDENT_STRING) < sizeof si->ident);
+       si = (void*)sc->ptr;
+       memset(si, 0, sizeof *si);
+       strcpy(si->ident, SMP_IDENT_STRING);
+       si->byte_order = 0x12345678;
+       si->size = sizeof *si;
+       si->major_version = 1;
+       si->minor_version = 1;
+       si->mediasize = sc->mediasize;
+       si->granularity = sc->granularity;
+
+       smp_make_sign(si, sizeof *si, sc->ptr + sizeof *si);
+}
+
+/*--------------------------------------------------------------------*/
+
+static int
+smp_valid_ident(struct smp_sc *sc)
+{
+       struct smp_ident        *si;
+
+       assert(strlen(SMP_IDENT_STRING) < sizeof si->ident);
+       si = (void*)sc->ptr;
+       if (strcmp(si->ident, SMP_IDENT_STRING))
+               return (1);
+       if (si->byte_order != 0x12345678)
+               return (2);
+       if (si->size != sizeof *si)
+               return (3);
+       if (smp_check_sign(si, sizeof *si, sc->ptr + sizeof *si))
+               return (4);
+       if (si->major_version != 1)
+               return (5);
+       if (si->minor_version != 1)
+               return (6);
+       if (si->mediasize != sc->mediasize)
+               return (7);
+       if (si->granularity != sc->granularity)
+               return (8);
+       return (0);
+}
+
+/*--------------------------------------------------------------------*/
+
 static void
 smp_init(struct stevedore *parent, int ac, char * const *av)
 {
+       struct smp_sc           *sc;
+       int i;
        
        (void)parent;
-       (void)ac;
-       (void)av;
+
+       AZ(av[ac]);
        assert(sizeof(struct smp_ident) == SMP_IDENT_SIZE);
        assert(sizeof(struct smp_object) == SMP_OBJECT_SIZE);
+
+       /* Allocate softc */
+       ALLOC_OBJ(sc, SMP_SC_MAGIC);
+       XXXAN(sc);
+       sc->fd = -1;
+
+       /* Argument processing */
+       if (ac != 2)
+               ARGV_ERR("(-spersistent) wrong number of arguments\n");
+
+       i = STV_GetFile(av[0], &sc->fd, &sc->filename, "-spersistent");
+       if (i == 2)
+               ARGV_ERR("(-spersistent) need filename (not directory)\n");
+
+       sc->granularity = getpagesize();
+       sc->mediasize = STV_FileSize(sc->fd, av[1], &sc->granularity,
+           "-spersistent");
+
+       AZ(ftruncate(sc->fd, sc->mediasize));
+
+       sc->ptr = mmap(NULL, sc->mediasize, PROT_READ|PROT_WRITE,
+           MAP_NOCORE | MAP_NOSYNC | MAP_SHARED, sc->fd, 0);
+
+       if (sc->ptr == MAP_FAILED)
+               ARGV_ERR("(-spersistent) failed to mmap (%s)\n",
+                   strerror(errno));
+
+       fprintf(stderr, "i = %d ms = %jd g = %u\n",
+           i, (intmax_t)sc->mediasize, sc->granularity);
+
+       fprintf(stderr, "Silo: %d\n", smp_valid_ident(sc));
+       smp_newsilo(sc);
+       fprintf(stderr, "Silo: %d\n", smp_valid_ident(sc));
+       exit (2);
 }
 
+/*--------------------------------------------------------------------*/
+
 struct stevedore smp_stevedore = {
        .magic  =       STEVEDORE_MAGIC,
        .name   =       "persistent",
index 3d92ff91f1ae9e524ded1eafd363cb911c65e1d7..6997a1d9786f4c475f26f769afcf1ca651a2abbc 100644 (file)
@@ -81,6 +81,8 @@ struct smp_ident {
 
 #define SMP_IDENT_SIZE         (32 + 4 + 4 + 4 + 4 + 8 + 4 )
 
+#define SMP_IDENT_STRING       "Varnish Persistent Storage Silo"
+
 /*
  * A segment descriptor.
  */