[master] 9268784 Push space allocation for objects into cache_obj.c as well.
Poul-Henning Kamp
phk at FreeBSD.org
Tue Aug 19 11:43:47 CEST 2014
commit 9268784cb4be73b328ac294cf78e0a6d2b0932c9
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Aug 19 09:43:28 2014 +0000
Push space allocation for objects into cache_obj.c as well.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 2026cd8..b85cde6 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1061,6 +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);
void ObjExtend(struct objcore *, struct dstat *, ssize_t l);
void ObjTrimStore(struct objcore *, struct dstat *);
unsigned ObjGetXID(struct objcore *, struct dstat *);
@@ -1245,7 +1247,7 @@ void RFC2616_Weaken_Etag(struct http *hp);
/* stevedore.c */
struct object *STV_NewObject(struct busyobj *, const char *hint, unsigned len);
-struct storage *STV_alloc(const struct vfp_ctx *, size_t size);
+struct storage *STV_alloc(struct stevedore *, size_t size);
void STV_trim(struct storage *st, size_t size, int move_ok);
void STV_free(struct storage *st);
void STV_open(void);
diff --git a/bin/varnishd/cache/cache_fetch_proc.c b/bin/varnishd/cache/cache_fetch_proc.c
index 5c42c83..7462105 100644
--- a/bin/varnishd/cache/cache_fetch_proc.c
+++ b/bin/varnishd/cache/cache_fetch_proc.c
@@ -92,15 +92,9 @@ VFP_GetStorage(struct vfp_ctx *vc, ssize_t sz)
l = sz;
if (l == 0)
l = cache_param->fetch_chunksize;
- st = STV_alloc(vc, l);
- if (st == NULL) {
+ st = ObjGetSpace(vc->oc, vc->vsl, vc->stats, l);
+ if (st == NULL)
(void)VFP_Error(vc, "Could not get storage");
- } else {
- AZ(st->len);
- Lck_Lock(&vc->bo->mtx);
- VTAILQ_INSERT_TAIL(&vc->body->list, st, list);
- Lck_Unlock(&vc->bo->mtx);
- }
return (st);
}
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index ed47b1e..a89a4ab 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -35,7 +35,6 @@
#include "storage/storage.h"
#include "hash/hash_slinger.h"
-
static const struct objcore_methods *
obj_getmethods(const struct objcore *oc)
{
@@ -169,6 +168,73 @@ ObjIterEnd(struct objiter **oi)
/*--------------------------------------------------------------------
*/
+static struct storage *
+objallocwithnuke(struct stevedore *stv, struct vsl_log *vsl, struct dstat *ds,
+ size_t size)
+{
+ struct storage *st = NULL;
+ unsigned fail;
+
+ CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
+
+ if (size > cache_param->fetch_maxchunksize)
+ size = cache_param->fetch_maxchunksize;
+
+ assert(size <= UINT_MAX); /* field limit in struct storage */
+
+ for (fail = 0; fail <= cache_param->nuke_limit; fail++) {
+ /* try to allocate from it */
+ AN(stv->alloc);
+ st = STV_alloc(stv, size);
+ if (st != NULL)
+ break;
+
+ /* no luck; try to free some space and keep trying */
+ if (fail < cache_param->nuke_limit &&
+ EXP_NukeOne(vsl, ds, stv->lru) == -1)
+ break;
+ }
+ CHECK_OBJ_ORNULL(st, STORAGE_MAGIC);
+ return (st);
+}
+
+/*--------------------------------------------------------------------
+ */
+
+struct storage *
+ObjGetSpace(struct objcore *oc, struct vsl_log *vsl, struct dstat *ds,
+ ssize_t sz)
+{
+ struct object *o;
+ struct storage *st;
+
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+ AN(ds);
+ 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);
+
+ st = objallocwithnuke(o->body->stevedore, vsl, ds, sz);
+ if (st == NULL)
+ return (st);
+
+ if (oc->busyobj != NULL) {
+ CHECK_OBJ_NOTNULL(oc->busyobj, BUSYOBJ_MAGIC);
+ Lck_Lock(&oc->busyobj->mtx);
+ VTAILQ_INSERT_TAIL(&o->body->list, st, list);
+ Lck_Unlock(&oc->busyobj->mtx);
+ } else {
+ VTAILQ_INSERT_TAIL(&o->body->list, st, list);
+ }
+ return (st);
+}
+
+/*--------------------------------------------------------------------
+ */
+
void
ObjExtend(struct objcore *oc, struct dstat *ds, ssize_t l)
{
@@ -176,7 +242,6 @@ ObjExtend(struct objcore *oc, struct dstat *ds, ssize_t l)
struct storage *st;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-
o = obj_getobj(oc, ds);
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
st = VTAILQ_LAST(&o->body->list, storagehead);
@@ -325,7 +390,8 @@ ObjSetattr(const struct vfp_ctx *vc, enum obj_attr attr, ssize_t len,
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
switch (attr) {
case OA_ESIDATA:
- o->esidata = STV_alloc(vc, len);
+ o->esidata = objallocwithnuke(o->body->stevedore, vc->vsl,
+ vc->stats, len);
if (o->esidata == NULL)
return (NULL);
o->esidata->len = len;
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index bbec41a..4fd40a4 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -152,8 +152,8 @@ stv_pick_stevedore(struct vsl_log *vsl, const char **hint)
/*-------------------------------------------------------------------*/
-static struct storage *
-stv_alloc(struct stevedore *stv, size_t size)
+struct storage *
+STV_alloc(struct stevedore *stv, size_t size)
{
struct storage *st;
@@ -180,45 +180,6 @@ stv_alloc(struct stevedore *stv, size_t size)
return (st);
}
-/*-------------------------------------------------------------------*/
-
-static struct storage *
-stv_alloc_obj(const struct vfp_ctx *vc, size_t size)
-{
- struct storage *st = NULL;
- struct stevedore *stv;
- unsigned fail;
-
- /*
- * Always use the stevedore which allocated the object in order to
- * keep an object inside the same stevedore.
- */
- CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
- stv = vc->body->stevedore;
- CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
-
- if (size > cache_param->fetch_maxchunksize)
- size = cache_param->fetch_maxchunksize;
-
- assert(size <= UINT_MAX); /* field limit in struct storage */
-
- for (fail = 0; fail <= cache_param->nuke_limit; fail++) {
- /* try to allocate from it */
- AN(stv->alloc);
- st = stv_alloc(stv, size);
- if (st != NULL)
- break;
-
- /* no luck; try to free some space and keep trying */
- if (fail < cache_param->nuke_limit &&
- EXP_NukeOne(vc->vsl, vc->stats, stv->lru) == -1)
- break;
- }
- CHECK_OBJ_ORNULL(st, STORAGE_MAGIC);
- return (st);
-}
-
-
/*-------------------------------------------------------------------*
* Structure used to transport internal knowledge from STV_NewObject()
* to STV_MkObject(). Nobody else should mess with this struct.
@@ -367,17 +328,10 @@ STV_NewObject(struct busyobj *bo, const char *hint, unsigned wsl)
/*-------------------------------------------------------------------*/
struct storage *
-STV_alloc(const struct vfp_ctx *vc, size_t size)
-{
-
- return (stv_alloc_obj(vc, size));
-}
-
-struct storage *
STV_alloc_transient(size_t size)
{
- return (stv_alloc(stv_transient, size));
+ return (STV_alloc(stv_transient, size));
}
void
More information about the varnish-commit
mailing list