[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