Commit 33a22425 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Push struct worker out of STV_NewObject()

parent a34c900c
...@@ -1005,8 +1005,8 @@ unsigned RFC2616_Req_Gzip(const struct sess *sp); ...@@ -1005,8 +1005,8 @@ unsigned RFC2616_Req_Gzip(const struct sess *sp);
int RFC2616_Do_Cond(const struct sess *sp); 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 busyobj *, struct objcore **,
uint16_t nhttp); const char *hint, unsigned len, uint16_t nhttp);
struct storage *STV_alloc(struct busyobj *, 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);
......
...@@ -475,9 +475,12 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -475,9 +475,12 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req)
wrk->busyobj = VBO_GetBusyObj(wrk); wrk->busyobj = VBO_GetBusyObj(wrk);
wrk->busyobj->vsl->wid = sp->vsl_id; wrk->busyobj->vsl->wid = sp->vsl_id;
req->obj = STV_NewObject(wrk, TRANSIENT_STORAGE, AZ(wrk->busyobj->stats);
cache_param->http_resp_size, wrk->busyobj->stats = &wrk->stats;
req->obj = STV_NewObject(wrk->busyobj, &req->objcore,
TRANSIENT_STORAGE, cache_param->http_resp_size,
(uint16_t)cache_param->http_max_hdr); (uint16_t)cache_param->http_max_hdr);
wrk->busyobj->stats = NULL;
if (req->obj == NULL) { if (req->obj == NULL) {
req->doclose = "Out of objects"; req->doclose = "Out of objects";
req->director = NULL; req->director = NULL;
...@@ -786,18 +789,24 @@ cnt_prepfetch(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -786,18 +789,24 @@ cnt_prepfetch(struct sess *sp, struct worker *wrk, struct req *req)
req->objcore == NULL) req->objcore == NULL)
req->storage_hint = TRANSIENT_STORAGE; req->storage_hint = TRANSIENT_STORAGE;
req->obj = STV_NewObject(wrk, req->storage_hint, l, nhttp); assert(bo == wrk->busyobj);
AZ(bo->stats);
bo->stats = &wrk->stats;
req->obj = STV_NewObject(bo, &req->objcore, req->storage_hint, l,
nhttp);
if (req->obj == NULL) { if (req->obj == NULL) {
/* /*
* Try to salvage the transaction by allocating a * Try to salvage the transaction by allocating a
* shortlived object on Transient storage. * shortlived object on Transient storage.
*/ */
req->obj = STV_NewObject(wrk, TRANSIENT_STORAGE, l, nhttp); req->obj = STV_NewObject(bo, &req->objcore, TRANSIENT_STORAGE,
l, nhttp);
if (bo->exp.ttl > cache_param->shortlived) if (bo->exp.ttl > cache_param->shortlived)
bo->exp.ttl = cache_param->shortlived; bo->exp.ttl = cache_param->shortlived;
bo->exp.grace = 0.0; bo->exp.grace = 0.0;
bo->exp.keep = 0.0; bo->exp.keep = 0.0;
} }
bo->stats = NULL;
if (req->obj == NULL) { if (req->obj == NULL) {
req->err_code = 503; req->err_code = 503;
sp->step = STP_ERROR; sp->step = STP_ERROR;
......
...@@ -227,13 +227,15 @@ struct stv_objsecrets { ...@@ -227,13 +227,15 @@ struct stv_objsecrets {
*/ */
struct object * struct object *
STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot, STV_MkObject(struct busyobj *bo, struct objcore **ocp, void *ptr, unsigned ltot,
const struct stv_objsecrets *soc) const struct stv_objsecrets *soc)
{ {
struct object *o; struct object *o;
unsigned l; unsigned l;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_NOTNULL(soc, STV_OBJ_SECRETES_MAGIC); CHECK_OBJ_NOTNULL(soc, STV_OBJ_SECRETES_MAGIC);
AN(ocp);
assert(PAOK(ptr)); assert(PAOK(ptr));
assert(PAOK(soc->wsl)); assert(PAOK(soc->wsl));
...@@ -253,17 +255,17 @@ STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot, ...@@ -253,17 +255,17 @@ STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot,
WS_Assert(o->ws_o); WS_Assert(o->ws_o);
assert(o->ws_o->e <= (char*)ptr + ltot); assert(o->ws_o->e <= (char*)ptr + ltot);
http_Setup(o->http, o->ws_o, wrk->busyobj->vsl); http_Setup(o->http, o->ws_o, bo->vsl);
o->http->magic = HTTP_MAGIC; o->http->magic = HTTP_MAGIC;
o->exp = wrk->busyobj->exp; o->exp = bo->exp;
VTAILQ_INIT(&o->store); VTAILQ_INIT(&o->store);
wrk->stats.n_object++; bo->stats->n_object++;
if (wrk->sp->req->objcore != NULL) { if (*ocp != NULL) {
CHECK_OBJ_NOTNULL(wrk->sp->req->objcore, OBJCORE_MAGIC); CHECK_OBJ_NOTNULL((*ocp), OBJCORE_MAGIC);
o->objcore = wrk->sp->req->objcore; o->objcore = *ocp;
wrk->sp->req->objcore = NULL; /* refcnt follows pointer. */ *ocp = NULL; /* refcnt follows pointer. */
BAN_NewObjCore(o->objcore); BAN_NewObjCore(o->objcore);
o->objcore->methods = &default_oc_methods; o->objcore->methods = &default_oc_methods;
...@@ -278,13 +280,15 @@ STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot, ...@@ -278,13 +280,15 @@ STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot,
*/ */
struct object * struct object *
stv_default_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot, stv_default_allocobj(struct stevedore *stv, struct busyobj *bo,
const struct stv_objsecrets *soc) struct objcore **ocp, unsigned ltot, const struct stv_objsecrets *soc)
{ {
struct object *o; struct object *o;
struct storage *st; struct storage *st;
CHECK_OBJ_NOTNULL(soc, STV_OBJ_SECRETES_MAGIC); CHECK_OBJ_NOTNULL(soc, STV_OBJ_SECRETES_MAGIC);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
AN(ocp);
st = stv->alloc(stv, ltot); st = stv->alloc(stv, ltot);
if (st == NULL) if (st == NULL)
return (NULL); return (NULL);
...@@ -293,7 +297,7 @@ stv_default_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot, ...@@ -293,7 +297,7 @@ stv_default_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot,
return (NULL); return (NULL);
} }
ltot = st->len = st->space; ltot = st->len = st->space;
o = STV_MkObject(wrk, st->ptr, ltot, soc); o = STV_MkObject(bo, ocp, st->ptr, ltot, soc);
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
o->objstore = st; o->objstore = st;
return (o); return (o);
...@@ -306,8 +310,8 @@ stv_default_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot, ...@@ -306,8 +310,8 @@ stv_default_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot,
*/ */
struct object * struct object *
STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl, STV_NewObject(struct busyobj *bo, struct objcore **ocp, const char *hint,
uint16_t nhttp) unsigned wsl, uint16_t nhttp)
{ {
struct object *o; struct object *o;
struct stevedore *stv, *stv0; struct stevedore *stv, *stv0;
...@@ -315,7 +319,8 @@ STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl, ...@@ -315,7 +319,8 @@ STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl,
struct stv_objsecrets soc; struct stv_objsecrets soc;
int i; int i;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
AN(ocp);
assert(wsl > 0); assert(wsl > 0);
wsl = PRNDUP(wsl); wsl = PRNDUP(wsl);
...@@ -330,27 +335,23 @@ STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl, ...@@ -330,27 +335,23 @@ STV_NewObject(struct worker *wrk, const char *hint, unsigned wsl,
ltot = sizeof *o + wsl + lhttp; ltot = sizeof *o + wsl + lhttp;
stv = stv0 = stv_pick_stevedore(wrk->vsl, &hint); stv = stv0 = stv_pick_stevedore(bo->vsl, &hint);
AN(stv->allocobj); AN(stv->allocobj);
o = stv->allocobj(stv, wrk, ltot, &soc); o = stv->allocobj(stv, bo, ocp, ltot, &soc);
if (o == NULL && hint == NULL) { if (o == NULL && hint == NULL) {
do { do {
stv = stv_pick_stevedore(wrk->vsl, &hint); stv = stv_pick_stevedore(bo->vsl, &hint);
AN(stv->allocobj); AN(stv->allocobj);
o = stv->allocobj(stv, wrk, ltot, &soc); o = stv->allocobj(stv, bo, ocp, ltot, &soc);
} 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->busyobj, stv->lru) == -1) if (EXP_NukeOne(bo, stv->lru) == -1)
break; break;
o = stv->allocobj(stv, wrk, ltot, &soc); o = stv->allocobj(stv, bo, ocp, ltot, &soc);
} }
wrk->busyobj->stats = NULL;
} }
if (o == NULL) if (o == NULL)
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
struct stv_objsecrets; struct stv_objsecrets;
struct stevedore; struct stevedore;
struct sess; struct sess;
struct busyobj;
struct objcore;
struct worker; struct worker;
struct lru; struct lru;
...@@ -42,8 +44,8 @@ typedef void storage_open_f(const struct stevedore *); ...@@ -42,8 +44,8 @@ typedef void storage_open_f(const struct stevedore *);
typedef struct storage *storage_alloc_f(struct stevedore *, size_t size); typedef struct storage *storage_alloc_f(struct stevedore *, size_t size);
typedef void storage_trim_f(struct storage *, size_t size); typedef void storage_trim_f(struct storage *, size_t size);
typedef void storage_free_f(struct storage *); typedef void storage_free_f(struct storage *);
typedef struct object *storage_allocobj_f(struct stevedore *, typedef struct object *storage_allocobj_f(struct stevedore *, struct busyobj *,
struct worker *wrk, unsigned ltot, const struct stv_objsecrets *); struct objcore **, unsigned ltot, const struct stv_objsecrets *);
typedef void storage_close_f(const struct stevedore *); typedef void storage_close_f(const struct stevedore *);
/* Prototypes for VCL variable responders */ /* Prototypes for VCL variable responders */
...@@ -90,8 +92,8 @@ extern struct stevedore *stv_transient; ...@@ -90,8 +92,8 @@ extern struct stevedore *stv_transient;
int STV_GetFile(const char *fn, int *fdp, const char **fnp, const char *ctx); int STV_GetFile(const char *fn, int *fdp, const char **fnp, const char *ctx);
uintmax_t STV_FileSize(int fd, const char *size, unsigned *granularity, uintmax_t STV_FileSize(int fd, const char *size, unsigned *granularity,
const char *ctx); const char *ctx);
struct object *STV_MkObject(struct worker *wrk, void *ptr, unsigned ltot, struct object *STV_MkObject(struct busyobj *bo, struct objcore **ocp,
const struct stv_objsecrets *soc); void *ptr, unsigned ltot, const struct stv_objsecrets *soc);
struct lru *LRU_Alloc(void); struct lru *LRU_Alloc(void);
void LRU_Free(struct lru *lru); void LRU_Free(struct lru *lru);
......
...@@ -460,8 +460,8 @@ smp_allocx(struct stevedore *st, size_t min_size, size_t max_size, ...@@ -460,8 +460,8 @@ smp_allocx(struct stevedore *st, size_t min_size, size_t max_size,
*/ */
static struct object * static struct object *
smp_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot, smp_allocobj(struct stevedore *stv, struct busyobj *bo, struct objcore **ocp,
const struct stv_objsecrets *soc) unsigned ltot, const struct stv_objsecrets *soc)
{ {
struct object *o; struct object *o;
struct storage *st; struct storage *st;
...@@ -471,11 +471,11 @@ smp_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot, ...@@ -471,11 +471,11 @@ smp_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot,
struct objcore *oc; struct objcore *oc;
unsigned objidx; unsigned objidx;
if (wrk->sp->req->objcore == NULL) AN(ocp);
if (*ocp == NULL)
return (NULL); /* from cnt_error */ return (NULL); /* from cnt_error */
CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC); CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC);
AN(wrk->sp->req->objcore); AN(bo->exp.ttl > 0.);
AN(wrk->busyobj->exp.ttl > 0.);
ltot = IRNUP(sc, ltot); ltot = IRNUP(sc, ltot);
...@@ -486,7 +486,7 @@ smp_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot, ...@@ -486,7 +486,7 @@ smp_allocobj(struct stevedore *stv, struct worker *wrk, unsigned ltot,
assert(st->space >= ltot); assert(st->space >= ltot);
ltot = st->len = st->space; ltot = st->len = st->space;
o = STV_MkObject(wrk, st->ptr, ltot, soc); o = STV_MkObject(bo, ocp, st->ptr, ltot, soc);
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
o->objstore = st; o->objstore = st;
......
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