r454 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Wed Jul 12 14:04:28 CEST 2006


Author: phk
Date: 2006-07-12 14:04:28 +0200 (Wed, 12 Jul 2006)
New Revision: 454

Modified:
   trunk/varnish-cache/bin/varnishd/cache_fetch.c
   trunk/varnish-cache/bin/varnishd/cache_hash.c
   trunk/varnish-cache/bin/varnishd/hash_classic.c
   trunk/varnish-cache/bin/varnishd/hash_simple_list.c
   trunk/varnish-cache/bin/varnishd/hash_slinger.h
Log:
Hash on both URL and Host header.  If no host header, hash on URL twice.


Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_fetch.c	2006-07-12 11:48:07 UTC (rev 453)
+++ trunk/varnish-cache/bin/varnishd/cache_fetch.c	2006-07-12 12:04:28 UTC (rev 454)
@@ -233,11 +233,11 @@
 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 @@
 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;
 

Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c	2006-07-12 11:48:07 UTC (rev 453)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c	2006-07-12 12:04:28 UTC (rev 454)
@@ -20,7 +20,7 @@
 {
 	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 @@
 	}
 
 	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));

Modified: trunk/varnish-cache/bin/varnishd/hash_classic.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/hash_classic.c	2006-07-12 11:48:07 UTC (rev 453)
+++ trunk/varnish-cache/bin/varnishd/hash_classic.c	2006-07-12 12:04:28 UTC (rev 454)
@@ -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 @@
  */
 
 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 @@
 	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,30 +118,36 @@
 
 	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);
 	he2->obj = 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 @@
 	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;

Modified: trunk/varnish-cache/bin/varnishd/hash_simple_list.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/hash_simple_list.c	2006-07-12 11:48:07 UTC (rev 453)
+++ trunk/varnish-cache/bin/varnishd/hash_simple_list.c	2006-07-12 12:04:28 UTC (rev 454)
@@ -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 @@
  */
 
 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 @@
 	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;

Modified: trunk/varnish-cache/bin/varnishd/hash_slinger.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/hash_slinger.h	2006-07-12 11:48:07 UTC (rev 453)
+++ trunk/varnish-cache/bin/varnishd/hash_slinger.h	2006-07-12 12:04:28 UTC (rev 454)
@@ -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 {




More information about the varnish-commit mailing list