[master] 8a34320 Turn the object length into a OA

Poul-Henning Kamp phk at FreeBSD.org
Fri Feb 5 00:52:57 CET 2016


commit 8a34320c3b5d10638658125943158af3fcd2d5f7
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Feb 4 23:40:09 2016 +0000

    Turn the object length into a OA

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index f7dd1ce..24c85cb 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -843,7 +843,7 @@ int ObjIterate(struct worker *, struct objcore *,
     void *priv, objiterate_f *func);
 int ObjGetSpace(struct worker *, struct objcore *, ssize_t *sz, uint8_t **ptr);
 void ObjExtend(struct worker *, struct objcore *, ssize_t l);
-ssize_t ObjWaitExtend(struct worker *, struct objcore *, ssize_t l);
+uint64_t ObjWaitExtend(struct worker *, struct objcore *, uint64_t l);
 void ObjSetState(const struct objcore *, enum boc_state_e next);
 void ObjWaitState(const struct objcore *, enum boc_state_e want);
 void ObjTrimStore(struct worker *, struct objcore *);
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index 4968ee4..0ae34ed 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -136,41 +136,47 @@ void
 ObjExtend(struct worker *wrk, struct objcore *oc, ssize_t l)
 {
 	const struct obj_methods *om = obj_getmethods(oc);
+	uint64_t len;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_ORNULL(oc->boc, BOC_MAGIC);
-	AN(om->objextend);
 	assert(l > 0);
 
+	AZ(ObjGetU64(wrk, oc, OA_LEN, &len));
+	len += l;
+
 	if (oc->boc != NULL) {
 		Lck_Lock(&oc->boc->mtx);
+		AN(om->objextend);
 		om->objextend(wrk, oc, l);
-		AZ(pthread_cond_broadcast(&oc->boc->cond));
+		AZ(ObjSetU64(wrk, oc, OA_LEN, len));
 		Lck_Unlock(&oc->boc->mtx);
+		AZ(pthread_cond_broadcast(&oc->boc->cond));
 	} else {
 		om->objextend(wrk, oc, l);
+		AZ(ObjSetU64(wrk, oc, OA_LEN, len));
 	}
 }
 
 /*====================================================================
  */
 
-ssize_t
-ObjWaitExtend(struct worker *wrk, struct objcore *oc, ssize_t l)
+uint64_t
+ObjWaitExtend(struct worker *wrk, struct objcore *oc, uint64_t l)
 {
-	ssize_t rv;
+	uint64_t rv;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	CHECK_OBJ_NOTNULL(oc->boc, BOC_MAGIC);
 	Lck_Lock(&oc->boc->mtx);
-	rv = ObjGetLen(wrk, oc);
+	AZ(ObjGetU64(wrk, oc, OA_LEN, &rv));
 	while (1) {
 		assert(l <= rv || oc->boc->state == BOS_FAILED);
 		if (rv > l || oc->boc->state >= BOS_FINISHED)
 			break;
 		(void)Lck_CondWait(&oc->boc->cond, &oc->boc->mtx, 0);
-		rv = ObjGetLen(wrk, oc);
+		AZ(ObjGetU64(wrk, oc, OA_LEN, &rv));
 	}
 	Lck_Unlock(&oc->boc->mtx);
 	return (rv);
@@ -221,12 +227,12 @@ ObjWaitState(const struct objcore *oc, enum boc_state_e want)
 uint64_t
 ObjGetLen(struct worker *wrk, struct objcore *oc)
 {
-	const struct obj_methods *om = obj_getmethods(oc);
+	uint64_t len;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 
-	AN(om->objgetlen);
-	return (om->objgetlen(wrk, oc));
+	AZ(ObjGetU64(wrk, oc, OA_LEN, &len));
+	return(len);
 }
 
 /*====================================================================
diff --git a/bin/varnishd/cache/cache_obj.h b/bin/varnishd/cache/cache_obj.h
index a981fb2..e61324e 100644
--- a/bin/varnishd/cache/cache_obj.h
+++ b/bin/varnishd/cache/cache_obj.h
@@ -49,7 +49,6 @@ typedef void *objgetattr_f(struct worker *, struct objcore *,
     enum obj_attr attr, ssize_t *len);
 typedef void *objsetattr_f(struct worker *, struct objcore *,
     enum obj_attr attr, ssize_t len, const void *ptr);
-typedef uint64_t objgetlen_f(struct worker *, struct objcore *);
 typedef void objtouch_f(struct worker *, struct objcore *, double now);
 
 struct obj_methods {
@@ -62,7 +61,6 @@ struct obj_methods {
 	objiterator_f	*objiterator;
 	objgetspace_f	*objgetspace;
 	objextend_f	*objextend;
-	objgetlen_f	*objgetlen;
 	objtrimstore_f	*objtrimstore;
 	objstable_f	*objstable;
 	objslim_f	*objslim;
diff --git a/bin/varnishd/storage/storage_persistent_silo.c b/bin/varnishd/storage/storage_persistent_silo.c
index 32c598e..60ec88e 100644
--- a/bin/varnishd/storage/storage_persistent_silo.c
+++ b/bin/varnishd/storage/storage_persistent_silo.c
@@ -45,6 +45,7 @@
 
 #include "hash/hash_slinger.h"
 #include "vsha256.h"
+#include "vend.h"
 #include "vtim.h"
 
 #include "storage/storage_persistent.h"
@@ -435,7 +436,7 @@ smp_oc_sml_getobj(struct worker *wrk, struct objcore *oc)
 				break;
 			l += st->len;
 		}
-		if (l != o->len)
+		if (l != vbe64dec(o->oa_len))
 			bad |= 0x100;
 
 		if(bad) {
diff --git a/bin/varnishd/storage/storage_simple.c b/bin/varnishd/storage/storage_simple.c
index 1280537..84cf755 100644
--- a/bin/varnishd/storage/storage_simple.c
+++ b/bin/varnishd/storage/storage_simple.c
@@ -393,19 +393,6 @@ sml_extend(struct worker *wrk, struct objcore *oc, ssize_t l)
 	CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
 	assert(st->len + l <= st->space);
 	st->len += l;
-	o->len += l;
-}
-
-static uint64_t __match_proto__(objgetlen_f)
-sml_getlen(struct worker *wrk, struct objcore *oc)
-{
-	struct object *o;
-
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-
-	o = sml_getobj(wrk, oc);
-	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
-	return (o->len);
 }
 
 static void __match_proto__(objtrimstore_f)
@@ -532,6 +519,9 @@ sml_getattr(struct worker *wrk, struct objcore *oc, enum obj_attr attr,
 	case OA_VARY:
 		*len = 4;			// XXX: hack
 		return (o->oa_vary);
+	case OA_LEN:
+		*len = sizeof o->oa_len;
+		return (o->oa_len);
 	case OA_VXID:
 		*len = sizeof o->oa_vxid;
 		return (o->oa_vxid);
@@ -588,6 +578,10 @@ sml_setattr(struct worker *wrk, struct objcore *oc, enum obj_attr attr,
 		st->len += len;
 		retval = o->oa_vary;
 		break;
+	case OA_LEN:
+		assert(len == sizeof o->oa_len);
+		retval = o->oa_len;
+		break;
 	case OA_VXID:
 		assert(len == sizeof o->oa_vxid);
 		retval = o->oa_vxid;
@@ -606,7 +600,6 @@ const struct obj_methods SML_methods = {
 	.objiterator	= sml_iterator,
 	.objgetspace	= sml_getspace,
 	.objextend	= sml_extend,
-	.objgetlen	= sml_getlen,
 	.objtrimstore	= sml_trimstore,
 	.objstable	= sml_stable,
 	.objslim	= sml_slim,
diff --git a/bin/varnishd/storage/storage_simple.h b/bin/varnishd/storage/storage_simple.h
index ce4a286..84a3277 100644
--- a/bin/varnishd/storage/storage_simple.h
+++ b/bin/varnishd/storage/storage_simple.h
@@ -40,7 +40,8 @@ struct object {
 #define OBJECT_MAGIC		0x32851d42
 	struct storage		*objstore;
 
-	char			oa_vxid[4];
+	uint8_t			oa_len[8];
+	uint8_t			oa_vxid[4];
 	uint8_t			*oa_vary;
 	uint8_t			*oa_http;
 	uint8_t			oa_flags[1];
@@ -48,7 +49,6 @@ struct object {
 	char			oa_lastmodified[8];
 
 	struct storagehead	list;
-	ssize_t			len;
 
 	struct storage		*esidata;
 };
diff --git a/include/tbl/obj_attr.h b/include/tbl/obj_attr.h
index d0f281e..310ffab 100644
--- a/include/tbl/obj_attr.h
+++ b/include/tbl/obj_attr.h
@@ -31,6 +31,7 @@
 
 /* upper, lower */
 #ifdef OBJ_ATTR
+OBJ_ATTR(LEN,		len)
 OBJ_ATTR(VXID,		vxid)
 OBJ_ATTR(EXP,		exp)
 OBJ_ATTR(VARY,		vary)



More information about the varnish-commit mailing list