[master] 4d461ea Also get struct storage out of VFP_GetStorage()
Poul-Henning Kamp
phk at FreeBSD.org
Thu Aug 21 13:19:26 CEST 2014
commit 4d461eae3c6a6fc6fc56ab135481288ab3139722
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Aug 21 11:19:14 2014 +0000
Also get struct storage out of VFP_GetStorage()
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index f5fc9e3..27a0e1b 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1061,8 +1061,8 @@ enum objiter_status {
struct objiter *ObjIterBegin(struct worker *, struct objcore *);
enum objiter_status ObjIter(struct objiter *, void **, ssize_t *);
void ObjIterEnd(struct objiter **);
-struct storage *ObjGetSpace(struct objcore *, struct vsl_log *vsl,
- struct dstat *, ssize_t sz);
+int ObjGetSpace(struct objcore *, struct vsl_log *vsl,
+ struct dstat *, ssize_t *sz, uint8_t **ptr);
void ObjExtend(struct objcore *, struct dstat *, ssize_t l);
void ObjTrimStore(struct objcore *, struct dstat *);
unsigned ObjGetXID(struct objcore *, struct dstat *);
diff --git a/bin/varnishd/cache/cache_fetch_proc.c b/bin/varnishd/cache/cache_fetch_proc.c
index 08c67c6..0083510 100644
--- a/bin/varnishd/cache/cache_fetch_proc.c
+++ b/bin/varnishd/cache/cache_fetch_proc.c
@@ -77,11 +77,11 @@ enum vfp_status
VFP_GetStorage(struct vfp_ctx *vc, ssize_t *sz, uint8_t **ptr)
{
ssize_t l;
- struct storage *st;
CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vc->bo, BUSYOBJ_MAGIC);
AN(sz);
+ assert(*sz >= 0);
AN(ptr);
AN(vc->stats);
@@ -90,15 +90,13 @@ VFP_GetStorage(struct vfp_ctx *vc, ssize_t *sz, uint8_t **ptr)
l = *sz;
if (l == 0)
l = cache_param->fetch_chunksize;
- st = ObjGetSpace(vc->oc, vc->vsl, vc->stats, l);
- if (st == NULL) {
+ *sz = l;
+ if (!ObjGetSpace(vc->oc, vc->vsl, vc->stats, sz, ptr)) {
*sz = 0;
*ptr = NULL;
return (VFP_Error(vc, "Could not get storage"));
}
- *sz = st->space - st->len;
assert(*sz > 0);
- *ptr = st->ptr + st->len;
AN(*ptr);
return (VFP_OK);
}
@@ -219,6 +217,7 @@ VFP_Fetch_Body(struct busyobj *bo)
}
AZ(bo->vfc->failed);
l = est;
+ assert(l >= 0);
if (VFP_GetStorage(bo->vfc, &l, &ptr) != VFP_OK) {
bo->doclose = SC_RX_BODY;
break;
@@ -228,8 +227,10 @@ VFP_Fetch_Body(struct busyobj *bo)
vfps = VFP_Suck(bo->vfc, ptr, &l);
if (l > 0 && vfps != VFP_ERROR) {
VBO_extend(bo, l);
- if (est > 0)
+ if (est >= l)
est -= l;
+ else
+ est = 0;
}
} while (vfps == VFP_OK);
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index edf16f3..a1b2296 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -213,25 +213,32 @@ objallocwithnuke(struct stevedore *stv, struct vsl_log *vsl, struct dstat *ds,
/*--------------------------------------------------------------------
*/
-struct storage *
+int
ObjGetSpace(struct objcore *oc, struct vsl_log *vsl, struct dstat *ds,
- ssize_t sz)
+ ssize_t *sz, uint8_t **ptr)
{
struct object *o;
struct storage *st;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
AN(ds);
+ AN(sz);
+ AN(ptr);
+ assert(*sz > 0);
o = obj_getobj(oc, ds);
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
st = VTAILQ_LAST(&o->body->list, storagehead);
- if (st != NULL && st->len < st->space)
- return (st);
+ if (st != NULL && st->len < st->space) {
+ *sz = st->space - st->len;
+ *ptr = st->ptr + st->len;
+ assert (*sz > 0);
+ return (1);
+ }
- st = objallocwithnuke(o->body->stevedore, vsl, ds, sz);
+ st = objallocwithnuke(o->body->stevedore, vsl, ds, *sz);
if (st == NULL)
- return (st);
+ return (0);
if (oc->busyobj != NULL) {
CHECK_OBJ_NOTNULL(oc->busyobj, BUSYOBJ_MAGIC);
@@ -241,7 +248,10 @@ ObjGetSpace(struct objcore *oc, struct vsl_log *vsl, struct dstat *ds,
} else {
VTAILQ_INSERT_TAIL(&o->body->list, st, list);
}
- return (st);
+ *sz = st->space - st->len;
+ assert (*sz > 0);
+ *ptr = st->ptr + st->len;
+ return (1);
}
/*--------------------------------------------------------------------
More information about the varnish-commit
mailing list