]> err.no Git - varnish/commitdiff
Hash on both URL and Host header. If no host header, hash on URL twice.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 12 Jul 2006 12:04:28 +0000 (12:04 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 12 Jul 2006 12:04:28 +0000 (12:04 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@454 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache_fetch.c
varnish-cache/bin/varnishd/cache_hash.c
varnish-cache/bin/varnishd/hash_classic.c
varnish-cache/bin/varnishd/hash_simple_list.c
varnish-cache/bin/varnishd/hash_slinger.h

index 47d538a7ee84591e8e86fb6d186313150bba1c64..7a80feb5b6395a392d44c547cd0b07e1f9f3505a 100644 (file)
@@ -233,11 +233,11 @@ fetch_eof(struct sess *sp, int fd, struct http *hp)
 int
 FetchBody(struct worker *w, struct sess *sp)
 {
-       int i, cls;
+       int cls;
        struct vbe_conn *vc;
        struct http *hp;
        char *b;
-       int body;
+       int body = 1;           /* XXX */
 
        vc = sp->vbc;
        hp = sp->bkd_http;
@@ -278,11 +278,9 @@ FetchBody(struct worker *w, struct sess *sp)
 int
 FetchHeaders(struct worker *w, struct sess *sp)
 {
-       int i, cls;
+       int i;
        struct vbe_conn *vc;
        struct http *hp;
-       char *b;
-       int body;
 
        sp->obj->xid = sp->xid;
 
index ba2d5f4ca689d9275fe11f581342745565a49a47..a5e80434713917af3ff7d5215db42b91833bded0 100644 (file)
@@ -20,7 +20,7 @@ HSH_Lookup(struct worker *w, struct http *h)
 {
        struct objhead *oh;
        struct object *o;
-       char *b;
+       char *b, *c;
 
        assert(hash != NULL);
        /* Precreate an objhead and object in case we need them */
@@ -41,7 +41,9 @@ HSH_Lookup(struct worker *w, struct http *h)
        }
 
        assert(http_GetURL(h, &b));
-       oh = hash->lookup(b, w->nobjhead);
+       if (!http_GetHdr(h, "Host", &c))
+               c = b;
+       oh = hash->lookup(b, c, w->nobjhead);
        if (oh == w->nobjhead)
                w->nobjhead = NULL;
        AZ(pthread_mutex_lock(&oh->mtx));
index eed5e8bb405605c4d6b2c7039374fc33d28766ce..44fb55ff46bbb28a959cd802516136a7d7b6a981 100644 (file)
@@ -17,7 +17,8 @@
 
 struct hcl_entry {
        TAILQ_ENTRY(hcl_entry)  list;
-       char                    *key;
+       char                    *key1;
+       char                    *key2;
        struct objhead          *obj;
        unsigned                refcnt;
        unsigned                hash;
@@ -97,7 +98,7 @@ hcl_start(void)
  */
 
 static struct objhead *
-hcl_lookup(const char *key, struct objhead *nobj)
+hcl_lookup(const char *key1, const char *key2, struct objhead *nobj)
 {
        struct hcl_entry *he, *he2;
        MD5_CTX c;
@@ -106,7 +107,9 @@ hcl_lookup(const char *key, struct objhead *nobj)
        int i;
 
        MD5Init(&c);
-       MD5Update(&c, key, strlen(key));
+       MD5Update(&c, key1, strlen(key1));
+       MD5Update(&c, "", 1);
+       MD5Update(&c, key2, strlen(key2));
        MD5Final(md5, &c);
        memcpy(&u1, md5, sizeof u1);
        u1 %= hcl_nhash;
@@ -115,21 +118,25 @@ hcl_lookup(const char *key, struct objhead *nobj)
 
        AZ(pthread_mutex_lock(&hcl_mutex[u2]));
        TAILQ_FOREACH(he, &hcl_head[u1], list) {
-               i = strcmp(key, he->key);
+               i = strcmp(key1, he->key1);
                if (i < 0)
                        continue;
-               if (i == 0) {
-                       he->refcnt++;
-                       nobj = he->obj;
-                       nobj->hashpriv = he;
-                       AZ(pthread_mutex_unlock(&hcl_mutex[u2]));
-                       return (nobj);
-               }
-               if (nobj == NULL) {
-                       AZ(pthread_mutex_unlock(&hcl_mutex[u2]));
-                       return (NULL);
-               }
-               break;
+               if (i > 0)
+                       break;
+               i = strcmp(key2, he->key2);
+               if (i < 0)
+                       continue;
+               if (i > 0)
+                       break;
+               he->refcnt++;
+               nobj = he->obj;
+               nobj->hashpriv = he;
+               AZ(pthread_mutex_unlock(&hcl_mutex[u2]));
+               return (nobj);
+       }
+       if (nobj == NULL) {
+               AZ(pthread_mutex_unlock(&hcl_mutex[u2]));
+               return (NULL);
        }
        he2 = calloc(sizeof *he2, 1);
        assert(he2 != NULL);
@@ -137,8 +144,10 @@ hcl_lookup(const char *key, struct objhead *nobj)
        he2->refcnt = 1;
        he2->hash = u1;
        he2->mtx = u2;
-       he2->key = strdup(key);
-       assert(he2->key != NULL);
+       he2->key1 = strdup(key1);
+       assert(he2->key1 != NULL);
+       he2->key2 = strdup(key2);
+       assert(he2->key2 != NULL);
        nobj->hashpriv = he2;
        if (he != NULL)
                TAILQ_INSERT_BEFORE(he, he2, list);
@@ -164,7 +173,8 @@ hcl_deref(struct objhead *obj)
        mtx = he->mtx;
        AZ(pthread_mutex_lock(&hcl_mutex[mtx]));
        if (--he->refcnt == 0) {
-               free(he->key);
+               free(he->key1);
+               free(he->key2);
                TAILQ_REMOVE(&hcl_head[he->hash], he, list);
                free(he);
                ret = 0;
index 506d921839fb6e7f95bd6b85244b027f67d3f123..9271c6922e4c193392c8b2420b02b63f2e3024a3 100644 (file)
@@ -15,7 +15,8 @@
 
 struct hsl_entry {
        TAILQ_ENTRY(hsl_entry)  list;
-       char                    *key;
+       char                    *key1;
+       char                    *key2;
        struct objhead          *obj;
        unsigned                refcnt;
 };
@@ -43,35 +44,41 @@ hsl_start(void)
  */
 
 static struct objhead *
-hsl_lookup(const char *key, struct objhead *nobj)
+hsl_lookup(const char *key1, const char *key2, struct objhead *nobj)
 {
        struct hsl_entry *he, *he2;
        int i;
 
        AZ(pthread_mutex_lock(&hsl_mutex));
        TAILQ_FOREACH(he, &hsl_head, list) {
-               i = strcmp(key, he->key);
+               i = strcmp(key1, he->key1);
                if (i < 0)
                        continue;
-               if (i == 0) {
-                       he->refcnt++;
-                       nobj = he->obj;
-                       nobj->hashpriv = he;
-                       AZ(pthread_mutex_unlock(&hsl_mutex));
-                       return (nobj);
-               }
-               if (nobj == NULL) {
-                       AZ(pthread_mutex_unlock(&hsl_mutex));
-                       return (NULL);
-               }
-               break;
+               if (i > 0) 
+                       break;
+               i = strcmp(key2, he->key2);
+               if (i < 0)
+                       continue;
+               if (i > 0) 
+                       break;
+               he->refcnt++;
+               nobj = he->obj;
+               nobj->hashpriv = he;
+               AZ(pthread_mutex_unlock(&hsl_mutex));
+               return (nobj);
+       }
+       if (nobj == NULL) {
+               AZ(pthread_mutex_unlock(&hsl_mutex));
+               return (NULL);
        }
        he2 = calloc(sizeof *he2, 1);
        assert(he2 != NULL);
        he2->obj = nobj;
        he2->refcnt = 1;
-       he2->key = strdup(key);
-       assert(he2->key != NULL);
+       he2->key1 = strdup(key1);
+       assert(he2->key1 != NULL);
+       he2->key2 = strdup(key2);
+       assert(he2->key2 != NULL);
        nobj->hashpriv = he2;
        if (he != NULL)
                TAILQ_INSERT_BEFORE(he, he2, list);
@@ -95,7 +102,8 @@ hsl_deref(struct objhead *obj)
        he = obj->hashpriv;
        AZ(pthread_mutex_lock(&hsl_mutex));
        if (--he->refcnt == 0) {
-               free(he->key);
+               free(he->key1);
+               free(he->key2);
                TAILQ_REMOVE(&hsl_head, he, list);
                free(he);
                ret = 0;
index b5c878a45b917b109b0556d0a68f223bc7e86996..053409880174d0a2f346d13adb8415400bd49ce8 100644 (file)
@@ -4,7 +4,7 @@
 
 typedef int hash_init_f(const char *);
 typedef void hash_start_f(void);
-typedef struct objhead *hash_lookup_f(const char *key, struct objhead *nobj);
+typedef struct objhead *hash_lookup_f(const char *key1, const char *key2, struct objhead *nobj);
 typedef int hash_deref_f(struct objhead *obj);
 
 struct hash_slinger {