From: phk Date: Wed, 12 Jul 2006 12:04:28 +0000 (+0000) Subject: Hash on both URL and Host header. If no host header, hash on URL twice. X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=615ded2fe8656eb7008bd85697a8132411904132;p=varnish Hash on both URL and Host header. If no host header, hash on URL twice. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@454 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishd/cache_fetch.c b/varnish-cache/bin/varnishd/cache_fetch.c index 47d538a7..7a80feb5 100644 --- a/varnish-cache/bin/varnishd/cache_fetch.c +++ b/varnish-cache/bin/varnishd/cache_fetch.c @@ -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; diff --git a/varnish-cache/bin/varnishd/cache_hash.c b/varnish-cache/bin/varnishd/cache_hash.c index ba2d5f4c..a5e80434 100644 --- a/varnish-cache/bin/varnishd/cache_hash.c +++ b/varnish-cache/bin/varnishd/cache_hash.c @@ -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)); diff --git a/varnish-cache/bin/varnishd/hash_classic.c b/varnish-cache/bin/varnishd/hash_classic.c index eed5e8bb..44fb55ff 100644 --- a/varnish-cache/bin/varnishd/hash_classic.c +++ b/varnish-cache/bin/varnishd/hash_classic.c @@ -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; diff --git a/varnish-cache/bin/varnishd/hash_simple_list.c b/varnish-cache/bin/varnishd/hash_simple_list.c index 506d9218..9271c692 100644 --- a/varnish-cache/bin/varnishd/hash_simple_list.c +++ b/varnish-cache/bin/varnishd/hash_simple_list.c @@ -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; diff --git a/varnish-cache/bin/varnishd/hash_slinger.h b/varnish-cache/bin/varnishd/hash_slinger.h index b5c878a4..05340988 100644 --- a/varnish-cache/bin/varnishd/hash_slinger.h +++ b/varnish-cache/bin/varnishd/hash_slinger.h @@ -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 {