[master] 06df39d Ever so slightly closer to The New World Order

Poul-Henning Kamp phk at varnish-cache.org
Tue Aug 13 15:42:19 CEST 2013


commit 06df39d48695b31e6ff2610f5fe687dd525f5671
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Aug 13 13:42:02 2013 +0000

    Ever so slightly closer to The New World Order

diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index be3b147..8010016 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -397,7 +397,7 @@ DOT		label="{<top>cnt_lookup:|hash lookup|{<busy>busy?|<e>exp?|<eb>expbusy?|<h>h
 DOT	]
 DOT	lookup2 [
 DOT		shape=record
-DOT		label="{<top>cnt_lookup:|{vcl_lookup\{\}|{xx|xx}}}"
+DOT		label="{<top>cnt_lookup:|{vcl_lookup\{\}|{req.*|obj.*|obj_stale.*}}}"
 DOT	]
 DOT }
 DOT lookup:busy:w -> lookup:top:w [label="(waitinglist)"]
@@ -440,10 +440,12 @@ cnt_lookup(struct worker *wrk, struct req *req)
 		return (REQ_FSM_DISEMBARK);
 	}
 
-	if (boc == NULL)
+	if (boc == NULL) {
 		VRY_Finish(req, DISCARD);
-	else
+	} else {
+		AN(boc->flags & OC_F_BUSY);
 		VRY_Finish(req, KEEP);
+	}
 
 	AZ(req->objcore);
 	if (lr == HSH_MISS) {
@@ -473,41 +475,6 @@ cnt_lookup(struct worker *wrk, struct req *req)
 		return (REQ_FSM_MORE);
 	}
 
-	if (boc != NULL)
-		AN(boc->flags & OC_F_BUSY);
-
-	switch (lr) {
-	case HSH_EXP:
-		/* Found expired object, and a busy already exists too */
-		VSLb(req->vsl, SLT_Debug, "XXXX EXP\n");
-		AZ(boc);
-		break;
-	case HSH_EXPBUSY:
-		/* Found expired object, inserted busy objcore */
-		VSLb(req->vsl, SLT_Debug, "XXXX EXPBUSY\n");
-		AN(boc);
-		if (VDI_Healthy(req->director, req->digest)) {
-			VSLb(req->vsl, SLT_Debug, "XXX EXPBUSY deref oc\n");
-			(void)HSH_Deref(&wrk->stats, oc, NULL);
-			req->objcore = boc;
-			req->req_step = R_STP_MISS;
-			return (REQ_FSM_MORE);
-		}
-		VSLb(req->vsl, SLT_Debug, "XXX EXPBUSY drop boc\n");
-		(void)HSH_Deref(&wrk->stats, boc, NULL);
-		boc = NULL;
-		free(req->vary_b);
-		req->vary_b = NULL;
-		break;
-	case HSH_HIT:
-		/* Found hit */
-		VSLb(req->vsl, SLT_Debug, "XXXX HIT\n");
-		AZ(boc);
-		break;
-	default:
-		INCOMPL();
-	}
-
 	oh = oc->objhead;
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 
@@ -518,36 +485,56 @@ cnt_lookup(struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	req->obj = o;
 
-	wrk->stats.cache_hit++;
 	VSLb(req->vsl, SLT_Hit, "%u", req->obj->vxid);
 
 	VCL_lookup_method(req->vcl, wrk, req, NULL, req->http->ws);
 
-	if (wrk->handling == VCL_RET_DELIVER) {
-		//AZ(req->busyobj->bereq->ws);
-		//AZ(req->busyobj->beresp->ws);
+	switch (wrk->handling) {
+	case VCL_RET_DELIVER:
+		if (boc != NULL && VDI_Healthy(req->director, req->digest)) {
+			// XXX: Start bg-fetch */
+			(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
+			req->objcore = boc;
+			req->req_step = R_STP_MISS;
+			return (REQ_FSM_MORE);
+		} else if (boc != NULL) {
+			(void)HSH_Deref(&wrk->stats, boc, NULL);
+			free(req->vary_b);
+			req->vary_b = NULL;
+		}
+		wrk->stats.cache_hit++;
 		(void)HTTP1_DiscardReqBody(req);	// XXX: handle err
 		req->req_step = R_STP_PREPRESP;
 		return (REQ_FSM_MORE);
-	}
-
-	/* Drop our object, we won't need it */
-	(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
-	req->objcore = NULL;
-
-	switch(wrk->handling) {
-	case VCL_RET_PASS:
-		req->req_step = R_STP_PASS;
+	case VCL_RET_FETCH:
+		(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
+		req->objcore = boc;
+		req->req_step = R_STP_MISS;
+		return (REQ_FSM_MORE);
+	case VCL_RET_RESTART:
+		req->req_step = R_STP_RESTART;
 		break;
 	case VCL_RET_ERROR:
 		req->req_step = R_STP_ERROR;
 		break;
-	case VCL_RET_RESTART:
-		req->req_step = R_STP_RESTART;
+	case VCL_RET_PASS:
+		wrk->stats.cache_hit++;
+		req->req_step = R_STP_PASS;
 		break;
 	default:
-		WRONG("Illegal action in vcl_lookup{}");
+		INCOMPL();
+	}
+
+	/* Drop our object, we won't need it */
+	(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
+	req->objcore = NULL;
+
+	if (boc != NULL) {
+		(void)HSH_Deref(&wrk->stats, boc, NULL);
+		free(req->vary_b);
+		req->vary_b = NULL;
 	}
+
 	return (REQ_FSM_MORE);
 }
 
diff --git a/bin/varnishd/default.vcl b/bin/varnishd/default.vcl
index 267b3c8..569cea2 100644
--- a/bin/varnishd/default.vcl
+++ b/bin/varnishd/default.vcl
@@ -98,21 +98,17 @@ sub vcl_purge {
 }
 
 sub vcl_lookup {
-/*
-    if (!obj) {
-	    return (deliver);
-    }
-    if (obj.uncacheable) {
-	return (pass);
-    }
     if (obj.ttl >= 0s) {
+	// A pure unadultered hit, deliver it
 	return (deliver);
     }
     if (obj.ttl + obj.grace > 0s) {
-	return (deliver_stale);
+	// Object is in grace, delive it
+	// Automatically triggers a background fetch
+	return (deliver);
     }
-*/
-    return (deliver);
+    // fetch & deliver once we get the result
+    return (fetch);
 }
 
 sub vcl_miss {
diff --git a/lib/libvcl/generate.py b/lib/libvcl/generate.py
index 5250cc5..225108a 100755
--- a/lib/libvcl/generate.py
+++ b/lib/libvcl/generate.py
@@ -84,7 +84,7 @@ returns =(
 	('hash',		"C", ('lookup',)),
 	('purge',		"C", ('error', 'fetch',)),
 	('miss',		"C", ('error', 'restart', 'pass', 'fetch',)),
-	('lookup',		"C", ('error', 'restart', 'pass', 'deliver',)),
+	('lookup',		"C", ('error', 'restart', 'pass', 'fetch', 'deliver',)),
 	('backend_fetch',	"B", ('fetch', 'abandon')),
 	('backend_response',	"B", ('deliver', 'retry', 'abandon')),
 	('deliver',		"C", ('restart', 'deliver',)),



More information about the varnish-commit mailing list