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

Move the temporary accounting structure from wrk to req and

eliminate two SES_Charge() calls that have nothing to charge.
parent 3cc4a726
...@@ -344,8 +344,6 @@ struct worker { ...@@ -344,8 +344,6 @@ struct worker {
struct vxid_pool vxid_pool; struct vxid_pool vxid_pool;
/* Temporary accounting */
struct acct acct_tmp;
}; };
/* LRU ---------------------------------------------------------------*/ /* LRU ---------------------------------------------------------------*/
...@@ -661,6 +659,8 @@ struct req { ...@@ -661,6 +659,8 @@ struct req {
/* Transaction VSL buffer */ /* Transaction VSL buffer */
struct vsl_log vsl[1]; struct vsl_log vsl[1];
/* Temporary accounting */
struct acct acct_req;
}; };
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
...@@ -821,9 +821,9 @@ int VGZ_Destroy(struct vgz **); ...@@ -821,9 +821,9 @@ int VGZ_Destroy(struct vgz **);
void VGZ_UpdateObj(const struct vgz*, struct object *); void VGZ_UpdateObj(const struct vgz*, struct object *);
int VGZ_WrwInit(struct vgz *vg); int VGZ_WrwInit(struct vgz *vg);
int VGZ_WrwGunzip(struct worker *w, struct vgz *, const void *ibuf, int VGZ_WrwGunzip(struct req *, struct vgz *, const void *ibuf,
ssize_t ibufl); ssize_t ibufl);
void VGZ_WrwFlush(struct worker *wrk, struct vgz *vg); void VGZ_WrwFlush(struct req *, struct vgz *vg);
/* Return values */ /* Return values */
#define VGZ_ERROR -1 #define VGZ_ERROR -1
......
...@@ -161,7 +161,6 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -161,7 +161,6 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
if (when < now || tmo == 0) { if (when < now || tmo == 0) {
sp->t_rx = NAN; sp->t_rx = NAN;
wrk->stats.sess_herd++; wrk->stats.sess_herd++;
SES_Charge(wrk, req);
SES_ReleaseReq(req); SES_ReleaseReq(req);
WAIT_Enter(sp); WAIT_Enter(sp);
return (1); return (1);
...@@ -176,7 +175,6 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -176,7 +175,6 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
} }
} }
} }
SES_Charge(wrk, req);
AZ(req->vcl); AZ(req->vcl);
SES_ReleaseReq(req); SES_ReleaseReq(req);
SES_Delete(sp, why, now); SES_Delete(sp, why, now);
...@@ -659,7 +657,7 @@ cnt_fetch(struct worker *wrk, struct req *req) ...@@ -659,7 +657,7 @@ cnt_fetch(struct worker *wrk, struct req *req)
need_host_hdr = !http_GetHdr(bo->bereq, H_Host, NULL); need_host_hdr = !http_GetHdr(bo->bereq, H_Host, NULL);
wrk->acct_tmp.fetch++; req->acct_req.fetch++;
i = FetchHdr(req, need_host_hdr, req->objcore->objhead == NULL); i = FetchHdr(req, need_host_hdr, req->objcore->objhead == NULL);
/* /*
...@@ -1264,7 +1262,7 @@ cnt_pass(struct worker *wrk, struct req *req) ...@@ -1264,7 +1262,7 @@ cnt_pass(struct worker *wrk, struct req *req)
return (0); return (0);
} }
assert(req->handling == VCL_RET_PASS); assert(req->handling == VCL_RET_PASS);
wrk->acct_tmp.pass++; req->acct_req.pass++;
req->req_step = R_STP_FETCH; req->req_step = R_STP_FETCH;
req->objcore = HSH_NewObjCore(wrk); req->objcore = HSH_NewObjCore(wrk);
...@@ -1307,7 +1305,7 @@ cnt_pipe(struct worker *wrk, struct req *req) ...@@ -1307,7 +1305,7 @@ cnt_pipe(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
AZ(req->busyobj); AZ(req->busyobj);
wrk->acct_tmp.pipe++; req->acct_req.pipe++;
req->busyobj = VBO_GetBusyObj(wrk); req->busyobj = VBO_GetBusyObj(wrk);
bo = req->busyobj; bo = req->busyobj;
bo->vsl->wid = req->sp->vsl_id; bo->vsl->wid = req->sp->vsl_id;
...@@ -1486,7 +1484,7 @@ cnt_start(struct worker *wrk, struct req *req) ...@@ -1486,7 +1484,7 @@ cnt_start(struct worker *wrk, struct req *req)
/* Update stats of various sorts */ /* Update stats of various sorts */
wrk->stats.client_req++; wrk->stats.client_req++;
wrk->acct_tmp.req++; req->acct_req.req++;
/* Assign XID and log */ /* Assign XID and log */
req->xid = ++xids; /* XXX not locked */ req->xid = ++xids; /* XXX not locked */
...@@ -1600,8 +1598,10 @@ CNT_Request(struct worker *wrk, struct req *req) ...@@ -1600,8 +1598,10 @@ CNT_Request(struct worker *wrk, struct req *req)
WS_Assert(wrk->aws); WS_Assert(wrk->aws);
CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC); CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
} }
if (done == 1) if (done == 1) {
/* done == 2 was charged by cache_hash.c */
SES_Charge(wrk, req); SES_Charge(wrk, req);
}
req->wrk = NULL; req->wrk = NULL;
......
...@@ -321,7 +321,7 @@ ESI_Deliver(struct req *req) ...@@ -321,7 +321,7 @@ ESI_Deliver(struct req *req)
* response * response
*/ */
AN(vgz); AN(vgz);
i = VGZ_WrwGunzip(req->wrk, vgz, i = VGZ_WrwGunzip(req, vgz,
st->ptr + off, l2); st->ptr + off, l2);
if (WRW_Error(req->wrk)) { if (WRW_Error(req->wrk)) {
SES_Close(req->sp, SES_Close(req->sp,
...@@ -374,7 +374,7 @@ ESI_Deliver(struct req *req) ...@@ -374,7 +374,7 @@ ESI_Deliver(struct req *req)
r = (void*)strchr((const char*)q, '\0'); r = (void*)strchr((const char*)q, '\0');
AN(r); AN(r);
if (vgz != NULL) if (vgz != NULL)
VGZ_WrwFlush(req->wrk, vgz); VGZ_WrwFlush(req, vgz);
if (WRW_Flush(req->wrk)) { if (WRW_Flush(req->wrk)) {
SES_Close(req->sp, SC_REM_CLOSE); SES_Close(req->sp, SC_REM_CLOSE);
p = e; p = e;
...@@ -391,7 +391,7 @@ ESI_Deliver(struct req *req) ...@@ -391,7 +391,7 @@ ESI_Deliver(struct req *req)
} }
} }
if (vgz != NULL) { if (vgz != NULL) {
VGZ_WrwFlush(req->wrk, vgz); VGZ_WrwFlush(req, vgz);
(void)VGZ_Destroy(&vgz); (void)VGZ_Destroy(&vgz);
} }
if (req->gzip_resp && req->esi_level == 0) { if (req->gzip_resp && req->esi_level == 0) {
......
...@@ -315,13 +315,16 @@ VGZ_WrwInit(struct vgz *vg) ...@@ -315,13 +315,16 @@ VGZ_WrwInit(struct vgz *vg)
*/ */
int int
VGZ_WrwGunzip(struct worker *wrk, struct vgz *vg, const void *ibuf, VGZ_WrwGunzip(struct req *req, struct vgz *vg, const void *ibuf,
ssize_t ibufl) ssize_t ibufl)
{ {
int i; int i;
size_t dl; size_t dl;
const void *dp; const void *dp;
struct worker *wrk;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
wrk = req->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
AN(vg->m_buf); AN(vg->m_buf);
...@@ -340,7 +343,7 @@ VGZ_WrwGunzip(struct worker *wrk, struct vgz *vg, const void *ibuf, ...@@ -340,7 +343,7 @@ VGZ_WrwGunzip(struct worker *wrk, struct vgz *vg, const void *ibuf,
return (-1); return (-1);
} }
if (vg->m_len == vg->m_sz || i == VGZ_STUCK) { if (vg->m_len == vg->m_sz || i == VGZ_STUCK) {
wrk->acct_tmp.bodybytes += vg->m_len; req->acct_req.bodybytes += vg->m_len;
(void)WRW_Write(wrk, vg->m_buf, vg->m_len); (void)WRW_Write(wrk, vg->m_buf, vg->m_len);
(void)WRW_Flush(wrk); (void)WRW_Flush(wrk);
vg->m_len = 0; vg->m_len = 0;
...@@ -355,15 +358,19 @@ VGZ_WrwGunzip(struct worker *wrk, struct vgz *vg, const void *ibuf, ...@@ -355,15 +358,19 @@ VGZ_WrwGunzip(struct worker *wrk, struct vgz *vg, const void *ibuf,
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
void void
VGZ_WrwFlush(struct worker *wrk, struct vgz *vg) VGZ_WrwFlush(struct req *req, struct vgz *vg)
{ {
struct worker *wrk;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
wrk = req->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
if (vg->m_len == 0) if (vg->m_len == 0)
return; return;
wrk->acct_tmp.bodybytes += vg->m_len; req->acct_req.bodybytes += vg->m_len;
(void)WRW_Write(wrk, vg->m_buf, vg->m_len); (void)WRW_Write(wrk, vg->m_buf, vg->m_len);
(void)WRW_Flush(wrk); (void)WRW_Flush(wrk);
vg->m_len = 0; vg->m_len = 0;
......
...@@ -82,10 +82,10 @@ PipeRequest(struct req *req) ...@@ -82,10 +82,10 @@ PipeRequest(struct req *req)
(void)VTCP_blocking(vc->fd); (void)VTCP_blocking(vc->fd);
WRW_Reserve(wrk, &vc->fd, bo->vsl, req->t_req); WRW_Reserve(wrk, &vc->fd, bo->vsl, req->t_req);
wrk->acct_tmp.hdrbytes += http_Write(wrk, bo->bereq, 0); req->acct_req.hdrbytes += http_Write(wrk, bo->bereq, 0);
if (req->htc->pipeline.b != NULL) if (req->htc->pipeline.b != NULL)
wrk->acct_tmp.bodybytes += req->acct_req.bodybytes +=
WRW_Write(wrk, req->htc->pipeline.b, WRW_Write(wrk, req->htc->pipeline.b,
Tlen(req->htc->pipeline)); Tlen(req->htc->pipeline));
......
...@@ -171,11 +171,11 @@ res_WriteGunzipObj(struct req *req) ...@@ -171,11 +171,11 @@ res_WriteGunzipObj(struct req *req)
CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC); CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
u += st->len; u += st->len;
i = VGZ_WrwGunzip(req->wrk, vg, st->ptr, st->len); i = VGZ_WrwGunzip(req, vg, st->ptr, st->len);
/* XXX: error check */ /* XXX: error check */
(void)i; (void)i;
} }
VGZ_WrwFlush(req->wrk, vg); VGZ_WrwFlush(req, vg);
(void)VGZ_Destroy(&vg); (void)VGZ_Destroy(&vg);
assert(u == req->obj->len); assert(u == req->obj->len);
} }
...@@ -183,7 +183,7 @@ res_WriteGunzipObj(struct req *req) ...@@ -183,7 +183,7 @@ res_WriteGunzipObj(struct req *req)
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
static void static void
res_WriteDirObj(const struct req *req, ssize_t low, ssize_t high) res_WriteDirObj(struct req *req, ssize_t low, ssize_t high)
{ {
ssize_t u = 0; ssize_t u = 0;
size_t ptr, off, len; size_t ptr, off, len;
...@@ -215,7 +215,7 @@ res_WriteDirObj(const struct req *req, ssize_t low, ssize_t high) ...@@ -215,7 +215,7 @@ res_WriteDirObj(const struct req *req, ssize_t low, ssize_t high)
ptr += len; ptr += len;
req->wrk->acct_tmp.bodybytes += len; req->acct_req.bodybytes += len;
(void)WRW_Write(req->wrk, st->ptr + off, len); (void)WRW_Write(req->wrk, st->ptr + off, len);
} }
assert(u == req->obj->len); assert(u == req->obj->len);
...@@ -254,7 +254,7 @@ RES_WriteObj(struct req *req) ...@@ -254,7 +254,7 @@ RES_WriteObj(struct req *req)
* Send HTTP protocol header, unless interior ESI object * Send HTTP protocol header, unless interior ESI object
*/ */
if (!(req->res_mode & RES_ESI_CHILD)) if (!(req->res_mode & RES_ESI_CHILD))
req->wrk->acct_tmp.hdrbytes += req->acct_req.hdrbytes +=
http_Write(req->wrk, req->resp, 1); http_Write(req->wrk, req->resp, 1);
if (!req->wantbody) if (!req->wantbody)
......
...@@ -79,7 +79,7 @@ SES_Charge(struct worker *wrk, struct req *req) ...@@ -79,7 +79,7 @@ SES_Charge(struct worker *wrk, struct req *req)
sp = req->sp; sp = req->sp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
a = &wrk->acct_tmp; a = &req->acct_req;
req->req_bodybytes += a->bodybytes; req->req_bodybytes += a->bodybytes;
#define ACCT(foo) \ #define ACCT(foo) \
...@@ -229,7 +229,7 @@ SES_pool_accept_task(struct worker *wrk, void *arg) ...@@ -229,7 +229,7 @@ SES_pool_accept_task(struct worker *wrk, void *arg)
VCA_FailSess(wrk); VCA_FailSess(wrk);
return; return;
} }
wrk->acct_tmp.sess++; wrk->stats.s_sess++;
sp->t_open = VTIM_real(); sp->t_open = VTIM_real();
sp->t_rx = sp->t_open; sp->t_rx = sp->t_open;
...@@ -431,6 +431,9 @@ SES_ReleaseReq(struct req *req) ...@@ -431,6 +431,9 @@ SES_ReleaseReq(struct req *req)
struct sesspool *pp; struct sesspool *pp;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
#define ACCT(foo) AZ(req->acct_req.foo);
#include "tbl/acct_fields.h"
#undef ACCT
sp = req->sp; sp = req->sp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
pp = sp->sesspool; pp = sp->sesspool;
......
...@@ -26,12 +26,11 @@ ...@@ -26,12 +26,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* These are the stats we keep track of per session. They will be summed, * These are the stats we keep track of per session.
* via the sp->wrk->stats into the s_<name> fields in the SHM file. * SES_Charge() sums them into wrk->stats
* NB: Remember to mark those in vsc_fields.h to be included in struct dstat. * NB: Remember to mark those in vsc_fields.h to be included in struct dstat.
*/ */
ACCT(sess)
ACCT(req) ACCT(req)
ACCT(pipe) ACCT(pipe)
ACCT(pass) ACCT(pass)
......
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