Commit d387098f authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make FetchStorage() take a busyobj instead of a worker as arg.

parent 7703a5f8
...@@ -745,10 +745,10 @@ void EXP_Inject(struct objcore *oc, struct lru *lru, double when); ...@@ -745,10 +745,10 @@ void EXP_Inject(struct objcore *oc, struct lru *lru, double when);
void EXP_Init(void); void EXP_Init(void);
void EXP_Rearm(const struct object *o); void EXP_Rearm(const struct object *o);
int EXP_Touch(struct objcore *oc); int EXP_Touch(struct objcore *oc);
int EXP_NukeOne(struct vsl_log *, struct dstat *, struct lru *lru); int EXP_NukeOne(struct busyobj *, struct lru *lru);
/* cache_fetch.c */ /* cache_fetch.c */
struct storage *FetchStorage(struct worker *w, ssize_t sz); struct storage *FetchStorage(struct busyobj *, ssize_t sz);
int FetchError(struct busyobj *, const char *error); int FetchError(struct busyobj *, const char *error);
int FetchError2(struct busyobj *, const char *error, const char *more); int FetchError2(struct busyobj *, const char *error, const char *more);
int FetchHdr(struct sess *sp, int need_host_hdr, int sendbody); int FetchHdr(struct sess *sp, int need_host_hdr, int sendbody);
...@@ -1013,7 +1013,7 @@ int RFC2616_Do_Cond(const struct sess *sp); ...@@ -1013,7 +1013,7 @@ int RFC2616_Do_Cond(const struct sess *sp);
/* stevedore.c */ /* stevedore.c */
struct object *STV_NewObject(struct worker *wrk, const char *hint, unsigned len, struct object *STV_NewObject(struct worker *wrk, const char *hint, unsigned len,
uint16_t nhttp); uint16_t nhttp);
struct storage *STV_alloc(struct worker *w, size_t size); struct storage *STV_alloc(struct busyobj *, size_t size);
void STV_trim(struct storage *st, size_t size); void STV_trim(struct storage *st, size_t size);
void STV_free(struct storage *st); void STV_free(struct storage *st);
void STV_open(void); void STV_open(void);
......
...@@ -94,7 +94,7 @@ vfp_esi_bytes_uu(struct worker *wrk, const struct vef_priv *vef, ...@@ -94,7 +94,7 @@ vfp_esi_bytes_uu(struct worker *wrk, const struct vef_priv *vef,
CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
while (bytes > 0) { while (bytes > 0) {
st = FetchStorage(wrk, 0); st = FetchStorage(wrk->busyobj, 0);
if (st == NULL) if (st == NULL)
return (-1); return (-1);
wl = vef_read(htc, wl = vef_read(htc,
...@@ -396,7 +396,7 @@ vfp_esi_end(struct worker *wrk) ...@@ -396,7 +396,7 @@ vfp_esi_end(struct worker *wrk)
l = VSB_len(vsb); l = VSB_len(vsb);
assert(l > 0); assert(l > 0);
/* XXX: This is a huge waste of storage... */ /* XXX: This is a huge waste of storage... */
bo->fetch_obj->esidata = STV_alloc(wrk, l); bo->fetch_obj->esidata = STV_alloc(bo, l);
if (bo->fetch_obj->esidata != NULL) { if (bo->fetch_obj->esidata != NULL) {
memcpy(bo->fetch_obj->esidata->ptr, memcpy(bo->fetch_obj->esidata->ptr,
VSB_data(vsb), l); VSB_data(vsb), l);
......
...@@ -414,7 +414,7 @@ exp_timer(struct sess *sp, void *priv) ...@@ -414,7 +414,7 @@ exp_timer(struct sess *sp, void *priv)
*/ */
int int
EXP_NukeOne(struct vsl_log *vsl, struct dstat *ds, struct lru *lru) EXP_NukeOne(struct busyobj *bo, struct lru *lru)
{ {
struct objcore *oc; struct objcore *oc;
...@@ -445,8 +445,8 @@ EXP_NukeOne(struct vsl_log *vsl, struct dstat *ds, struct lru *lru) ...@@ -445,8 +445,8 @@ EXP_NukeOne(struct vsl_log *vsl, struct dstat *ds, struct lru *lru)
return (-1); return (-1);
/* XXX: bad idea for -spersistent */ /* XXX: bad idea for -spersistent */
WSL(vsl, SLT_ExpKill, -1, "%u LRU", oc_getxid(ds, oc)); WSL(bo->vsl, SLT_ExpKill, -1, "%u LRU", oc_getxid(bo->stats, oc));
(void)HSH_Deref(ds, oc, NULL); (void)HSH_Deref(bo->stats, oc, NULL);
return (1); return (1);
} }
......
...@@ -92,7 +92,7 @@ vfp_nop_begin(struct worker *wrk, size_t estimate) ...@@ -92,7 +92,7 @@ vfp_nop_begin(struct worker *wrk, size_t estimate)
{ {
if (estimate > 0) if (estimate > 0)
(void)FetchStorage(wrk, estimate); (void)FetchStorage(wrk->busyobj, estimate);
} }
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
...@@ -114,7 +114,7 @@ vfp_nop_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) ...@@ -114,7 +114,7 @@ vfp_nop_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
AZ(wrk->busyobj->fetch_failed); AZ(wrk->busyobj->fetch_failed);
while (bytes > 0) { while (bytes > 0) {
st = FetchStorage(wrk, 0); st = FetchStorage(wrk->busyobj, 0);
if (st == NULL) if (st == NULL)
return(-1); return(-1);
l = st->space - st->len; l = st->space - st->len;
...@@ -170,13 +170,14 @@ static struct vfp vfp_nop = { ...@@ -170,13 +170,14 @@ static struct vfp vfp_nop = {
*/ */
struct storage * struct storage *
FetchStorage(struct worker *wrk, ssize_t sz) FetchStorage(struct busyobj *bo, ssize_t sz)
{ {
ssize_t l; ssize_t l;
struct storage *st; struct storage *st;
struct object *obj; struct object *obj;
obj = wrk->busyobj->fetch_obj; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
obj = bo->fetch_obj;
CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
st = VTAILQ_LAST(&obj->store, storagehead); st = VTAILQ_LAST(&obj->store, storagehead);
if (st != NULL && st->len < st->space) if (st != NULL && st->len < st->space)
...@@ -187,9 +188,9 @@ FetchStorage(struct worker *wrk, ssize_t sz) ...@@ -187,9 +188,9 @@ FetchStorage(struct worker *wrk, ssize_t sz)
l = sz; l = sz;
if (l == 0) if (l == 0)
l = cache_param->fetch_chunksize; l = cache_param->fetch_chunksize;
st = STV_alloc(wrk, l); st = STV_alloc(bo, l);
if (st == NULL) { if (st == NULL) {
(void)FetchError(wrk->busyobj, "Could not get storage"); (void)FetchError(bo, "Could not get storage");
return (NULL); return (NULL);
} }
AZ(st->len); AZ(st->len);
...@@ -507,7 +508,7 @@ FetchBody(struct worker *wrk, struct object *obj) ...@@ -507,7 +508,7 @@ FetchBody(struct worker *wrk, struct object *obj)
CHECK_OBJ_NOTNULL(obj->http, HTTP_MAGIC); CHECK_OBJ_NOTNULL(obj->http, HTTP_MAGIC);
/* /*
* XXX: The busyobj needs a dstat, but it is not obvious which one * XXX: The busyobj needs a dstat, but it is not obvious which one
* XXX: it should be (own/borrowed). For now borrow the wrk's. * XXX: it should be (own/borrowed). For now borrow the wrk's.
*/ */
AZ(bo->stats); AZ(bo->stats);
......
...@@ -207,7 +207,7 @@ VGZ_ObufStorage(struct worker *wrk, struct vgz *vg) ...@@ -207,7 +207,7 @@ VGZ_ObufStorage(struct worker *wrk, struct vgz *vg)
{ {
struct storage *st; struct storage *st;
st = FetchStorage(wrk, 0); st = FetchStorage(wrk->busyobj, 0);
if (st == NULL) if (st == NULL)
return (-1); return (-1);
...@@ -627,7 +627,7 @@ vfp_testgzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) ...@@ -627,7 +627,7 @@ vfp_testgzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
AZ(vg->vz.avail_in); AZ(vg->vz.avail_in);
while (bytes > 0) { while (bytes > 0) {
st = FetchStorage(wrk, 0); st = FetchStorage(wrk->busyobj, 0);
if (st == NULL) if (st == NULL)
return(-1); return(-1);
l = st->space - st->len; l = st->space - st->len;
......
...@@ -157,18 +157,20 @@ stv_pick_stevedore(struct vsl_log *vsl, const char **hint) ...@@ -157,18 +157,20 @@ stv_pick_stevedore(struct vsl_log *vsl, const char **hint)
/*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/
static struct storage * static struct storage *
stv_alloc(struct worker *w, const struct object *obj, size_t size) stv_alloc(struct busyobj *bo, size_t size)
{ {
struct storage *st; struct storage *st;
struct stevedore *stv; struct stevedore *stv;
unsigned fail = 0; unsigned fail = 0;
struct object *obj;
/* /*
* Always use the stevedore which allocated the object in order to * Always use the stevedore which allocated the object in order to
* keep an object inside the same stevedore. * keep an object inside the same stevedore.
*/ */
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
obj = bo->fetch_obj;
CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
stv = obj->objstore->stevedore; stv = obj->objstore->stevedore;
CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC); CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
...@@ -188,7 +190,7 @@ stv_alloc(struct worker *w, const struct object *obj, size_t size) ...@@ -188,7 +190,7 @@ stv_alloc(struct worker *w, const struct object *obj, size_t size)
} }
/* no luck; try to free some space and keep trying */ /* no luck; try to free some space and keep trying */
if (EXP_NukeOne(w->vsl, &w->stats, stv->lru) == -1) if (EXP_NukeOne(bo, stv->lru) == -1)
break; break;
/* Enough is enough: try another if we have one */ /* Enough is enough: try another if we have one */
...@@ -337,12 +339,16 @@ STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl, ...@@ -337,12 +339,16 @@ STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl,
} while (o == NULL && stv != stv0); } while (o == NULL && stv != stv0);
} }
if (o == NULL) { if (o == NULL) {
/* XXX: lend busyobj wrk's stats while we nuke */
AZ(wrk->busyobj->stats);
wrk->busyobj->stats = &wrk->stats;
/* no luck; try to free some space and keep trying */ /* no luck; try to free some space and keep trying */
for (i = 0; o == NULL && i < cache_param->nuke_limit; i++) { for (i = 0; o == NULL && i < cache_param->nuke_limit; i++) {
if (EXP_NukeOne(wrk->vsl, &wrk->stats, stv->lru) == -1) if (EXP_NukeOne(wrk->busyobj, stv->lru) == -1)
break; break;
o = stv->allocobj(stv, wrk, ltot, &soc); o = stv->allocobj(stv, wrk, ltot, &soc);
} }
wrk->busyobj->stats = NULL;
} }
if (o == NULL) if (o == NULL)
...@@ -373,10 +379,10 @@ STV_Freestore(struct object *o) ...@@ -373,10 +379,10 @@ STV_Freestore(struct object *o)
/*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/
struct storage * struct storage *
STV_alloc(struct worker *w, size_t size) STV_alloc(struct busyobj *bo, size_t size)
{ {
return (stv_alloc(w, w->busyobj->fetch_obj, size)); return (stv_alloc(bo, size));
} }
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment