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

Move the busyobj reference from worker to req

parent a1cdab13
......@@ -316,7 +316,6 @@ struct worker {
struct ws aws[1];
struct busyobj *busyobj;
/* Temporary accounting */
struct acct acct_tmp;
......@@ -551,6 +550,7 @@ struct req {
/* The busy objhead we sleep on */
struct objhead *hash_objhead;
struct busyobj *busyobj;
/* Built Vary string */
uint8_t *vary_b;
......@@ -750,7 +750,7 @@ struct storage *FetchStorage(struct busyobj *, ssize_t sz);
int FetchError(struct busyobj *, const char *error);
int FetchError2(struct busyobj *, const char *error, const char *more);
int FetchHdr(struct sess *sp, int need_host_hdr, int sendbody);
int FetchBody(struct worker *w, struct object *obj);
int FetchBody(struct worker *w, struct busyobj *bo, struct object *obj);
int FetchReqBody(const struct sess *sp, int sendbody);
void Fetch_Init(void);
......@@ -894,7 +894,6 @@ unsigned WRW_Write(struct worker *w, const void *ptr, int len);
unsigned WRW_WriteH(struct worker *w, const txt *hh, const char *suf);
/* cache_session.c [SES] */
struct sess *SES_Alloc(void);
void SES_Close(struct sess *sp, const char *reason);
void SES_Delete(struct sess *sp, const char *reason, double now);
void SES_Charge(struct sess *sp);
......
......@@ -89,8 +89,8 @@ VBE_ReleaseConn(struct vbc *vc)
#define FIND_TMO(tmx, dst, sp, be) \
do { \
CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC); \
dst = sp->wrk->busyobj->tmx; \
CHECK_OBJ_NOTNULL(sp->req->busyobj, BUSYOBJ_MAGIC); \
dst = sp->req->busyobj->tmx; \
if (dst == 0.0) \
dst = be->tmx; \
if (dst == 0.0) \
......
......@@ -796,7 +796,7 @@ ban_CheckLast(void)
* Ban lurker thread
*/
static int
static int
ban_lurker_work(struct worker *wrk, unsigned pass)
{
struct ban *b, *b0, *b2;
......
This diff is collapsed.
......@@ -120,7 +120,7 @@ VDI_GetFd(const struct director *d, struct sess *sp)
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
vc = d->getfd(d, sp);
if (vc != NULL) {
vc->vsl = sp->wrk->busyobj->vsl;
vc->vsl = sp->req->busyobj->vsl;
vc->orig_vsl_id = vc->vsl->wid;
vc->vsl->wid = vc->vsl_id;
}
......
......@@ -347,8 +347,8 @@ vdi_dns_find_backend(const struct sess *sp, struct vdi_dns *vs)
/* bereq is only present after recv et. al, otherwise use req (ie:
* use req for health checks in vcl_recv and such).
*/
if (sp->wrk->busyobj != NULL && sp->wrk->busyobj->bereq)
hp = sp->wrk->busyobj->bereq;
if (sp->req->busyobj != NULL && sp->req->busyobj->bereq)
hp = sp->req->busyobj->bereq;
else
hp = sp->req->http;
......
......@@ -46,7 +46,7 @@ static unsigned fetchfrag;
* We want to issue the first error we encounter on fetching and
* supress the rest. This function does that.
*
* Other code is allowed to look at wrk->busyobj->fetch_failed to bail out
* Other code is allowed to look at sp->req->busyobj->fetch_failed to bail out
*
* For convenience, always return -1
*/
......@@ -385,33 +385,37 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
{
struct vbc *vc;
struct worker *wrk;
struct req *req;
struct busyobj *bo;
struct http *hp;
int retry = -1;
int i;
struct http_conn *htc;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
wrk = sp->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
htc = &wrk->busyobj->htc;
req = sp->req;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
bo = req->busyobj;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
htc = &bo->htc;
AN(sp->req->director);
AZ(sp->req->obj);
AN(req->director);
AZ(req->obj);
if (sp->req->objcore != NULL) { /* pass has no objcore */
CHECK_OBJ_NOTNULL(sp->req->objcore, OBJCORE_MAGIC);
AN(sp->req->objcore->flags & OC_F_BUSY);
if (req->objcore != NULL) { /* pass has no objcore */
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
AN(req->objcore->flags & OC_F_BUSY);
}
hp = wrk->busyobj->bereq;
hp = bo->bereq;
wrk->busyobj->vbc = VDI_GetFd(NULL, sp);
if (wrk->busyobj->vbc == NULL) {
VSLb(sp->req->vsl, SLT_FetchError, "no backend connection");
bo->vbc = VDI_GetFd(NULL, sp);
if (bo->vbc == NULL) {
VSLb(req->vsl, SLT_FetchError, "no backend connection");
return (-1);
}
vc = wrk->busyobj->vbc;
vc = bo->vbc;
if (vc->recycled)
retry = 1;
......@@ -421,7 +425,7 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
* because the backend may be chosen by a director.
*/
if (need_host_hdr)
VDI_AddHostHeader(wrk->busyobj->bereq, vc);
VDI_AddHostHeader(bo->bereq, vc);
(void)VTCP_blocking(vc->fd); /* XXX: we should timeout instead */
WRW_Reserve(wrk, &vc->fd, sp->t_req); /* XXX t_resp ? */
......@@ -430,10 +434,10 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
/* Deal with any message-body the request might have */
i = FetchReqBody(sp, sendbody);
if (WRW_FlushRelease(wrk) || i > 0) {
VSLb(sp->req->vsl, SLT_FetchError,
VSLb(req->vsl, SLT_FetchError,
"backend write error: %d (%s)",
errno, strerror(errno));
VDI_CloseFd(wrk, &wrk->busyobj->vbc);
VDI_CloseFd(wrk, &bo->vbc);
/* XXX: other cleanup ? */
return (retry);
}
......@@ -446,7 +450,7 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
/* Receive response */
HTC_Init(htc, wrk->busyobj->ws, vc->fd, vc->vsl,
HTC_Init(htc, bo->ws, vc->fd, vc->vsl,
cache_param->http_resp_size,
cache_param->http_resp_hdr_len);
......@@ -455,10 +459,10 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
i = HTC_Rx(htc);
if (i < 0) {
VSLb(sp->req->vsl, SLT_FetchError,
VSLb(req->vsl, SLT_FetchError,
"http first read error: %d %d (%s)",
i, errno, strerror(errno));
VDI_CloseFd(wrk, &wrk->busyobj->vbc);
VDI_CloseFd(wrk, &bo->vbc);
/* XXX: other cleanup ? */
/* Retryable if we never received anything */
return (i == -1 ? retry : -1);
......@@ -469,20 +473,20 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
while (i == 0) {
i = HTC_Rx(htc);
if (i < 0) {
VSLb(sp->req->vsl, SLT_FetchError,
VSLb(req->vsl, SLT_FetchError,
"http first read error: %d %d (%s)",
i, errno, strerror(errno));
VDI_CloseFd(wrk, &wrk->busyobj->vbc);
VDI_CloseFd(wrk, &bo->vbc);
/* XXX: other cleanup ? */
return (-1);
}
}
hp = wrk->busyobj->beresp;
hp = bo->beresp;
if (http_DissectResponse(hp, htc)) {
VSLb(sp->req->vsl, SLT_FetchError, "http format error");
VDI_CloseFd(wrk, &wrk->busyobj->vbc);
VSLb(req->vsl, SLT_FetchError, "http format error");
VDI_CloseFd(wrk, &bo->vbc);
/* XXX: other cleanup ? */
return (-1);
}
......@@ -492,17 +496,15 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
/*--------------------------------------------------------------------*/
int
FetchBody(struct worker *wrk, struct object *obj)
FetchBody(struct worker *wrk, struct busyobj *bo, struct object *obj)
{
int cls;
struct storage *st;
int mklen;
ssize_t cl;
struct http_conn *htc;
struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
bo = wrk->busyobj;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
AZ(bo->fetch_obj);
CHECK_OBJ_NOTNULL(bo->vbc, VBC_MAGIC);
......
......@@ -443,16 +443,16 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
AN(oc->flags & OC_F_BUSY);
oc->refcnt = 1;
AZ(wrk->busyobj);
wrk->busyobj = VBO_GetBusyObj(wrk);
wrk->busyobj->vsl->wid = sp->vsl_id;
AZ(sp->req->busyobj);
sp->req->busyobj = VBO_GetBusyObj(wrk);
sp->req->busyobj->vsl->wid = sp->vsl_id;
VRY_Validate(sp->req->vary_b);
if (sp->req->vary_l != NULL)
wrk->busyobj->vary = sp->req->vary_b;
sp->req->busyobj->vary = sp->req->vary_b;
else
wrk->busyobj->vary = NULL;
oc->busyobj = wrk->busyobj;
sp->req->busyobj->vary = NULL;
oc->busyobj = sp->req->busyobj;
/*
* Busy objects go on the tail, so they will not trip up searches.
......
......@@ -854,7 +854,7 @@ http_FilterReq(const struct sess *sp, unsigned how)
{
struct http *hp;
hp = sp->wrk->busyobj->bereq;
hp = sp->req->busyobj->bereq;
CHECK_OBJ_NOTNULL(hp, HTTP_MAGIC);
hp->logtag = HTTP_Tx;
......
......@@ -197,10 +197,6 @@ pan_wrk(const struct worker *wrk)
VSB_printf(pan_vsp, " worker = %p {\n", wrk);
pan_ws(wrk->aws, 4);
if (wrk->busyobj != NULL && wrk->busyobj->bereq->ws != NULL)
pan_http("bereq", wrk->busyobj->bereq, 4);
if (wrk->busyobj != NULL && wrk->busyobj->beresp->ws != NULL)
pan_http("beresp", wrk->busyobj->beresp, 4);
VSB_printf(pan_vsp, " },\n");
}
......@@ -221,6 +217,10 @@ pan_busyobj(const struct busyobj *bo)
VSB_printf(pan_vsp, " },\n");
if (VALID_OBJ(bo->vbc, BACKEND_MAGIC))
pan_vbc(bo->vbc);
if (bo->bereq->ws != NULL)
pan_http("bereq", bo->bereq, 4);
if (bo->beresp->ws != NULL)
pan_http("beresp", bo->beresp, 4);
}
......@@ -261,8 +261,8 @@ pan_sess(const struct sess *sp)
VSB_printf(pan_vsp, " restarts = %d, esi_level = %d\n",
sp->req->restarts, sp->req->esi_level);
if (sp->wrk->busyobj != NULL)
pan_busyobj(sp->wrk->busyobj);
if (sp->req->busyobj != NULL)
pan_busyobj(sp->req->busyobj);
pan_ws(sp->req->ws, 2);
pan_http("req", sp->req->http, 2);
......
......@@ -63,31 +63,33 @@ void
PipeSession(struct sess *sp)
{
struct vbc *vc;
struct worker *w;
struct worker *wrk;
struct pollfd fds[2];
struct busyobj *bo;
int i;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC);
w = sp->wrk;
bo = sp->req->busyobj;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
wrk = sp->wrk;
vc = VDI_GetFd(NULL, sp);
if (vc == NULL)
return;
sp->wrk->busyobj->vbc = vc; /* For panic dumping */
bo->vbc = vc; /* For panic dumping */
(void)VTCP_blocking(vc->fd);
WRW_Reserve(w, &vc->fd, sp->t_req);
WRW_Reserve(wrk, &vc->fd, sp->t_req);
sp->wrk->acct_tmp.hdrbytes +=
http_Write(w, sp->wrk->busyobj->bereq, 0);
http_Write(wrk, bo->bereq, 0);
if (sp->req->htc->pipeline.b != NULL)
sp->wrk->acct_tmp.bodybytes +=
WRW_Write(w, sp->req->htc->pipeline.b,
WRW_Write(wrk, sp->req->htc->pipeline.b,
Tlen(sp->req->htc->pipeline));
i = WRW_FlushRelease(w);
i = WRW_FlushRelease(wrk);
if (i) {
SES_Close(sp, "pipe");
......@@ -132,5 +134,5 @@ PipeSession(struct sess *sp)
}
SES_Close(sp, "pipe");
VDI_CloseFd(sp->wrk, &vc);
sp->wrk->busyobj->vbc = NULL;
bo->vbc = NULL;
}
......@@ -111,22 +111,6 @@ ses_new(struct sesspool *pp)
return (sp);
}
/*--------------------------------------------------------------------
* Allocate a session for use by background threads.
*/
struct sess *
SES_Alloc(void)
{
struct sess *sp;
ALLOC_OBJ(sp, SESS_MAGIC);
AN(sp);
ses_setup(sp);
/* XXX: sp->req ? */
return (sp);
}
/*--------------------------------------------------------------------
* The pool-task function for sessions
*/
......@@ -148,7 +132,6 @@ ses_pool_task(struct worker *wrk, void *arg)
sp = NULL; /* Cannot access sp any longer */
THR_SetSession(NULL);
WS_Assert(wrk->aws);
AZ(wrk->busyobj);
AZ(wrk->wrw);
assert(wrk->vsl->wlp == wrk->vsl->wlb);
if (cache_param->diag_bitmap & 0x00040000) {
......
......@@ -101,10 +101,10 @@ vrt_selecthttp(const struct sess *sp, enum gethdr_e where)
hp = sp->req->http;
break;
case HDR_BEREQ:
hp = sp->wrk->busyobj->bereq;
hp = sp->req->busyobj->bereq;
break;
case HDR_BERESP:
hp = sp->wrk->busyobj->beresp;
hp = sp->req->busyobj->beresp;
break;
case HDR_RESP:
hp = sp->req->resp;
......
......@@ -84,15 +84,15 @@ VRT_r_##obj##_##hdr(const struct sess *sp) \
VRT_DO_HDR(req, request, sp->req->http, HTTP_HDR_REQ)
VRT_DO_HDR(req, url, sp->req->http, HTTP_HDR_URL)
VRT_DO_HDR(req, proto, sp->req->http, HTTP_HDR_PROTO)
VRT_DO_HDR(bereq, request, sp->wrk->busyobj->bereq, HTTP_HDR_REQ)
VRT_DO_HDR(bereq, url, sp->wrk->busyobj->bereq, HTTP_HDR_URL)
VRT_DO_HDR(bereq, proto, sp->wrk->busyobj->bereq, HTTP_HDR_PROTO)
VRT_DO_HDR(bereq, request, sp->req->busyobj->bereq, HTTP_HDR_REQ)
VRT_DO_HDR(bereq, url, sp->req->busyobj->bereq, HTTP_HDR_URL)
VRT_DO_HDR(bereq, proto, sp->req->busyobj->bereq, HTTP_HDR_PROTO)
VRT_DO_HDR(obj, proto, sp->req->obj->http, HTTP_HDR_PROTO)
VRT_DO_HDR(obj, response, sp->req->obj->http, HTTP_HDR_RESPONSE)
VRT_DO_HDR(resp, proto, sp->req->resp, HTTP_HDR_PROTO)
VRT_DO_HDR(resp, response, sp->req->resp, HTTP_HDR_RESPONSE)
VRT_DO_HDR(beresp, proto, sp->wrk->busyobj->beresp, HTTP_HDR_PROTO)
VRT_DO_HDR(beresp, response, sp->wrk->busyobj->beresp, HTTP_HDR_RESPONSE)
VRT_DO_HDR(beresp, proto, sp->req->busyobj->beresp, HTTP_HDR_PROTO)
VRT_DO_HDR(beresp, response, sp->req->busyobj->beresp, HTTP_HDR_RESPONSE)
/*--------------------------------------------------------------------*/
......@@ -114,7 +114,7 @@ VRT_r_##obj##_status(const struct sess *sp) \
}
VRT_DO_STATUS(obj, sp->req->obj->http)
VRT_DO_STATUS(beresp, sp->wrk->busyobj->beresp)
VRT_DO_STATUS(beresp, sp->req->busyobj->beresp)
VRT_DO_STATUS(resp, sp->req->resp)
/*--------------------------------------------------------------------*/
......@@ -130,14 +130,11 @@ VRT_l_beresp_saintmode(const struct sess *sp, double a)
struct trouble *new;
struct trouble *tr;
struct trouble *tr2;
struct worker *wrk;
struct vbc *vbc;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC);
wrk = sp->wrk;
CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
vbc = wrk->busyobj->vbc;
CHECK_OBJ_NOTNULL(sp->req->busyobj, BUSYOBJ_MAGIC);
vbc = sp->req->busyobj->vbc;
if (!vbc)
return;
CHECK_OBJ_NOTNULL(vbc, VBC_MAGIC);
......@@ -187,14 +184,14 @@ void \
VRT_l_##dir##_##onm(const struct sess *sp, type a) \
{ \
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); \
sp->wrk->field = a; \
sp->req->field = a; \
} \
\
type \
VRT_r_##dir##_##onm(const struct sess *sp) \
{ \
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); \
return (sp->wrk->field); \
return (sp->req->field); \
}
VBERESP(beresp, unsigned, do_esi, busyobj->do_esi)
......@@ -235,8 +232,8 @@ VRT_l_bereq_##which(struct sess *sp, double num) \
{ \
\
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); \
CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC); \
sp->wrk->busyobj->which = (num > 0.0 ? num : 0.0); \
CHECK_OBJ_NOTNULL(sp->req->busyobj, BUSYOBJ_MAGIC); \
sp->req->busyobj->which = (num > 0.0 ? num : 0.0); \
} \
\
double __match_proto__() \
......@@ -244,8 +241,8 @@ VRT_r_bereq_##which(struct sess *sp) \
{ \
\
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); \
CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC); \
return(sp->wrk->busyobj->which); \
CHECK_OBJ_NOTNULL(sp->req->busyobj, BUSYOBJ_MAGIC); \
return(sp->req->busyobj->which); \
}
BEREQ_TIMEOUT(connect_timeout)
......@@ -259,8 +256,8 @@ VRT_r_beresp_backend_name(const struct sess *sp)
{
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->wrk->busyobj->vbc, VBC_MAGIC);
return(sp->wrk->busyobj->vbc->backend->vcl_name);
CHECK_OBJ_NOTNULL(sp->req->busyobj->vbc, VBC_MAGIC);
return(sp->req->busyobj->vbc->backend->vcl_name);
}
struct sockaddr_storage *
......@@ -268,8 +265,8 @@ VRT_r_beresp_backend_ip(const struct sess *sp)
{
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->wrk->busyobj->vbc, VBC_MAGIC);
return(sp->wrk->busyobj->vbc->addr);
CHECK_OBJ_NOTNULL(sp->req->busyobj->vbc, VBC_MAGIC);
return(sp->req->busyobj->vbc->addr);
}
int
......@@ -277,8 +274,8 @@ VRT_r_beresp_backend_port(const struct sess *sp)
{
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->wrk->busyobj->vbc, VBC_MAGIC);
return (VTCP_port(sp->wrk->busyobj->vbc->addr));
CHECK_OBJ_NOTNULL(sp->req->busyobj->vbc, VBC_MAGIC);
return (VTCP_port(sp->req->busyobj->vbc->addr));
}
const char * __match_proto__()
......@@ -298,7 +295,7 @@ VRT_l_beresp_storage(struct sess *sp, const char *str, ...)
char *b;
va_start(ap, str);
b = VRT_String(sp->wrk->busyobj->ws, NULL, str, ap);
b = VRT_String(sp->req->busyobj->ws, NULL, str, ap);
va_end(ap);
sp->req->storage_hint = b;
}
......@@ -417,12 +414,12 @@ VRT_DO_EXP(obj, sp->req->obj->exp, keep, 0,
EXP_Rearm(sp->req->obj);
vrt_wsp_exp(sp, sp->req->obj->xid, &sp->req->obj->exp);)
VRT_DO_EXP(beresp, sp->wrk->busyobj->exp, grace, 0,
vrt_wsp_exp(sp, sp->req->xid, &sp->wrk->busyobj->exp);)
VRT_DO_EXP(beresp, sp->wrk->busyobj->exp, ttl, 0,
vrt_wsp_exp(sp, sp->req->xid, &sp->wrk->busyobj->exp);)
VRT_DO_EXP(beresp, sp->wrk->busyobj->exp, keep, 0,
vrt_wsp_exp(sp, sp->req->xid, &sp->wrk->busyobj->exp);)
VRT_DO_EXP(beresp, sp->req->busyobj->exp, grace, 0,
vrt_wsp_exp(sp, sp->req->xid, &sp->req->busyobj->exp);)
VRT_DO_EXP(beresp, sp->req->busyobj->exp, ttl, 0,
vrt_wsp_exp(sp, sp->req->xid, &sp->req->busyobj->exp);)
VRT_DO_EXP(beresp, sp->req->busyobj->exp, keep, 0,
vrt_wsp_exp(sp, sp->req->xid, &sp->req->busyobj->exp);)
/*--------------------------------------------------------------------
* req.xid
......
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