[experimental-ims] cf81441 Tag oc's with COMPLETE or FAILURE when we fetch the body.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Dec 18 10:27:41 CET 2014
commit cf81441e52a10143c5383472c9d25a073b6fde46
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Mar 12 22:19:48 2012 +0000
Tag oc's with COMPLETE or FAILURE when we fetch the body.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 17f4f4d..08e3405 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -381,6 +381,8 @@ struct objcore {
#define OC_F_LRUDONTMOVE (1<<4)
#define OC_F_PRIV (1<<5) /* Stevedore private flag */
#define OC_F_LURK (3<<6) /* Ban-lurker-color */
+#define OC_F_COMPLETE (1<<8)
+#define OC_F_FAILED (1<<9)
unsigned timer_idx;
VTAILQ_ENTRY(objcore) list;
VTAILQ_ENTRY(objcore) lru_list;
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 1192f81..9f69bfa 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -921,9 +921,9 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
AN(req->director);
if (bo->state == BOS_FAILED) {
- HSH_Drop(wrk, &sp->req->obj);
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ HSH_Drop(wrk, &req->obj);
AZ(req->obj);
+ VBO_DerefBusyObj(wrk, &req->busyobj);
req->err_code = 503;
sp->step = STP_ERROR;
return (0);
@@ -1145,6 +1145,9 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
return (0);
}
+ /* For now... */
+ AN(oc->flags & (OC_F_COMPLETE|OC_F_FAILED));
+
o = oc_getobj(&wrk->stats, oc);
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
req->obj = o;
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 172f422..feebd9b 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -634,6 +634,13 @@ FetchBody(struct worker *wrk, void *priv)
http_Teardown(bo->bereq);
http_Teardown(bo->beresp);
+ if (obj->objcore != NULL) {
+ /* pass has no objcore */
+ /* XXX: lock protection ?? */
+ obj->objcore->flags |=
+ (bo->state == BOS_FAILED ? OC_F_FAILED : OC_F_COMPLETE);
+ }
+
if (bo->state == BOS_FAILED) {
wrk->stats.fetch_failed++;
VDI_CloseFd(&bo->vbc);
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 6a3af2f..514dbeb 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -269,6 +269,7 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc)
oc->refcnt = 1;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
AZ(oc->flags & OC_F_BUSY);
+ oc->flags |= OC_F_COMPLETE;
VTAILQ_INSERT_HEAD(&oh->objcs, oc, list);
/* NB: do not deref objhead the new object inherits our reference */
More information about the varnish-commit
mailing list