From martin at varnish-cache.org Thu Dec 1 11:58:17 2011 From: martin at varnish-cache.org (Martin Blix Grydeland) Date: Thu, 01 Dec 2011 12:58:17 +0100 Subject: [master] ecd8f53 Only call pan_busyobj when we have a busyobj Message-ID: commit ecd8f535d8add7fc1a02f0b041939099a6183fa3 Author: Martin Blix Grydeland Date: Thu Dec 1 12:51:26 2011 +0100 Only call pan_busyobj when we have a busyobj diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c index 0908b74..cf39489 100644 --- a/bin/varnishd/cache/cache_panic.c +++ b/bin/varnishd/cache/cache_panic.c @@ -259,7 +259,8 @@ pan_sess(const struct sess *sp) VSB_printf(pan_vsp, " restarts = %d, esi_level = %d\n", sp->restarts, sp->esi_level); - pan_busyobj(sp->wrk->busyobj); + if (sp->wrk->busyobj != NULL) + pan_busyobj(sp->wrk->busyobj); pan_ws(sp->ws, 2); pan_http("req", sp->http, 2); From martin at varnish-cache.org Thu Dec 1 11:58:17 2011 From: martin at varnish-cache.org (Martin Blix Grydeland) Date: Thu, 01 Dec 2011 12:58:17 +0100 Subject: [master] 9a5b477 Correct indent level of closing bracket in pan_wrk() Message-ID: commit 9a5b4779043aa90af7d5b5f4a13d6e34f787ecb5 Author: Martin Blix Grydeland Date: Thu Dec 1 12:53:51 2011 +0100 Correct indent level of closing bracket in pan_wrk() diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c index cf39489..798ba53 100644 --- a/bin/varnishd/cache/cache_panic.c +++ b/bin/varnishd/cache/cache_panic.c @@ -203,7 +203,7 @@ pan_wrk(const struct worker *wrk) pan_http("beresp", wrk->beresp, 4); if (wrk->resp->ws != NULL) pan_http("resp", wrk->resp, 4); - VSB_printf(pan_vsp, " },\n"); + VSB_printf(pan_vsp, " },\n"); } static void From phk at varnish-cache.org Mon Dec 5 08:34:44 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 09:34:44 +0100 Subject: [master] 9633e66 Led VDI_CloseFd() take an the vbc to be closed as argument. Message-ID: commit 9633e660b238f3456baa004caf58a10e1403cb41 Author: Poul-Henning Kamp Date: Mon Dec 5 08:34:27 2011 +0000 Led VDI_CloseFd() take an the vbc to be closed as argument. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index ff9dcea..4cfad78 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -650,7 +650,7 @@ void VBE_UseHealth(const struct director *vdi); struct vbc *VDI_GetFd(const struct director *, struct sess *sp); int VDI_Healthy(const struct director *, const struct sess *sp); -void VDI_CloseFd(struct worker *wrk); +void VDI_CloseFd(struct worker *wrk, struct vbc **vbp); void VDI_RecycleFd(struct worker *wrk); void VDI_AddHostHeader(const struct sess *sp); void VBE_Poll(void); diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index 501293d..997ecac 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -249,7 +249,7 @@ cnt_prepresp(struct sess *sp) if (sp->restarts >= cache_param->max_restarts) break; if (wrk->busyobj->do_stream) { - VDI_CloseFd(wrk); + VDI_CloseFd(wrk, &wrk->vbc); HSH_Drop(wrk); } else { (void)HSH_Deref(wrk, NULL, &wrk->obj); @@ -633,7 +633,7 @@ cnt_fetch(struct sess *sp) } /* We are not going to fetch the body, Close the connection */ - VDI_CloseFd(wrk); + VDI_CloseFd(wrk, &wrk->vbc); } /* Clean up partial fetch */ @@ -817,7 +817,7 @@ cnt_fetchbody(struct sess *sp) if (wrk->obj == NULL) { sp->err_code = 503; sp->step = STP_ERROR; - VDI_CloseFd(wrk); + VDI_CloseFd(wrk, &wrk->vbc); return (0); } CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); diff --git a/bin/varnishd/cache/cache_dir.c b/bin/varnishd/cache/cache_dir.c index eba6183..434277e 100644 --- a/bin/varnishd/cache/cache_dir.c +++ b/bin/varnishd/cache/cache_dir.c @@ -40,27 +40,31 @@ /* Close a connection ------------------------------------------------*/ void -VDI_CloseFd(struct worker *wrk) +VDI_CloseFd(struct worker *wrk, struct vbc **vbp) { struct backend *bp; + struct vbc *vc; - CHECK_OBJ_NOTNULL(wrk->vbc, VBC_MAGIC); - CHECK_OBJ_NOTNULL(wrk->vbc->backend, BACKEND_MAGIC); - assert(wrk->vbc->fd >= 0); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + AN(vbp); + vc = *vbp; + *vbp = NULL; + CHECK_OBJ_NOTNULL(vc, VBC_MAGIC); + CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC); + assert(vc->fd >= 0); - bp = wrk->vbc->backend; + bp = vc->backend; - WSL(wrk, SLT_BackendClose, wrk->vbc->vsl_id, "%s", bp->display_name); + WSL(wrk, SLT_BackendClose, vc->vsl_id, "%s", bp->display_name); /* Checkpoint log to flush all info related to this connection before the OS reuses the FD */ WSL_Flush(wrk, 0); - VTCP_close(&wrk->vbc->fd); + VTCP_close(&vc->fd); VBE_DropRefConn(bp); - wrk->vbc->backend = NULL; - VBE_ReleaseConn(wrk->vbc); - wrk->vbc = NULL; + vc->backend = NULL; + VBE_ReleaseConn(vc); } /* Recycle a connection ----------------------------------------------*/ diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index 38a2cf3..1d4eff3 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -427,7 +427,7 @@ FetchHdr(struct sess *sp) if (WRW_FlushRelease(w) || i > 0) { WSP(sp, SLT_FetchError, "backend write error: %d (%s)", errno, strerror(errno)); - VDI_CloseFd(sp->wrk); + VDI_CloseFd(sp->wrk, &sp->wrk->vbc); /* XXX: other cleanup ? */ return (retry); } @@ -451,7 +451,7 @@ FetchHdr(struct sess *sp) if (i < 0) { WSP(sp, SLT_FetchError, "http first read error: %d %d (%s)", i, errno, strerror(errno)); - VDI_CloseFd(sp->wrk); + VDI_CloseFd(sp->wrk, &sp->wrk->vbc); /* XXX: other cleanup ? */ /* Retryable if we never received anything */ return (i == -1 ? retry : -1); @@ -465,7 +465,7 @@ FetchHdr(struct sess *sp) WSP(sp, SLT_FetchError, "http first read error: %d %d (%s)", i, errno, strerror(errno)); - VDI_CloseFd(sp->wrk); + VDI_CloseFd(sp->wrk, &sp->wrk->vbc); /* XXX: other cleanup ? */ return (-1); } @@ -475,7 +475,7 @@ FetchHdr(struct sess *sp) if (http_DissectResponse(w, htc, hp)) { WSP(sp, SLT_FetchError, "http format error"); - VDI_CloseFd(sp->wrk); + VDI_CloseFd(sp->wrk, &sp->wrk->vbc); /* XXX: other cleanup ? */ return (-1); } @@ -571,7 +571,7 @@ FetchBody(struct worker *w, struct object *obj) cls, mklen); if (w->busyobj->body_status == BS_ERROR) { - VDI_CloseFd(w); + VDI_CloseFd(w, &w->vbc); return (__LINE__); } @@ -583,7 +583,7 @@ FetchBody(struct worker *w, struct object *obj) VTAILQ_REMOVE(&obj->store, st, list); STV_free(st); } - VDI_CloseFd(w); + VDI_CloseFd(w, &w->vbc); obj->len = 0; return (__LINE__); } @@ -616,7 +616,7 @@ FetchBody(struct worker *w, struct object *obj) } if (cls) - VDI_CloseFd(w); + VDI_CloseFd(w, &w->vbc); else VDI_RecycleFd(w); diff --git a/bin/varnishd/cache/cache_pipe.c b/bin/varnishd/cache/cache_pipe.c index 4180d39..9bf8b79 100644 --- a/bin/varnishd/cache/cache_pipe.c +++ b/bin/varnishd/cache/cache_pipe.c @@ -89,7 +89,7 @@ PipeSession(struct sess *sp) if (i) { SES_Close(sp, "pipe"); - VDI_CloseFd(sp->wrk); + VDI_CloseFd(sp->wrk, &sp->wrk->vbc); return; } @@ -129,5 +129,5 @@ PipeSession(struct sess *sp) } } SES_Close(sp, "pipe"); - VDI_CloseFd(sp->wrk); + VDI_CloseFd(sp->wrk, &sp->wrk->vbc); } From phk at varnish-cache.org Mon Dec 5 08:49:35 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 09:49:35 +0100 Subject: [master] 5ec8dea Give pipe its own local vbc. Message-ID: commit 5ec8dead4585d87ff8742342cdf34cd4aa947eaf Author: Poul-Henning Kamp Date: Mon Dec 5 08:49:20 2011 +0000 Give pipe its own local vbc. diff --git a/bin/varnishd/cache/cache_pipe.c b/bin/varnishd/cache/cache_pipe.c index 9bf8b79..5337eda 100644 --- a/bin/varnishd/cache/cache_pipe.c +++ b/bin/varnishd/cache/cache_pipe.c @@ -71,10 +71,9 @@ PipeSession(struct sess *sp) CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); w = sp->wrk; - sp->wrk->vbc = VDI_GetFd(NULL, sp); - if (sp->wrk->vbc == NULL) + vc = VDI_GetFd(NULL, sp); + if (vc == NULL) return; - vc = sp->wrk->vbc; (void)VTCP_blocking(vc->fd); WRW_Reserve(w, &vc->fd); @@ -89,7 +88,7 @@ PipeSession(struct sess *sp) if (i) { SES_Close(sp, "pipe"); - VDI_CloseFd(sp->wrk, &sp->wrk->vbc); + VDI_CloseFd(sp->wrk, &vc); return; } @@ -129,5 +128,5 @@ PipeSession(struct sess *sp) } } SES_Close(sp, "pipe"); - VDI_CloseFd(sp->wrk, &sp->wrk->vbc); + VDI_CloseFd(sp->wrk, &vc); } From phk at varnish-cache.org Mon Dec 5 09:10:46 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 10:10:46 +0100 Subject: [master] 7e11625 Use correct vsl_id. Message-ID: commit 7e11625e27494bb91f9129a99709d855c2ba469f Author: Poul-Henning Kamp Date: Mon Dec 5 09:10:33 2011 +0000 Use correct vsl_id. diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index de4318f..a435c1c 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -66,7 +66,7 @@ VDI_AddHostHeader(const struct sess *sp) CHECK_OBJ_NOTNULL(sp->wrk->bereq, HTTP_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk->vbc, VBC_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk->vbc->vdis, VDI_SIMPLE_MAGIC); - http_PrintfHeader(sp->wrk, sp->vsl_id, sp->wrk->bereq, + http_PrintfHeader(sp->wrk, sp->wrk->vbc->vsl_id, sp->wrk->bereq, "Host: %s", sp->wrk->vbc->vdis->vrt->hosthdr); } From phk at varnish-cache.org Mon Dec 5 13:06:55 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 14:06:55 +0100 Subject: [master] e91fe76 Fix a buglet where we could send one backends Host: header to another backend under very rare circumstances. Message-ID: commit e91fe766effc59fc42bbde821b69552c086c60f3 Author: Poul-Henning Kamp Date: Mon Dec 5 13:06:28 2011 +0000 Fix a buglet where we could send one backends Host: header to another backend under very rare circumstances. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 4cfad78..05aaf39 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -712,7 +712,7 @@ int EXP_NukeOne(struct worker *w, struct lru *lru); struct storage *FetchStorage(struct worker *w, ssize_t sz); int FetchError(struct worker *w, const char *error); int FetchError2(struct worker *w, const char *error, const char *more); -int FetchHdr(struct sess *sp); +int FetchHdr(struct sess *sp, int need_host_hdr); int FetchBody(struct worker *w, struct object *obj); int FetchReqBody(struct sess *sp); void Fetch_Init(void); diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index 997ecac..d2126ba 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -554,7 +554,7 @@ DOT errfetch [label="ERROR",shape=plaintext] static int cnt_fetch(struct sess *sp) { - int i; + int i, need_host_hdr; struct worker *wrk; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); @@ -571,7 +571,9 @@ cnt_fetch(struct sess *sp) http_Setup(wrk->beresp, wrk->ws); - i = FetchHdr(sp); + need_host_hdr = !http_GetHdr(wrk->bereq, H_Host, NULL); + + i = FetchHdr(sp, need_host_hdr); /* * If we recycle a backend connection, there is a finite chance * that the backend closed it before we get a request to it. @@ -579,7 +581,7 @@ cnt_fetch(struct sess *sp) */ if (i == 1) { VSC_C_main->backend_retry++; - i = FetchHdr(sp); + i = FetchHdr(sp, need_host_hdr); } if (i) { diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index 1d4eff3..7d8763f 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -375,11 +375,10 @@ FetchReqBody(struct sess *sp) */ int -FetchHdr(struct sess *sp) +FetchHdr(struct sess *sp, int need_host_hdr) { struct vbc *vc; struct worker *w; - char *b; struct http *hp; int retry = -1; int i; @@ -415,7 +414,7 @@ FetchHdr(struct sess *sp) * header if one is necessary. This cannot be done in the VCL * because the backend may be chosen by a director. */ - if (!http_GetHdr(hp, H_Host, &b)) + if (need_host_hdr) VDI_AddHostHeader(sp); (void)VTCP_blocking(vc->fd); /* XXX: we should timeout instead */ From phk at varnish-cache.org Mon Dec 5 13:43:51 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 14:43:51 +0100 Subject: [master] e4c002c Make VDI_RecycleFd() take a pointer to the vbc to recycle. Message-ID: commit e4c002c41096468083fddef3a47e6b5c49577744 Author: Poul-Henning Kamp Date: Mon Dec 5 13:28:20 2011 +0000 Make VDI_RecycleFd() take a pointer to the vbc to recycle. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 05aaf39..4cc356e 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -651,7 +651,7 @@ void VBE_UseHealth(const struct director *vdi); struct vbc *VDI_GetFd(const struct director *, struct sess *sp); int VDI_Healthy(const struct director *, const struct sess *sp); void VDI_CloseFd(struct worker *wrk, struct vbc **vbp); -void VDI_RecycleFd(struct worker *wrk); +void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp); void VDI_AddHostHeader(const struct sess *sp); void VBE_Poll(void); diff --git a/bin/varnishd/cache/cache_dir.c b/bin/varnishd/cache/cache_dir.c index 434277e..5902ce8 100644 --- a/bin/varnishd/cache/cache_dir.c +++ b/bin/varnishd/cache/cache_dir.c @@ -70,17 +70,22 @@ VDI_CloseFd(struct worker *wrk, struct vbc **vbp) /* Recycle a connection ----------------------------------------------*/ void -VDI_RecycleFd(struct worker *wrk) +VDI_RecycleFd(struct worker *wrk, struct vbc **vbp) { struct backend *bp; + struct vbc *vc; - CHECK_OBJ_NOTNULL(wrk->vbc, VBC_MAGIC); - CHECK_OBJ_NOTNULL(wrk->vbc->backend, BACKEND_MAGIC); - assert(wrk->vbc->fd >= 0); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + AN(vbp); + vc = *vbp; + *vbp = NULL; + CHECK_OBJ_NOTNULL(vc, VBC_MAGIC); + CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC); + assert(vc->fd >= 0); - bp = wrk->vbc->backend; + bp = vc->backend; - WSL(wrk, SLT_BackendReuse, wrk->vbc->vsl_id, "%s", bp->display_name); + WSL(wrk, SLT_BackendReuse, vc->vsl_id, "%s", bp->display_name); /* * Flush the shmlog, so that another session reusing this backend * will log chronologically later than our use of it. @@ -88,8 +93,7 @@ VDI_RecycleFd(struct worker *wrk) WSL_Flush(wrk, 0); Lck_Lock(&bp->mtx); VSC_C_main->backend_recycle++; - VTAILQ_INSERT_HEAD(&bp->connlist, wrk->vbc, list); - wrk->vbc = NULL; + VTAILQ_INSERT_HEAD(&bp->connlist, vc, list); VBE_DropRefLocked(bp); } diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index 7d8763f..d321d7a 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -617,7 +617,7 @@ FetchBody(struct worker *w, struct object *obj) if (cls) VDI_CloseFd(w, &w->vbc); else - VDI_RecycleFd(w); + VDI_RecycleFd(w, &w->vbc); return (0); } From phk at varnish-cache.org Mon Dec 5 13:43:53 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 14:43:53 +0100 Subject: [master] 9cb9ba6 Move vbc from worker to busyobj Message-ID: commit 9cb9ba6f6dbf4a3f9136f8b145c80be0d26418a9 Author: Poul-Henning Kamp Date: Mon Dec 5 13:43:38 2011 +0000 Move vbc from worker to busyobj diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 4cc356e..46af4dd 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -330,7 +330,6 @@ struct worker { /* Fetch stuff. Here because pipe has no busyobj */ struct http *bereq; struct http *beresp; - struct vbc *vbc; /* Stream state */ struct stream_ctx *sctx; @@ -494,6 +493,7 @@ struct busyobj { unsigned fetch_failed; struct vgz *vgz_rx; + struct vbc *vbc; struct object *fetch_obj; struct exp exp; struct http_conn htc; @@ -652,7 +652,7 @@ struct vbc *VDI_GetFd(const struct director *, struct sess *sp); int VDI_Healthy(const struct director *, const struct sess *sp); void VDI_CloseFd(struct worker *wrk, struct vbc **vbp); void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp); -void VDI_AddHostHeader(const struct sess *sp); +void VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc); void VBE_Poll(void); /* cache_backend_cfg.c */ diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index a435c1c..b661640 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -59,15 +59,15 @@ struct vdi_simple { * Create default Host: header for backend request */ void -VDI_AddHostHeader(const struct sess *sp) +VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc) { - CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->wrk->bereq, HTTP_MAGIC); - CHECK_OBJ_NOTNULL(sp->wrk->vbc, VBC_MAGIC); - CHECK_OBJ_NOTNULL(sp->wrk->vbc->vdis, VDI_SIMPLE_MAGIC); - http_PrintfHeader(sp->wrk, sp->wrk->vbc->vsl_id, sp->wrk->bereq, - "Host: %s", sp->wrk->vbc->vdis->vrt->hosthdr); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->bereq, HTTP_MAGIC); + CHECK_OBJ_NOTNULL(vbc, VBC_MAGIC); + CHECK_OBJ_NOTNULL(vbc->vdis, VDI_SIMPLE_MAGIC); + http_PrintfHeader(wrk, vbc->vsl_id, wrk->bereq, + "Host: %s", vbc->vdis->vrt->hosthdr); } /*--------------------------------------------------------------------*/ diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index d2126ba..079df44 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -249,7 +249,7 @@ cnt_prepresp(struct sess *sp) if (sp->restarts >= cache_param->max_restarts) break; if (wrk->busyobj->do_stream) { - VDI_CloseFd(wrk, &wrk->vbc); + VDI_CloseFd(wrk, &wrk->busyobj->vbc); HSH_Drop(wrk); } else { (void)HSH_Deref(wrk, NULL, &wrk->obj); @@ -338,7 +338,6 @@ cnt_done(struct sess *sp) CHECK_OBJ_ORNULL(sp->vcl, VCL_CONF_MAGIC); AZ(wrk->obj); - AZ(wrk->vbc); sp->director = NULL; sp->restarts = 0; @@ -565,7 +564,7 @@ cnt_fetch(struct sess *sp) CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); AN(sp->director); - AZ(wrk->vbc); + AZ(wrk->busyobj->vbc); AZ(wrk->busyobj->should_close); AZ(wrk->storage_hint); @@ -635,11 +634,11 @@ cnt_fetch(struct sess *sp) } /* We are not going to fetch the body, Close the connection */ - VDI_CloseFd(wrk, &wrk->vbc); + VDI_CloseFd(wrk, &wrk->busyobj->vbc); } /* Clean up partial fetch */ - AZ(wrk->vbc); + AZ(wrk->busyobj->vbc); if (wrk->objcore != NULL) { CHECK_OBJ_NOTNULL(wrk->objcore, OBJCORE_MAGIC); @@ -819,7 +818,7 @@ cnt_fetchbody(struct sess *sp) if (wrk->obj == NULL) { sp->err_code = 503; sp->step = STP_ERROR; - VDI_CloseFd(wrk, &wrk->vbc); + VDI_CloseFd(wrk, &wrk->busyobj->vbc); return (0); } CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); @@ -883,7 +882,7 @@ cnt_fetchbody(struct sess *sp) http_Setup(wrk->beresp, NULL); wrk->busyobj->vfp = NULL; assert(WRW_IsReleased(wrk)); - AZ(wrk->vbc); + AZ(wrk->busyobj->vbc); AN(sp->director); if (i) { @@ -950,7 +949,7 @@ cnt_streambody(struct sess *sp) http_Setup(wrk->bereq, NULL); http_Setup(wrk->beresp, NULL); wrk->busyobj->vfp = NULL; - AZ(wrk->vbc); + AZ(wrk->busyobj->vbc); AN(sp->director); if (!i && wrk->obj->objcore != NULL) { diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index d321d7a..6483a99 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -400,12 +400,12 @@ FetchHdr(struct sess *sp, int need_host_hdr) hp = w->bereq; - sp->wrk->vbc = VDI_GetFd(NULL, sp); - if (sp->wrk->vbc == NULL) { + sp->wrk->busyobj->vbc = VDI_GetFd(NULL, sp); + if (sp->wrk->busyobj->vbc == NULL) { WSP(sp, SLT_FetchError, "no backend connection"); return (-1); } - vc = sp->wrk->vbc; + vc = sp->wrk->busyobj->vbc; if (vc->recycled) retry = 1; @@ -415,7 +415,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) * because the backend may be chosen by a director. */ if (need_host_hdr) - VDI_AddHostHeader(sp); + VDI_AddHostHeader(sp->wrk, vc); (void)VTCP_blocking(vc->fd); /* XXX: we should timeout instead */ WRW_Reserve(w, &vc->fd); @@ -426,7 +426,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) if (WRW_FlushRelease(w) || i > 0) { WSP(sp, SLT_FetchError, "backend write error: %d (%s)", errno, strerror(errno)); - VDI_CloseFd(sp->wrk, &sp->wrk->vbc); + VDI_CloseFd(sp->wrk, &sp->wrk->busyobj->vbc); /* XXX: other cleanup ? */ return (retry); } @@ -450,7 +450,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) if (i < 0) { WSP(sp, SLT_FetchError, "http first read error: %d %d (%s)", i, errno, strerror(errno)); - VDI_CloseFd(sp->wrk, &sp->wrk->vbc); + VDI_CloseFd(sp->wrk, &sp->wrk->busyobj->vbc); /* XXX: other cleanup ? */ /* Retryable if we never received anything */ return (i == -1 ? retry : -1); @@ -464,7 +464,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) WSP(sp, SLT_FetchError, "http first read error: %d %d (%s)", i, errno, strerror(errno)); - VDI_CloseFd(sp->wrk, &sp->wrk->vbc); + VDI_CloseFd(sp->wrk, &sp->wrk->busyobj->vbc); /* XXX: other cleanup ? */ return (-1); } @@ -474,7 +474,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) if (http_DissectResponse(w, htc, hp)) { WSP(sp, SLT_FetchError, "http format error"); - VDI_CloseFd(sp->wrk, &sp->wrk->vbc); + VDI_CloseFd(sp->wrk, &sp->wrk->busyobj->vbc); /* XXX: other cleanup ? */ return (-1); } @@ -495,7 +495,7 @@ FetchBody(struct worker *w, struct object *obj) CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); AZ(w->busyobj->fetch_obj); - CHECK_OBJ_NOTNULL(w->vbc, VBC_MAGIC); + CHECK_OBJ_NOTNULL(w->busyobj->vbc, VBC_MAGIC); CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(obj->http, HTTP_MAGIC); @@ -570,7 +570,7 @@ FetchBody(struct worker *w, struct object *obj) cls, mklen); if (w->busyobj->body_status == BS_ERROR) { - VDI_CloseFd(w, &w->vbc); + VDI_CloseFd(w, &w->busyobj->vbc); return (__LINE__); } @@ -582,7 +582,7 @@ FetchBody(struct worker *w, struct object *obj) VTAILQ_REMOVE(&obj->store, st, list); STV_free(st); } - VDI_CloseFd(w, &w->vbc); + VDI_CloseFd(w, &w->busyobj->vbc); obj->len = 0; return (__LINE__); } @@ -610,14 +610,14 @@ FetchBody(struct worker *w, struct object *obj) if (mklen > 0) { http_Unset(obj->http, H_Content_Length); - http_PrintfHeader(w, w->vbc->vsl_id, obj->http, + http_PrintfHeader(w, w->busyobj->vbc->vsl_id, obj->http, "Content-Length: %jd", (intmax_t)obj->len); } if (cls) - VDI_CloseFd(w, &w->vbc); + VDI_CloseFd(w, &w->busyobj->vbc); else - VDI_RecycleFd(w, &w->vbc); + VDI_RecycleFd(w, &w->busyobj->vbc); return (0); } diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c index 798ba53..923abbd 100644 --- a/bin/varnishd/cache/cache_panic.c +++ b/bin/varnishd/cache/cache_panic.c @@ -220,6 +220,9 @@ pan_busyobj(const struct busyobj *bo) if (bo->should_close) VSB_printf(pan_vsp, " should_close\n"); VSB_printf(pan_vsp, " bodystatus = %d,\n", bo->body_status); VSB_printf(pan_vsp, " },\n"); + if (VALID_OBJ(bo->vbc, BACKEND_MAGIC)) + pan_vbc(bo->vbc); + } /*--------------------------------------------------------------------*/ @@ -271,9 +274,6 @@ pan_sess(const struct sess *sp) if (VALID_OBJ(sp->vcl, VCL_CONF_MAGIC)) pan_vcl(sp->vcl); - if (VALID_OBJ(sp->wrk->vbc, BACKEND_MAGIC)) - pan_vbc(sp->wrk->vbc); - if (VALID_OBJ(sp->wrk->obj, OBJECT_MAGIC)) pan_object(sp->wrk->obj); diff --git a/bin/varnishd/cache/cache_shmlog.c b/bin/varnishd/cache/cache_shmlog.c index 3cfd451..b7c43a1 100644 --- a/bin/varnishd/cache/cache_shmlog.c +++ b/bin/varnishd/cache/cache_shmlog.c @@ -291,10 +291,11 @@ WSLB(struct worker *w, enum VSL_tag_e tag, const char *fmt, ...) va_list ap; CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->vbc, VBC_MAGIC); + CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); + CHECK_OBJ_NOTNULL(w->busyobj->vbc, VBC_MAGIC); AN(fmt); va_start(ap, fmt); - wsl(w, tag, w->vbc->vsl_id, fmt, ap); + wsl(w, tag, w->busyobj->vbc->vsl_id, fmt, ap); va_end(ap); } diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c index 0342de8..fea5c70 100644 --- a/bin/varnishd/cache/cache_vrt_var.c +++ b/bin/varnishd/cache/cache_vrt_var.c @@ -132,15 +132,19 @@ VRT_l_beresp_saintmode(const struct sess *sp, double a) 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; - if (!wrk->vbc) + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vbc = wrk->busyobj->vbc; + if (!vbc) return; - CHECK_OBJ_NOTNULL(wrk->vbc, VBC_MAGIC); - if (!wrk->vbc->backend) + CHECK_OBJ_NOTNULL(vbc, VBC_MAGIC); + if (!vbc->backend) return; - CHECK_OBJ_NOTNULL(wrk->vbc->backend, BACKEND_MAGIC); + CHECK_OBJ_NOTNULL(vbc->backend, BACKEND_MAGIC); if (!sp->wrk->objcore) return; CHECK_OBJ_NOTNULL(sp->wrk->objcore, OBJCORE_MAGIC); @@ -159,8 +163,8 @@ VRT_l_beresp_saintmode(const struct sess *sp, double a) * timeout at a later date (ie: sort by which entry will time out * from the list */ - Lck_Lock(&wrk->vbc->backend->mtx); - VTAILQ_FOREACH_SAFE(tr, &wrk->vbc->backend->troublelist, list, tr2) { + Lck_Lock(&vbc->backend->mtx); + VTAILQ_FOREACH_SAFE(tr, &vbc->backend->troublelist, list, tr2) { if (tr->timeout < new->timeout) { VTAILQ_INSERT_BEFORE(tr, new, list); new = NULL; @@ -172,9 +176,9 @@ VRT_l_beresp_saintmode(const struct sess *sp, double a) * items have a longer timeout. */ if (new) - VTAILQ_INSERT_TAIL(&wrk->vbc->backend->troublelist, new, list); + VTAILQ_INSERT_TAIL(&vbc->backend->troublelist, new, list); - Lck_Unlock(&wrk->vbc->backend->mtx); + Lck_Unlock(&vbc->backend->mtx); } /*--------------------------------------------------------------------*/ @@ -253,8 +257,8 @@ VRT_r_beresp_backend_name(const struct sess *sp) { CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->wrk->vbc, VBC_MAGIC); - return(sp->wrk->vbc->backend->vcl_name); + CHECK_OBJ_NOTNULL(sp->wrk->busyobj->vbc, VBC_MAGIC); + return(sp->wrk->busyobj->vbc->backend->vcl_name); } struct sockaddr_storage * @@ -262,8 +266,8 @@ VRT_r_beresp_backend_ip(const struct sess *sp) { CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->wrk->vbc, VBC_MAGIC); - return(sp->wrk->vbc->addr); + CHECK_OBJ_NOTNULL(sp->wrk->busyobj->vbc, VBC_MAGIC); + return(sp->wrk->busyobj->vbc->addr); } int @@ -271,8 +275,8 @@ VRT_r_beresp_backend_port(const struct sess *sp) { CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); - CHECK_OBJ_NOTNULL(sp->wrk->vbc, VBC_MAGIC); - return (VTCP_port(sp->wrk->vbc->addr)); + CHECK_OBJ_NOTNULL(sp->wrk->busyobj->vbc, VBC_MAGIC); + return (VTCP_port(sp->wrk->busyobj->vbc->addr)); } const char * __match_proto__() diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c index 2748999..5de0e27 100644 --- a/bin/varnishd/storage/stevedore.c +++ b/bin/varnishd/storage/stevedore.c @@ -131,7 +131,7 @@ stv_pick_stevedore(struct worker *wrk, const char **hint) return (stv_transient); /* Hint was not valid, nuke it */ - WSL(wrk, SLT_Debug, 0, /* XXX VSL_id ?? */ + WSL(wrk, SLT_Debug, 0, /* XXX VSL_id ?? */ "Storage hint not usable"); *hint = NULL; } From phk at varnish-cache.org Mon Dec 5 22:02:54 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 05 Dec 2011 23:02:54 +0100 Subject: [master] d763ce0 Tell FlexeLint to check printf-like arguments and fix what it found. Message-ID: commit d763ce00fb8599e52b1c06e99b91f257dc1bf822 Author: Poul-Henning Kamp Date: Mon Dec 5 22:02:22 2011 +0000 Tell FlexeLint to check printf-like arguments and fix what it found. Prompted to by: DocWilco diff --git a/bin/flint.lnt b/bin/flint.lnt index 4ad63d1..18a8d27 100644 --- a/bin/flint.lnt +++ b/bin/flint.lnt @@ -2,6 +2,9 @@ -ffc // No automatic custody +-printf(2, VSB_printf) + + /////////////////////////////////////////////////////////////////////// // Weirdness relating to varnish includes etc. diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index ca2b616..2badb76 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -77,7 +77,7 @@ struct ban { unsigned magic; #define BAN_MAGIC 0x700b08ea VTAILQ_ENTRY(ban) list; - unsigned refcount; + int refcount; unsigned flags; #define BAN_F_GONE (1 << 0) #define BAN_F_REQ (1 << 2) @@ -841,7 +841,7 @@ ban_lurker_work(const struct sess *sp, unsigned pass) break; CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); if (cache_param->diag_bitmap & 0x80000) - VSL(SLT_Debug, 0, "test: %p %d %d", + VSL(SLT_Debug, 0, "test: %p %u %u", oc, oc->flags & OC_F_LURK, pass); if ((oc->flags & OC_F_LURK) == pass) break; @@ -892,7 +892,7 @@ ban_lurker_work(const struct sess *sp, unsigned pass) } Lck_Unlock(&oh->mtx); if (cache_param->diag_bitmap & 0x80000) - VSL(SLT_Debug, 0, "lurker done: %p %d %d", + VSL(SLT_Debug, 0, "lurker done: %p %u %u", oc, oc->flags & OC_F_LURK, pass); (void)HSH_Deref(sp->wrk, NULL, &o); VTIM_sleep(cache_param->ban_lurker_sleep); diff --git a/bin/varnishd/cache/cache_cli.c b/bin/varnishd/cache/cache_cli.c index f299bef..98d89c3 100644 --- a/bin/varnishd/cache/cache_cli.c +++ b/bin/varnishd/cache/cache_cli.c @@ -92,7 +92,7 @@ cli_cb_after(const struct cli *cli) ASSERT_CLI(); Lck_Unlock(&cli_mtx); - VSL(SLT_CLI, 0, "Wr %03u %u %s", + VSL(SLT_CLI, 0, "Wr %03u %zd %s", cli->result, VSB_len(cli->sb), VSB_data(cli->sb)); } diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index 6483a99..5da06a7 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -565,7 +565,7 @@ FetchBody(struct worker *w, struct object *obj) w->busyobj->fetch_obj = NULL; - WSLB(w, SLT_Fetch_Body, "%u(%s) cls %d mklen %u", + WSLB(w, SLT_Fetch_Body, "%u(%s) cls %d mklen %d", w->busyobj->body_status, body_status(w->busyobj->body_status), cls, mklen); @@ -591,7 +591,7 @@ FetchBody(struct worker *w, struct object *obj) if (cls == 0 && w->busyobj->should_close) cls = 1; - WSLB(w, SLT_Length, "%u", obj->len); + WSLB(w, SLT_Length, "%zd", obj->len); { /* Sanity check fetch methods accounting */ diff --git a/bin/varnishd/cache/cache_http.c b/bin/varnishd/cache/cache_http.c index 784eb28..267af00 100644 --- a/bin/varnishd/cache/cache_http.c +++ b/bin/varnishd/cache/cache_http.c @@ -520,7 +520,7 @@ http_dissect_hdrs(struct worker *w, struct http *hp, unsigned vsl_id, char *p, if (q - p > htc->maxhdr) { VSC_C_main->losthdr++; WSL(w, SLT_LostHeader, vsl_id, "%.*s", - q - p > 20 ? 20 : q - p, p); + (int)(q - p > 20 ? 20 : q - p), p); return (413); } @@ -546,7 +546,7 @@ http_dissect_hdrs(struct worker *w, struct http *hp, unsigned vsl_id, char *p, } else { VSC_C_main->losthdr++; WSL(w, SLT_LostHeader, vsl_id, "%.*s", - q - p > 20 ? 20 : q - p, p); + (int)(q - p > 20 ? 20 : q - p), p); return (413); } } diff --git a/bin/varnishd/cache/cache_lck.c b/bin/varnishd/cache/cache_lck.c index d74e31a..78b5e42 100644 --- a/bin/varnishd/cache/cache_lck.c +++ b/bin/varnishd/cache/cache_lck.c @@ -114,7 +114,7 @@ Lck__Trylock(struct lock *lck, const char *p, const char *f, int l) assert(r == 0 || r == EBUSY); if (cache_param->diag_bitmap & 0x8) VSL(SLT_Debug, 0, - "MTX_TRYLOCK(%s,%s,%d,%s) = %d", p, f, l, ilck->w); + "MTX_TRYLOCK(%s,%s,%d,%s) = %d", p, f, l, ilck->w, r); if (r == 0) { AZ(ilck->held); ilck->held = 1; diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c index 923abbd..9fa14e0 100644 --- a/bin/varnishd/cache/cache_panic.c +++ b/bin/varnishd/cache/cache_panic.c @@ -234,7 +234,7 @@ pan_sess(const struct sess *sp) VSB_printf(pan_vsp, "sp = %p {\n", sp); VSB_printf(pan_vsp, - " fd = %d, id = %d, xid = %u,\n", + " fd = %d, id = %u, xid = %u,\n", sp->fd, sp->vsl_id & VSL_IDENTMASK, sp->xid); VSB_printf(pan_vsp, " client = %s %s,\n", sp->addr ? sp->addr : "?.?.?.?", diff --git a/bin/varnishd/cache/cache_vary.c b/bin/varnishd/cache/cache_vary.c index 026f937..f55607b 100644 --- a/bin/varnishd/cache/cache_vary.c +++ b/bin/varnishd/cache/cache_vary.c @@ -64,7 +64,7 @@ VRY_Create(const struct sess *sp, const struct http *hp) { char *v, *p, *q, *h, *e; struct vsb *sb, *sbh; - int l; + unsigned l; /* No Vary: header, no worries */ if (!http_GetHdr(hp, H_Vary, &v)) @@ -109,7 +109,7 @@ VRY_Create(const struct sess *sp, const struct http *hp) e = h; l = 0xffff; } - VSB_printf(sb, "%c%c", (unsigned)l >> 8, l & 0xff); + VSB_printf(sb, "%c%c", (int)(l >> 8), (int)(l & 0xff)); /* Append to vary matching string */ VSB_bcat(sb, VSB_data(sbh), VSB_len(sbh)); if (e != h) diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c index a0eb4c8..bbf93b5 100644 --- a/bin/varnishd/cache/cache_vrt.c +++ b/bin/varnishd/cache/cache_vrt.c @@ -74,7 +74,7 @@ VRT_count(const struct sess *sp, unsigned u) return; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); if (cache_param->vcl_trace) - WSP(sp, SLT_VCL_trace, "%u %d.%d", u, + WSP(sp, SLT_VCL_trace, "%u %u.%u", u, sp->vcl->ref[u].line, sp->vcl->ref[u].pos); } @@ -83,7 +83,8 @@ VRT_count(const struct sess *sp, unsigned u) void VRT_acl_log(const struct sess *sp, const char *msg) { - WSP(sp, SLT_VCL_acl, msg); + + WSP(sp, SLT_VCL_acl, "%s", msg); } /*--------------------------------------------------------------------*/ @@ -416,7 +417,7 @@ VRT_synth_page(const struct sess *sp, unsigned flags, const char *str, ...) SMS_Finish(sp->wrk->obj); http_Unset(sp->wrk->obj->http, H_Content_Length); http_PrintfHeader(sp->wrk, sp->vsl_id, sp->wrk->obj->http, - "Content-Length: %d", sp->wrk->obj->len); + "Content-Length: %zd", sp->wrk->obj->len); } /*--------------------------------------------------------------------*/ diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c index fea5c70..cb54837 100644 --- a/bin/varnishd/cache/cache_vrt_var.c +++ b/bin/varnishd/cache/cache_vrt_var.c @@ -55,7 +55,7 @@ vrt_do_string(struct worker *w, int fd, const struct http *hp, int fld, AN(hp); b = VRT_String(hp->ws, NULL, p, ap); if (b == NULL || *b == '\0') { - WSL(w, SLT_LostHeader, fd, err); + WSL(w, SLT_LostHeader, fd, "%s", err); } else { http_SetH(hp, fld, b); } diff --git a/bin/varnishd/cache/cache_wrw.c b/bin/varnishd/cache/cache_wrw.c index 2160f69..2ffb45e 100644 --- a/bin/varnishd/cache/cache_wrw.c +++ b/bin/varnishd/cache/cache_wrw.c @@ -165,7 +165,7 @@ WRW_Flush(struct worker *w) if (i <= 0) { wrw->werr++; WSL(w, SLT_Debug, *wrw->wfd, - "Write error, retval = %d, len = %d, errno = %s", + "Write error, retval = %zd, len = %zd, errno = %s", i, wrw->liov, strerror(errno)); } } diff --git a/bin/varnishd/flint.lnt b/bin/varnishd/flint.lnt index ec0d955..1942c63 100644 --- a/bin/varnishd/flint.lnt +++ b/bin/varnishd/flint.lnt @@ -1,5 +1,11 @@ -d__flexelint_v9__=1 +-printf(3, VSL) +-printf(4, http_PrintfHeader) +-printf(4, WSL) +-printf(3, WSLB) +-printf(2, VSB_printf) + -esym(755, vct_*) -esym(759, vev_*) -esym(765, vev_*) diff --git a/lib/libvcl/vcc_compile.h b/lib/libvcl/vcc_compile.h index 8088509..b67e4ca 100644 --- a/lib/libvcl/vcc_compile.h +++ b/lib/libvcl/vcc_compile.h @@ -308,7 +308,7 @@ void vcc_ErrToken(const struct vcc *tl, const struct token *t); void vcc_ErrWhere(struct vcc *, const struct token *); void vcc_ErrWhere2(struct vcc *, const struct token *, const struct token *); -void vcc__Expect(struct vcc *tl, unsigned tok, int line); +void vcc__Expect(struct vcc *tl, unsigned tok, unsigned line); int vcc_Teq(const struct token *t1, const struct token *t2); int vcc_IdIs(const struct token *t, const char *p); void vcc_ExpectCid(struct vcc *tl); diff --git a/lib/libvcl/vcc_token.c b/lib/libvcl/vcc_token.c index 63ebbf3..26f2545 100644 --- a/lib/libvcl/vcc_token.c +++ b/lib/libvcl/vcc_token.c @@ -104,7 +104,7 @@ vcc_icoord(struct vsb *vsb, const struct token *t, int tail) } else pos++; } - VSB_printf(vsb, "('%s' Line %d Pos %d)", t->src->name, lin, pos + 1); + VSB_printf(vsb, "('%s' Line %u Pos %u)", t->src->name, lin, pos + 1); } /*--------------------------------------------------------------------*/ @@ -261,7 +261,7 @@ vcc_NextToken(struct vcc *tl) } void -vcc__Expect(struct vcc *tl, unsigned tok, int line) +vcc__Expect(struct vcc *tl, unsigned tok, unsigned line) { if (tl->t->tok == tok) return; From phk at varnish-cache.org Tue Dec 6 07:57:22 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 08:57:22 +0100 Subject: [master] 691dcc6 Minor polish Message-ID: commit 691dcc69855ebe00fb9bdf5c9dd3ec2e5e4a816d Author: Poul-Henning Kamp Date: Tue Dec 6 07:57:13 2011 +0000 Minor polish diff --git a/bin/varnishd/cache/cache_gzip.c b/bin/varnishd/cache/cache_gzip.c index cf07e1d..061348a 100644 --- a/bin/varnishd/cache/cache_gzip.c +++ b/bin/varnishd/cache/cache_gzip.c @@ -197,9 +197,9 @@ VGZ_NewGzip(struct worker *wrk, const char *id) */ i = deflateInit2(&vg->vz, cache_param->gzip_level, /* Level */ - Z_DEFLATED, /* Method */ + Z_DEFLATED, /* Method */ 16 + cache_param->gzip_window, /* Window bits (16=gzip + 15) */ - cache_param->gzip_memlevel, /* memLevel */ + cache_param->gzip_memlevel, /* memLevel */ Z_DEFAULT_STRATEGY); assert(Z_OK == i); return (vg); @@ -252,11 +252,11 @@ VGZ_ObufFull(const struct vgz *vg) */ int -VGZ_ObufStorage(struct worker *w, struct vgz *vg) +VGZ_ObufStorage(struct worker *wrk, struct vgz *vg) { struct storage *st; - st = FetchStorage(w, 0); + st = FetchStorage(wrk, 0); if (st == NULL) return (-1); @@ -349,7 +349,7 @@ VGZ_Gzip(struct vgz *vg, const void **pptr, size_t *plen, enum vgz_flag flags) */ int -VGZ_WrwGunzip(struct worker *w, struct vgz *vg, const void *ibuf, +VGZ_WrwGunzip(struct worker *wrk, struct vgz *vg, const void *ibuf, ssize_t ibufl, char *obuf, ssize_t obufl, ssize_t *obufp) { int i; @@ -374,9 +374,9 @@ VGZ_WrwGunzip(struct worker *w, struct vgz *vg, const void *ibuf, return (-1); } if (obufl == *obufp || i == VGZ_STUCK) { - w->acct_tmp.bodybytes += *obufp; - (void)WRW_Write(w, obuf, *obufp); - (void)WRW_Flush(w); + wrk->acct_tmp.bodybytes += *obufp; + (void)WRW_Write(wrk, obuf, *obufp); + (void)WRW_Flush(wrk); *obufp = 0; VGZ_Obuf(vg, obuf + *obufp, obufl - *obufp); } @@ -400,7 +400,7 @@ VGZ_UpdateObj(const struct vgz *vg, struct object *obj) } /*-------------------------------------------------------------------- - * Passing a vsl_id of -1 means "use w->vbc->vsl_id" + * Passing a vsl_id of -1 means "use wrk->vbc->vsl_id" */ int @@ -454,15 +454,17 @@ VGZ_Destroy(struct vgz **vgp, int vsl_id) */ static void __match_proto__() -vfp_gunzip_begin(struct worker *w, size_t estimate) +vfp_gunzip_begin(struct worker *wrk, size_t estimate) { (void)estimate; - AZ(w->busyobj->vgz_rx); - w->busyobj->vgz_rx = VGZ_NewUngzip(w, "U F -"); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AZ(wrk->busyobj->vgz_rx); + wrk->busyobj->vgz_rx = VGZ_NewUngzip(wrk, "U F -"); } static int __match_proto__() -vfp_gunzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_gunzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { struct vgz *vg; ssize_t l, wl; @@ -471,8 +473,10 @@ vfp_gunzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) size_t dl; const void *dp; - AZ(w->busyobj->fetch_failed); - vg = w->busyobj->vgz_rx; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AZ(wrk->busyobj->fetch_failed); + vg = wrk->busyobj->vgz_rx; CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); AZ(vg->vz.avail_in); while (bytes > 0 || vg->vz.avail_in > 0) { @@ -480,40 +484,42 @@ vfp_gunzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) l = sizeof ibuf; if (l > bytes) l = bytes; - wl = HTC_Read(w, htc, ibuf, l); + wl = HTC_Read(wrk, htc, ibuf, l); if (wl <= 0) return (wl); VGZ_Ibuf(vg, ibuf, wl); bytes -= wl; } - if (VGZ_ObufStorage(w, vg)) + if (VGZ_ObufStorage(wrk, vg)) return(-1); i = VGZ_Gunzip(vg, &dp, &dl); if (i != VGZ_OK && i != VGZ_END) - return(FetchError(w, "Gunzip data error")); - w->busyobj->fetch_obj->len += dl; - if (w->busyobj->do_stream) - RES_StreamPoll(w); + return(FetchError(wrk, "Gunzip data error")); + wrk->busyobj->fetch_obj->len += dl; + if (wrk->busyobj->do_stream) + RES_StreamPoll(wrk); } assert(i == Z_OK || i == Z_STREAM_END); return (1); } static int __match_proto__() -vfp_gunzip_end(struct worker *w) +vfp_gunzip_end(struct worker *wrk) { struct vgz *vg; - vg = w->busyobj->vgz_rx; - w->busyobj->vgz_rx = NULL; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vg = wrk->busyobj->vgz_rx; + wrk->busyobj->vgz_rx = NULL; CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); - if (w->busyobj->fetch_failed) { + if (wrk->busyobj->fetch_failed) { (void)VGZ_Destroy(&vg, -1); return(0); } if (VGZ_Destroy(&vg, -1) != VGZ_END) - return(FetchError(w, "Gunzip error at the very end")); + return(FetchError(wrk, "Gunzip error at the very end")); return (0); } @@ -531,16 +537,18 @@ struct vfp vfp_gunzip = { */ static void __match_proto__() -vfp_gzip_begin(struct worker *w, size_t estimate) +vfp_gzip_begin(struct worker *wrk, size_t estimate) { (void)estimate; - AZ(w->busyobj->vgz_rx); - w->busyobj->vgz_rx = VGZ_NewGzip(w, "G F -"); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AZ(wrk->busyobj->vgz_rx); + wrk->busyobj->vgz_rx = VGZ_NewGzip(wrk, "G F -"); } static int __match_proto__() -vfp_gzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_gzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { struct vgz *vg; ssize_t l, wl; @@ -549,8 +557,10 @@ vfp_gzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) size_t dl; const void *dp; - AZ(w->busyobj->fetch_failed); - vg = w->busyobj->vgz_rx; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AZ(wrk->busyobj->fetch_failed); + vg = wrk->busyobj->vgz_rx; CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); AZ(vg->vz.avail_in); while (bytes > 0 || !VGZ_IbufEmpty(vg)) { @@ -558,50 +568,52 @@ vfp_gzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) l = sizeof ibuf; if (l > bytes) l = bytes; - wl = HTC_Read(w, htc, ibuf, l); + wl = HTC_Read(wrk, htc, ibuf, l); if (wl <= 0) return (wl); VGZ_Ibuf(vg, ibuf, wl); bytes -= wl; } - if (VGZ_ObufStorage(w, vg)) + if (VGZ_ObufStorage(wrk, vg)) return(-1); i = VGZ_Gzip(vg, &dp, &dl, VGZ_NORMAL); assert(i == Z_OK); - w->busyobj->fetch_obj->len += dl; - if (w->busyobj->do_stream) - RES_StreamPoll(w); + wrk->busyobj->fetch_obj->len += dl; + if (wrk->busyobj->do_stream) + RES_StreamPoll(wrk); } return (1); } static int __match_proto__() -vfp_gzip_end(struct worker *w) +vfp_gzip_end(struct worker *wrk) { struct vgz *vg; size_t dl; const void *dp; int i; - vg = w->busyobj->vgz_rx; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vg = wrk->busyobj->vgz_rx; CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); - w->busyobj->vgz_rx = NULL; - if (w->busyobj->fetch_failed) { + wrk->busyobj->vgz_rx = NULL; + if (wrk->busyobj->fetch_failed) { (void)VGZ_Destroy(&vg, -1); return(0); } do { VGZ_Ibuf(vg, "", 0); - if (VGZ_ObufStorage(w, vg)) + if (VGZ_ObufStorage(wrk, vg)) return(-1); i = VGZ_Gzip(vg, &dp, &dl, VGZ_FINISH); - w->busyobj->fetch_obj->len += dl; + wrk->busyobj->fetch_obj->len += dl; } while (i != Z_STREAM_END); - if (w->busyobj->do_stream) - RES_StreamPoll(w); - VGZ_UpdateObj(vg, w->busyobj->fetch_obj); + if (wrk->busyobj->do_stream) + RES_StreamPoll(wrk); + VGZ_UpdateObj(vg, wrk->busyobj->fetch_obj); if (VGZ_Destroy(&vg, -1) != VGZ_END) - return(FetchError(w, "Gzip error at the very end")); + return(FetchError(wrk, "Gzip error at the very end")); return (0); } @@ -619,15 +631,17 @@ struct vfp vfp_gzip = { */ static void __match_proto__() -vfp_testgzip_begin(struct worker *w, size_t estimate) +vfp_testgzip_begin(struct worker *wrk, size_t estimate) { + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); (void)estimate; - w->busyobj->vgz_rx = VGZ_NewUngzip(w, "u F -"); - CHECK_OBJ_NOTNULL(w->busyobj->vgz_rx, VGZ_MAGIC); + wrk->busyobj->vgz_rx = VGZ_NewUngzip(wrk, "u F -"); + CHECK_OBJ_NOTNULL(wrk->busyobj->vgz_rx, VGZ_MAGIC); } static int __match_proto__() -vfp_testgzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_testgzip_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { struct vgz *vg; ssize_t l, wl; @@ -637,34 +651,36 @@ vfp_testgzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) const void *dp; struct storage *st; - AZ(w->busyobj->fetch_failed); - vg = w->busyobj->vgz_rx; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AZ(wrk->busyobj->fetch_failed); + vg = wrk->busyobj->vgz_rx; CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); AZ(vg->vz.avail_in); while (bytes > 0) { - st = FetchStorage(w, 0); + st = FetchStorage(wrk, 0); if (st == NULL) return(-1); l = st->space - st->len; if (l > bytes) l = bytes; - wl = HTC_Read(w, htc, st->ptr + st->len, l); + wl = HTC_Read(wrk, htc, st->ptr + st->len, l); if (wl <= 0) return (wl); bytes -= wl; VGZ_Ibuf(vg, st->ptr + st->len, wl); st->len += wl; - w->busyobj->fetch_obj->len += wl; - if (w->busyobj->do_stream) - RES_StreamPoll(w); + wrk->busyobj->fetch_obj->len += wl; + if (wrk->busyobj->do_stream) + RES_StreamPoll(wrk); while (!VGZ_IbufEmpty(vg)) { VGZ_Obuf(vg, obuf, sizeof obuf); i = VGZ_Gunzip(vg, &dp, &dl); if (i == VGZ_END && !VGZ_IbufEmpty(vg)) - return(FetchError(w, "Junk after gzip data")); + return(FetchError(wrk, "Junk after gzip data")); if (i != VGZ_OK && i != VGZ_END) - return(FetchError2(w, + return(FetchError2(wrk, "Invalid Gzip data", vg->vz.msg)); } } @@ -673,20 +689,22 @@ vfp_testgzip_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) } static int __match_proto__() -vfp_testgzip_end(struct worker *w) +vfp_testgzip_end(struct worker *wrk) { struct vgz *vg; - vg = w->busyobj->vgz_rx; - w->busyobj->vgz_rx = NULL; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vg = wrk->busyobj->vgz_rx; + wrk->busyobj->vgz_rx = NULL; CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC); - if (w->busyobj->fetch_failed) { + if (wrk->busyobj->fetch_failed) { (void)VGZ_Destroy(&vg, -1); return(0); } - VGZ_UpdateObj(vg, w->busyobj->fetch_obj); + VGZ_UpdateObj(vg, wrk->busyobj->fetch_obj); if (VGZ_Destroy(&vg, -1) != VGZ_END) - return(FetchError(w, "TestGunzip error at the very end")); + return(FetchError(wrk, "TestGunzip error at the very end")); return (0); } From phk at varnish-cache.org Tue Dec 6 08:09:59 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 09:09:59 +0100 Subject: [master] 6ac5644 Code polishing Message-ID: commit 6ac5644bc8610840b59e52f183eed533c73f65d1 Author: Poul-Henning Kamp Date: Tue Dec 6 08:09:50 2011 +0000 Code polishing diff --git a/bin/varnishd/cache/cache_wrw.c b/bin/varnishd/cache/cache_wrw.c index 2ffb45e..96fa3e5 100644 --- a/bin/varnishd/cache/cache_wrw.c +++ b/bin/varnishd/cache/cache_wrw.c @@ -57,19 +57,19 @@ */ int -WRW_Error(const struct worker *w) +WRW_Error(const struct worker *wrk) { - return (w->wrw.werr); + return (wrk->wrw.werr); } void -WRW_Reserve(struct worker *w, int *fd) +WRW_Reserve(struct worker *wrk, int *fd) { struct wrw *wrw; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; AZ(wrw->wfd); wrw->werr = 0; wrw->liov = 0; @@ -79,12 +79,12 @@ WRW_Reserve(struct worker *w, int *fd) } static void -WRW_Release(struct worker *w) +WRW_Release(struct worker *wrk) { struct wrw *wrw; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; AN(wrw->wfd); wrw->werr = 0; wrw->liov = 0; @@ -93,15 +93,39 @@ WRW_Release(struct worker *w) wrw->wfd = NULL; } +static void +wrw_prune(struct wrw *wrw, ssize_t bytes) +{ + ssize_t used = 0; + ssize_t j, used_here; + + for (j = 0; j < wrw->niov; j++) { + if (used + wrw->iov[j].iov_len > bytes) { + /* Cutoff is in this iov */ + used_here = bytes - used; + wrw->iov[j].iov_len -= used_here; + wrw->iov[j].iov_base = + (char*)wrw->iov[j].iov_base + used_here; + memmove(wrw->iov, &wrw->iov[j], + (wrw->niov - j) * sizeof(struct iovec)); + wrw->niov -= j; + wrw->liov -= bytes; + return; + } + used += wrw->iov[j].iov_len; + } + assert(wrw->liov == 0); +} + unsigned -WRW_Flush(struct worker *w) +WRW_Flush(struct worker *wrk) { ssize_t i; struct wrw *wrw; char cbuf[32]; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; AN(wrw->wfd); /* For chunked, there must be one slot reserved for the chunked tail */ @@ -110,7 +134,8 @@ WRW_Flush(struct worker *w) if (*wrw->wfd >= 0 && wrw->liov > 0 && wrw->werr == 0) { if (wrw->ciov < wrw->siov && wrw->cliov > 0) { - bprintf(cbuf, "00%jx\r\n", (intmax_t)wrw->cliov); + /* Add chunk head & tail */ + bprintf(cbuf, "00%zx\r\n", wrw->cliov); i = strlen(cbuf); wrw->iov[wrw->ciov].iov_base = cbuf; wrw->iov[wrw->ciov].iov_len = i; @@ -123,48 +148,37 @@ WRW_Flush(struct worker *w) wrw->iov[wrw->ciov].iov_base = cbuf; wrw->iov[wrw->ciov].iov_len = 0; } + i = writev(*wrw->wfd, wrw->iov, wrw->niov); while (i != wrw->liov && i > 0) { /* Remove sent data from start of I/O vector, * then retry; we hit a timeout, but some data * was sent. - - XXX: Add a "minimum sent data per timeout - counter to prevent slowlaris attacks + * + * XXX: Add a "minimum sent data per timeout + * counter to prevent slowlaris attacks */ - size_t used = 0; - if (VTIM_real() - w->sp->t_resp > cache_param->send_timeout) { - WSL(w, SLT_Debug, *wrw->wfd, - "Hit total send timeout, wrote = %ld/%ld; not retrying", + if (VTIM_real() - wrk->sp->t_resp > + cache_param->send_timeout) { + WSL(wrk, SLT_Debug, *wrw->wfd, + "Hit total send timeout, " + "wrote = %ld/%ld; not retrying", i, wrw->liov); i = -1; break; } - WSL(w, SLT_Debug, *wrw->wfd, + WSL(wrk, SLT_Debug, *wrw->wfd, "Hit send timeout, wrote = %ld/%ld; retrying", i, wrw->liov); - for (int j = 0; j < wrw->niov; j++) { - if (used + wrw->iov[j].iov_len > i) { - /* Cutoff is in this iov */ - int used_here = i - used; - wrw->iov[j].iov_len -= used_here; - wrw->iov[j].iov_base = (char*)wrw->iov[j].iov_base + used_here; - memmove(wrw->iov, &wrw->iov[j], - (wrw->niov - j) * sizeof(struct iovec)); - wrw->niov -= j; - wrw->liov -= i; - break; - } - used += wrw->iov[j].iov_len; - } + wrw_prune(wrw, i); i = writev(*wrw->wfd, wrw->iov, wrw->niov); } if (i <= 0) { wrw->werr++; - WSL(w, SLT_Debug, *wrw->wfd, + WSL(wrk, SLT_Debug, *wrw->wfd, "Write error, retval = %zd, len = %zd, errno = %s", i, wrw->liov, strerror(errno)); } @@ -178,48 +192,48 @@ WRW_Flush(struct worker *w) } unsigned -WRW_FlushRelease(struct worker *w) +WRW_FlushRelease(struct worker *wrk) { unsigned u; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - AN(w->wrw.wfd); - u = WRW_Flush(w); - WRW_Release(w); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + AN(wrk->wrw.wfd); + u = WRW_Flush(wrk); + WRW_Release(wrk); return (u); } unsigned -WRW_WriteH(struct worker *w, const txt *hh, const char *suf) +WRW_WriteH(struct worker *wrk, const txt *hh, const char *suf) { unsigned u; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - AN(w->wrw.wfd); - AN(w); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + AN(wrk->wrw.wfd); + AN(wrk); AN(hh); AN(hh->b); AN(hh->e); - u = WRW_Write(w, hh->b, hh->e - hh->b); + u = WRW_Write(wrk, hh->b, hh->e - hh->b); if (suf != NULL) - u += WRW_Write(w, suf, -1); + u += WRW_Write(wrk, suf, -1); return (u); } unsigned -WRW_Write(struct worker *w, const void *ptr, int len) +WRW_Write(struct worker *wrk, const void *ptr, int len) { struct wrw *wrw; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; AN(wrw->wfd); if (len == 0 || *wrw->wfd < 0) return (0); if (len == -1) len = strlen(ptr); if (wrw->niov >= wrw->siov - (wrw->ciov < wrw->siov ? 1 : 0)) - (void)WRW_Flush(w); + (void)WRW_Flush(wrk); wrw->iov[wrw->niov].iov_base = TRUST_ME(ptr); wrw->iov[wrw->niov].iov_len = len; wrw->liov += len; @@ -232,12 +246,12 @@ WRW_Write(struct worker *w, const void *ptr, int len) } void -WRW_Chunked(struct worker *w) +WRW_Chunked(struct worker *wrk) { struct wrw *wrw; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; assert(wrw->ciov == wrw->siov); /* @@ -245,7 +259,7 @@ WRW_Chunked(struct worker *w) * a chunk tail, we might as well flush right away. */ if (wrw->niov + 3 >= wrw->siov) - (void)WRW_Flush(w); + (void)WRW_Flush(wrk); wrw->ciov = wrw->niov++; wrw->cliov = 0; assert(wrw->ciov < wrw->siov); @@ -260,30 +274,30 @@ WRW_Chunked(struct worker *w) */ void -WRW_EndChunk(struct worker *w) +WRW_EndChunk(struct worker *wrk) { struct wrw *wrw; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; assert(wrw->ciov < wrw->siov); - (void)WRW_Flush(w); + (void)WRW_Flush(wrk); wrw->ciov = wrw->siov; wrw->niov = 0; wrw->cliov = 0; - (void)WRW_Write(w, "0\r\n\r\n", -1); + (void)WRW_Write(wrk, "0\r\n\r\n", -1); } #ifdef SENDFILE_WORKS void -WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len) +WRW_Sendfile(struct worker *wrk, int fd, off_t off, unsigned len) { struct wrw *wrw; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - wrw = &w->wrw; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + wrw = &wrk->wrw; AN(wrw->wfd); assert(fd >= 0); assert(len > 0); @@ -303,7 +317,7 @@ WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len) } while (0); #elif defined(__linux__) do { - if (WRW_Flush(w) == 0 && + if (WRW_Flush(wrk) == 0 && sendfile(*wrw->wfd, fd, &off, len) != len) wrw->werr++; } while (0); @@ -332,7 +346,7 @@ WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len) } while (0); #elif defined(__sun) && defined(HAVE_SENDFILE) do { - if (WRW_Flush(w) == 0 && + if (WRW_Flush(wrk) == 0 && sendfile(*wrw->wfd, fd, &off, len) != len) wrw->werr++; } while (0); From phk at varnish-cache.org Tue Dec 6 08:19:13 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 09:19:13 +0100 Subject: [master] 6d66ab6 Minor polishing Message-ID: commit 6d66ab671ceaa31e719e868f235bd4833666e0c8 Author: Poul-Henning Kamp Date: Tue Dec 6 08:19:05 2011 +0000 Minor polishing diff --git a/bin/varnishd/cache/cache_esi_parse.c b/bin/varnishd/cache/cache_esi_parse.c index 71ec16d..41992ab 100644 --- a/bin/varnishd/cache/cache_esi_parse.c +++ b/bin/varnishd/cache/cache_esi_parse.c @@ -86,7 +86,7 @@ struct vep_state { uint32_t crcp; ssize_t o_last; -const char *hack_p; + const char *hack_p; const char *ver_p; const char *until; @@ -548,16 +548,16 @@ vep_do_include(struct vep_state *vep, enum dowhat what) */ void -VEP_Parse(const struct worker *w, const char *p, size_t l) +VEP_Parse(const struct worker *wrk, const char *p, size_t l) { struct vep_state *vep; const char *e; struct vep_match *vm; int i; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - vep = w->busyobj->vep; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vep = wrk->busyobj->vep; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); assert(l > 0); @@ -980,13 +980,13 @@ VEP_Parse(const struct worker *w, const char *p, size_t l) */ static ssize_t __match_proto__() -vep_default_cb(struct worker *w, ssize_t l, enum vgz_flag flg) +vep_default_cb(struct worker *wrk, ssize_t l, enum vgz_flag flg) { struct vep_state *vep; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - vep = w->busyobj->vep; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vep = wrk->busyobj->vep; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); (void)flg; vep->cb_x += l; @@ -997,22 +997,20 @@ vep_default_cb(struct worker *w, ssize_t l, enum vgz_flag flg) */ void -VEP_Init(struct worker *w, vep_callback_t *cb) +VEP_Init(struct worker *wrk, vep_callback_t *cb) { struct vep_state *vep; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - AZ(w->busyobj->vep); - vep = (void*)WS_Alloc(w->ws, sizeof *vep); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AZ(wrk->busyobj->vep); + vep = (void*)WS_Alloc(wrk->ws, sizeof *vep); AN(vep); - memset(vep, 0, sizeof *vep); - vep->magic = VEP_MAGIC; - vep->wrk = w; + vep->wrk = wrk; vep->vsb = VSB_new_auto(); AN(vep->vsb); - w->busyobj->vep = vep; + wrk->busyobj->vep = vep; if (cb != NULL) { vep->dogzip = 1; @@ -1043,14 +1041,14 @@ VEP_Init(struct worker *w, vep_callback_t *cb) */ struct vsb * -VEP_Finish(const struct worker *w) +VEP_Finish(const struct worker *wrk) { struct vep_state *vep; ssize_t l, lcb; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - vep = w->busyobj->vep; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vep = wrk->busyobj->vep; CHECK_OBJ_NOTNULL(vep, VEP_MAGIC); if (vep->o_pending) @@ -1061,8 +1059,7 @@ VEP_Finish(const struct worker *w) } (void)vep->cb(vep->wrk, 0, VGZ_FINISH); - w->busyobj->vep = NULL; - + wrk->busyobj->vep = NULL; AZ(VSB_finish(vep->vsb)); l = VSB_len(vep->vsb); if (vep->esi_found && l > 0) From phk at varnish-cache.org Tue Dec 6 08:40:02 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 09:40:02 +0100 Subject: [master] f178da1 More code polishing Message-ID: commit f178da155efe9d4b7a1f65bcca2557032b94f42b Author: Poul-Henning Kamp Date: Tue Dec 6 08:39:44 2011 +0000 More code polishing Revert two lines that got last in previous commit. diff --git a/bin/varnishd/cache/cache_esi_fetch.c b/bin/varnishd/cache/cache_esi_fetch.c index aea28ed..d2f4c01 100644 --- a/bin/varnishd/cache/cache_esi_fetch.c +++ b/bin/varnishd/cache/cache_esi_fetch.c @@ -44,7 +44,7 @@ */ static ssize_t -vef_read(struct worker *w, struct http_conn *htc, void *buf, ssize_t buflen, +vef_read(struct worker *wrk, struct http_conn *htc, void *buf, ssize_t buflen, ssize_t bytes) { ssize_t d; @@ -56,7 +56,7 @@ vef_read(struct worker *w, struct http_conn *htc, void *buf, ssize_t buflen, if (d < bytes) bytes = d; } - return (HTC_Read(w, htc, buf, bytes)); + return (HTC_Read(wrk, htc, buf, bytes)); } /*--------------------------------------------------------------------- @@ -64,24 +64,24 @@ vef_read(struct worker *w, struct http_conn *htc, void *buf, ssize_t buflen, */ static int -vfp_esi_bytes_uu(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_esi_bytes_uu(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { ssize_t wl; struct storage *st; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); while (bytes > 0) { - st = FetchStorage(w, 0); + st = FetchStorage(wrk, 0); if (st == NULL) return (-1); - wl = vef_read(w, htc, + wl = vef_read(wrk, htc, st->ptr + st->len, st->space - st->len, bytes); if (wl <= 0) return (wl); - VEP_Parse(w, (const char *)st->ptr + st->len, wl); + VEP_Parse(wrk, (const char *)st->ptr + st->len, wl); st->len += wl; - w->busyobj->fetch_obj->len += wl; + wrk->busyobj->fetch_obj->len += wl; bytes -= wl; } return (1); @@ -92,7 +92,7 @@ vfp_esi_bytes_uu(struct worker *w, struct http_conn *htc, ssize_t bytes) */ static int -vfp_esi_bytes_gu(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_esi_bytes_gu(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { struct vgz *vg; ssize_t wl; @@ -101,23 +101,23 @@ vfp_esi_bytes_gu(struct worker *w, struct http_conn *htc, ssize_t bytes) size_t dl; const void *dp; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - vg = w->busyobj->vgz_rx; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + vg = wrk->busyobj->vgz_rx; while (bytes > 0) { if (VGZ_IbufEmpty(vg) && bytes > 0) { - wl = vef_read(w, htc, ibuf, sizeof ibuf, bytes); + wl = vef_read(wrk, htc, ibuf, sizeof ibuf, bytes); if (wl <= 0) return (wl); VGZ_Ibuf(vg, ibuf, wl); bytes -= wl; } - if (VGZ_ObufStorage(w, vg)) + if (VGZ_ObufStorage(wrk, vg)) return(-1); i = VGZ_Gunzip(vg, &dp, &dl); xxxassert(i == VGZ_OK || i == VGZ_END); - VEP_Parse(w, dp, dl); - w->busyobj->fetch_obj->len += dl; + VEP_Parse(wrk, dp, dl); + wrk->busyobj->fetch_obj->len += dl; } return (1); } @@ -142,16 +142,16 @@ struct vef_priv { */ static ssize_t -vfp_vep_callback(struct worker *w, ssize_t l, enum vgz_flag flg) +vfp_vep_callback(struct worker *wrk, ssize_t l, enum vgz_flag flg) { struct vef_priv *vef; size_t dl, px; const void *dp; int i; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - vef = w->busyobj->vef_priv; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vef = wrk->busyobj->vef_priv; CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); assert(l >= 0); @@ -181,14 +181,14 @@ vfp_vep_callback(struct worker *w, ssize_t l, enum vgz_flag flg) l = 0; } do { - if (VGZ_ObufStorage(w, vef->vgz)) { + if (VGZ_ObufStorage(wrk, vef->vgz)) { vef->error = ENOMEM; vef->tot += l; return (vef->tot); } i = VGZ_Gzip(vef->vgz, &dp, &dl, flg); vef->tot += dl; - w->busyobj->fetch_obj->len += dl; + wrk->busyobj->fetch_obj->len += dl; } while (!VGZ_IbufEmpty(vef->vgz) || (flg != VGZ_NORMAL && VGZ_ObufFull(vef->vgz))); if (px != 0) { @@ -205,24 +205,24 @@ vfp_vep_callback(struct worker *w, ssize_t l, enum vgz_flag flg) } static int -vfp_esi_bytes_ug(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_esi_bytes_ug(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { ssize_t wl; char ibuf[cache_param->gzip_stack_buffer]; struct vef_priv *vef; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - vef = w->busyobj->vef_priv; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vef = wrk->busyobj->vef_priv; CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); while (bytes > 0) { - wl = vef_read(w, htc, ibuf, sizeof ibuf, bytes); + wl = vef_read(wrk, htc, ibuf, sizeof ibuf, bytes); if (wl <= 0) return (wl); bytes -= wl; vef->bufp = ibuf; - VEP_Parse(w, ibuf, wl); + VEP_Parse(wrk, ibuf, wl); assert(vef->bufp >= ibuf && vef->bufp <= ibuf + wl); if (vef->error) { errno = vef->error; @@ -243,7 +243,7 @@ vfp_esi_bytes_ug(struct worker *w, struct http_conn *htc, ssize_t bytes) */ static int -vfp_esi_bytes_gg(struct worker *w, struct http_conn *htc, size_t bytes) +vfp_esi_bytes_gg(struct worker *wrk, struct http_conn *htc, size_t bytes) { ssize_t wl; char ibuf[cache_param->gzip_stack_buffer]; @@ -253,29 +253,29 @@ vfp_esi_bytes_gg(struct worker *w, struct http_conn *htc, size_t bytes) const void *dp; int i; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - vef = w->busyobj->vef_priv; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + vef = wrk->busyobj->vef_priv; CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); assert(sizeof ibuf >= 1024); ibuf2[0] = 0; /* For Flexelint */ while (bytes > 0) { - wl = vef_read(w, htc, ibuf, sizeof ibuf, bytes); + wl = vef_read(wrk, htc, ibuf, sizeof ibuf, bytes); if (wl <= 0) return (wl); bytes -= wl; vef->bufp = ibuf; - VGZ_Ibuf(w->busyobj->vgz_rx, ibuf, wl); + VGZ_Ibuf(wrk->busyobj->vgz_rx, ibuf, wl); do { - VGZ_Obuf(w->busyobj->vgz_rx, ibuf2, sizeof ibuf2); - i = VGZ_Gunzip(w->busyobj->vgz_rx, &dp, &dl); + VGZ_Obuf(wrk->busyobj->vgz_rx, ibuf2, sizeof ibuf2); + i = VGZ_Gunzip(wrk->busyobj->vgz_rx, &dp, &dl); /* XXX: check i */ assert(i >= VGZ_OK); vef->bufp = ibuf2; if (dl > 0) - VEP_Parse(w, ibuf2, dl); + VEP_Parse(wrk, ibuf2, dl); if (vef->error) { errno = vef->error; return (-1); @@ -287,7 +287,7 @@ vfp_esi_bytes_gg(struct worker *w, struct http_conn *htc, size_t bytes) vef->bufp, dl); vef->npend += dl; } - } while (!VGZ_IbufEmpty(w->busyobj->vgz_rx)); + } while (!VGZ_IbufEmpty(wrk->busyobj->vgz_rx)); } return (1); } @@ -296,108 +296,114 @@ vfp_esi_bytes_gg(struct worker *w, struct http_conn *htc, size_t bytes) /*---------------------------------------------------------------------*/ static void __match_proto__() -vfp_esi_begin(struct worker *w, size_t estimate) +vfp_esi_begin(struct worker *wrk, size_t estimate) { + struct busyobj *bo; struct vef_priv *vef; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - - AZ(w->busyobj->vgz_rx); - if (w->busyobj->is_gzip && w->busyobj->do_gunzip) { - w->busyobj->vgz_rx = VGZ_NewUngzip(w, "U F E"); - VEP_Init(w, NULL); - } else if (w->busyobj->is_gunzip && w->busyobj->do_gzip) { + (void)estimate; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + bo = wrk->busyobj; + CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); + + AZ(bo->vgz_rx); + if (bo->is_gzip && bo->do_gunzip) { + bo->vgz_rx = VGZ_NewUngzip(wrk, "U F E"); + VEP_Init(wrk, NULL); + } else if (bo->is_gunzip && bo->do_gzip) { ALLOC_OBJ(vef, VEF_MAGIC); AN(vef); - vef->vgz = VGZ_NewGzip(w, "G F E"); - AZ(w->busyobj->vef_priv); - w->busyobj->vef_priv = vef; - VEP_Init(w, vfp_vep_callback); - } else if (w->busyobj->is_gzip) { - w->busyobj->vgz_rx = VGZ_NewUngzip(w, "U F E"); + vef->vgz = VGZ_NewGzip(wrk, "G F E"); + AZ(bo->vef_priv); + bo->vef_priv = vef; + VEP_Init(wrk, vfp_vep_callback); + } else if (bo->is_gzip) { + bo->vgz_rx = VGZ_NewUngzip(wrk, "U F E"); ALLOC_OBJ(vef, VEF_MAGIC); AN(vef); - vef->vgz = VGZ_NewGzip(w, "G F E"); - AZ(w->busyobj->vef_priv); - w->busyobj->vef_priv = vef; - VEP_Init(w, vfp_vep_callback); + vef->vgz = VGZ_NewGzip(wrk, "G F E"); + AZ(bo->vef_priv); + bo->vef_priv = vef; + VEP_Init(wrk, vfp_vep_callback); } else { - AZ(w->busyobj->vef_priv); - VEP_Init(w, NULL); + AZ(bo->vef_priv); + VEP_Init(wrk, NULL); } - (void)estimate; - AN(w->busyobj->vep); + AN(bo->vep); } static int __match_proto__() -vfp_esi_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_esi_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { + struct busyobj *bo; int i; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - AZ(w->busyobj->fetch_failed); - AN(w->busyobj->vep); - assert(&w->busyobj->htc == htc); - if (w->busyobj->is_gzip && w->busyobj->do_gunzip) - i = vfp_esi_bytes_gu(w, htc, bytes); - else if (w->busyobj->is_gunzip && w->busyobj->do_gzip) - i = vfp_esi_bytes_ug(w, htc, bytes); - else if (w->busyobj->is_gzip) - i = vfp_esi_bytes_gg(w, htc, bytes); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + bo = wrk->busyobj; + CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); + + AZ(bo->fetch_failed); + AN(bo->vep); + assert(&bo->htc == htc); + if (bo->is_gzip && bo->do_gunzip) + i = vfp_esi_bytes_gu(wrk, htc, bytes); + else if (bo->is_gunzip && bo->do_gzip) + i = vfp_esi_bytes_ug(wrk, htc, bytes); + else if (bo->is_gzip) + i = vfp_esi_bytes_gg(wrk, htc, bytes); else - i = vfp_esi_bytes_uu(w, htc, bytes); - AN(w->busyobj->vep); + i = vfp_esi_bytes_uu(wrk, htc, bytes); + AN(bo->vep); return (i); } static int __match_proto__() -vfp_esi_end(struct worker *w) +vfp_esi_end(struct worker *wrk) { struct vsb *vsb; struct vef_priv *vef; + struct busyobj *bo; ssize_t l; int retval; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - AN(w->busyobj->vep); + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + bo = wrk->busyobj; + CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); + AN(bo->vep); - retval = w->busyobj->fetch_failed; + retval = bo->fetch_failed; - if (w->busyobj->vgz_rx != NULL && - VGZ_Destroy(&w->busyobj->vgz_rx, -1) != VGZ_END) - retval = FetchError(w, - "Gunzip+ESI Failed at the very end"); + if (bo->vgz_rx != NULL && VGZ_Destroy(&bo->vgz_rx, -1) != VGZ_END) + retval = FetchError(wrk, "Gunzip+ESI Failed at the very end"); - vsb = VEP_Finish(w); + vsb = VEP_Finish(wrk); if (vsb != NULL) { if (!retval) { l = VSB_len(vsb); assert(l > 0); /* XXX: This is a huge waste of storage... */ - w->busyobj->fetch_obj->esidata = STV_alloc(w, l); - if (w->busyobj->fetch_obj->esidata != NULL) { - memcpy(w->busyobj->fetch_obj->esidata->ptr, + bo->fetch_obj->esidata = STV_alloc(wrk, l); + if (bo->fetch_obj->esidata != NULL) { + memcpy(bo->fetch_obj->esidata->ptr, VSB_data(vsb), l); - w->busyobj->fetch_obj->esidata->len = l; + bo->fetch_obj->esidata->len = l; } else { - retval = FetchError(w, + retval = FetchError(wrk, "Could not allocate storage for esidata"); } } VSB_delete(vsb); } - vef = w->busyobj->vef_priv; + vef = bo->vef_priv; if (vef != NULL) { CHECK_OBJ_NOTNULL(vef, VEF_MAGIC); - w->busyobj->vef_priv = NULL; - VGZ_UpdateObj(vef->vgz, w->busyobj->fetch_obj); + bo->vef_priv = NULL; + VGZ_UpdateObj(vef->vgz, bo->fetch_obj); if (VGZ_Destroy(&vef->vgz, -1) != VGZ_END) - retval = FetchError(w, + retval = FetchError(wrk, "ESI+Gzip Failed at the very end"); FREE_OBJ(vef); } diff --git a/bin/varnishd/cache/cache_esi_parse.c b/bin/varnishd/cache/cache_esi_parse.c index 41992ab..e431a8d 100644 --- a/bin/varnishd/cache/cache_esi_parse.c +++ b/bin/varnishd/cache/cache_esi_parse.c @@ -1007,6 +1007,8 @@ VEP_Init(struct worker *wrk, vep_callback_t *cb) vep = (void*)WS_Alloc(wrk->ws, sizeof *vep); AN(vep); + memset(vep, 0, sizeof *vep); + vep->magic = VEP_MAGIC; vep->wrk = wrk; vep->vsb = VSB_new_auto(); AN(vep->vsb); From phk at varnish-cache.org Tue Dec 6 08:59:26 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 09:59:26 +0100 Subject: [master] 3ef44da More code polishing Message-ID: commit 3ef44da5d44710270164d6970c3891f2b0e8ed8a Author: Poul-Henning Kamp Date: Tue Dec 6 08:59:16 2011 +0000 More code polishing diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index 5da06a7..8a1ac5b 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -46,30 +46,30 @@ 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 w->busyobj->fetch_failed to bail out + * Other code is allowed to look at wrk->busyobj->fetch_failed to bail out * * For convenience, always return -1 */ int -FetchError2(struct worker *w, const char *error, const char *more) +FetchError2(struct worker *wrk, const char *error, const char *more) { - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - if (!w->busyobj->fetch_failed) { + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + if (!wrk->busyobj->fetch_failed) { if (more == NULL) - WSLB(w, SLT_FetchError, "%s", error); + WSLB(wrk, SLT_FetchError, "%s", error); else - WSLB(w, SLT_FetchError, "%s: %s", error, more); + WSLB(wrk, SLT_FetchError, "%s: %s", error, more); } - w->busyobj->fetch_failed = 1; + wrk->busyobj->fetch_failed = 1; return (-1); } int -FetchError(struct worker *w, const char *error) +FetchError(struct worker *wrk, const char *error) { - return(FetchError2(w, error, NULL)); + return(FetchError2(wrk, error, NULL)); } /*-------------------------------------------------------------------- @@ -88,11 +88,11 @@ FetchError(struct worker *w, const char *error) * as seen on the socket, or zero if unknown. */ static void __match_proto__() -vfp_nop_begin(struct worker *w, size_t estimate) +vfp_nop_begin(struct worker *wrk, size_t estimate) { if (estimate > 0) - (void)FetchStorage(w, estimate); + (void)FetchStorage(wrk, estimate); } /*-------------------------------------------------------------------- @@ -107,27 +107,27 @@ vfp_nop_begin(struct worker *w, size_t estimate) */ static int __match_proto__() -vfp_nop_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) +vfp_nop_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes) { ssize_t l, wl; struct storage *st; - AZ(w->busyobj->fetch_failed); + AZ(wrk->busyobj->fetch_failed); while (bytes > 0) { - st = FetchStorage(w, 0); + st = FetchStorage(wrk, 0); if (st == NULL) return(-1); l = st->space - st->len; if (l > bytes) l = bytes; - wl = HTC_Read(w, htc, st->ptr + st->len, l); + wl = HTC_Read(wrk, htc, st->ptr + st->len, l); if (wl <= 0) return (wl); st->len += wl; - w->busyobj->fetch_obj->len += wl; + wrk->busyobj->fetch_obj->len += wl; bytes -= wl; - if (w->busyobj->do_stream) - RES_StreamPoll(w); + if (wrk->busyobj->do_stream) + RES_StreamPoll(wrk); } return (1); } @@ -142,16 +142,16 @@ vfp_nop_bytes(struct worker *w, struct http_conn *htc, ssize_t bytes) */ static int __match_proto__() -vfp_nop_end(struct worker *w) +vfp_nop_end(struct worker *wrk) { struct storage *st; - st = VTAILQ_LAST(&w->busyobj->fetch_obj->store, storagehead); + st = VTAILQ_LAST(&wrk->busyobj->fetch_obj->store, storagehead); if (st == NULL) return (0); if (st->len == 0) { - VTAILQ_REMOVE(&w->busyobj->fetch_obj->store, st, list); + VTAILQ_REMOVE(&wrk->busyobj->fetch_obj->store, st, list); STV_free(st); return (0); } @@ -172,13 +172,13 @@ static struct vfp vfp_nop = { */ struct storage * -FetchStorage(struct worker *w, ssize_t sz) +FetchStorage(struct worker *wrk, ssize_t sz) { ssize_t l; struct storage *st; struct object *obj; - obj = w->busyobj->fetch_obj; + obj = wrk->busyobj->fetch_obj; CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC); st = VTAILQ_LAST(&obj->store, storagehead); if (st != NULL && st->len < st->space) @@ -189,9 +189,9 @@ FetchStorage(struct worker *w, ssize_t sz) l = sz; if (l == 0) l = cache_param->fetch_chunksize; - st = STV_alloc(w, l); + st = STV_alloc(wrk, l); if (st == NULL) { - (void)FetchError(w, "Could not get storage"); + (void)FetchError(wrk, "Could not get storage"); return (NULL); } AZ(st->len); @@ -225,20 +225,20 @@ fetch_number(const char *nbr, int radix) /*--------------------------------------------------------------------*/ static int -fetch_straight(struct worker *w, struct http_conn *htc, ssize_t cl) +fetch_straight(struct worker *wrk, struct http_conn *htc, ssize_t cl) { int i; - assert(w->busyobj->body_status == BS_LENGTH); + assert(wrk->busyobj->body_status == BS_LENGTH); if (cl < 0) { - return (FetchError(w, "straight length field bogus")); + return (FetchError(wrk, "straight length field bogus")); } else if (cl == 0) return (0); - i = w->busyobj->vfp->bytes(w, htc, cl); + i = wrk->busyobj->vfp->bytes(wrk, htc, cl); if (i <= 0) - return (FetchError(w, "straight insufficient bytes")); + return (FetchError(wrk, "straight insufficient bytes")); return (0); } @@ -249,28 +249,28 @@ fetch_straight(struct worker *w, struct http_conn *htc, ssize_t cl) */ static int -fetch_chunked(struct worker *w, struct http_conn *htc) +fetch_chunked(struct worker *wrk, struct http_conn *htc) { int i; char buf[20]; /* XXX: 20 is arbitrary */ unsigned u; ssize_t cl; - assert(w->busyobj->body_status == BS_CHUNKED); + assert(wrk->busyobj->body_status == BS_CHUNKED); do { /* Skip leading whitespace */ do { - if (HTC_Read(w, htc, buf, 1) <= 0) + if (HTC_Read(wrk, htc, buf, 1) <= 0) return (-1); } while (vct_islws(buf[0])); if (!vct_ishex(buf[0])) - return (FetchError(w,"chunked header non-hex")); + return (FetchError(wrk,"chunked header non-hex")); /* Collect hex digits, skipping leading zeros */ for (u = 1; u < sizeof buf; u++) { do { - if (HTC_Read(w, htc, buf + u, 1) <= 0) + if (HTC_Read(wrk, htc, buf + u, 1) <= 0) return (-1); } while (u == 1 && buf[0] == '0' && buf[u] == '0'); if (!vct_ishex(buf[u])) @@ -278,31 +278,31 @@ fetch_chunked(struct worker *w, struct http_conn *htc) } if (u >= sizeof buf) - return (FetchError(w,"chunked header too long")); + return (FetchError(wrk,"chunked header too long")); /* Skip trailing white space */ while(vct_islws(buf[u]) && buf[u] != '\n') - if (HTC_Read(w, htc, buf + u, 1) <= 0) + if (HTC_Read(wrk, htc, buf + u, 1) <= 0) return (-1); if (buf[u] != '\n') - return (FetchError(w,"chunked header no NL")); + return (FetchError(wrk,"chunked header no NL")); buf[u] = '\0'; cl = fetch_number(buf, 16); if (cl < 0) - return (FetchError(w,"chunked header number syntax")); + return (FetchError(wrk,"chunked header number syntax")); - if (cl > 0 && w->busyobj->vfp->bytes(w, htc, cl) <= 0) + if (cl > 0 && wrk->busyobj->vfp->bytes(wrk, htc, cl) <= 0) return (-1); - i = HTC_Read(w, htc, buf, 1); + i = HTC_Read(wrk, htc, buf, 1); if (i <= 0) return (-1); - if (buf[0] == '\r' && HTC_Read(w, htc, buf, 1) <= 0) + if (buf[0] == '\r' && HTC_Read(wrk, htc, buf, 1) <= 0) return (-1); if (buf[0] != '\n') - return (FetchError(w,"chunked tail no NL")); + return (FetchError(wrk,"chunked tail no NL")); } while (cl > 0); return (0); } @@ -310,12 +310,12 @@ fetch_chunked(struct worker *w, struct http_conn *htc) /*--------------------------------------------------------------------*/ static int -fetch_eof(struct worker *w, struct http_conn *htc) +fetch_eof(struct worker *wrk, struct http_conn *htc) { int i; - assert(w->busyobj->body_status == BS_EOF); - i = w->busyobj->vfp->bytes(w, htc, SSIZE_MAX); + assert(wrk->busyobj->body_status == BS_EOF); + i = wrk->busyobj->vfp->bytes(wrk, htc, SSIZE_MAX); if (i < 0) return (-1); return (0); @@ -378,7 +378,7 @@ int FetchHdr(struct sess *sp, int need_host_hdr) { struct vbc *vc; - struct worker *w; + struct worker *wrk; struct http *hp; int retry = -1; int i; @@ -386,9 +386,9 @@ FetchHdr(struct sess *sp, int need_host_hdr) CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); - w = sp->wrk; - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - htc = &w->busyobj->htc; + wrk = sp->wrk; + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + htc = &wrk->busyobj->htc; AN(sp->director); AZ(sp->wrk->obj); @@ -398,7 +398,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) AN(sp->wrk->objcore->flags & OC_F_BUSY); } - hp = w->bereq; + hp = wrk->bereq; sp->wrk->busyobj->vbc = VDI_GetFd(NULL, sp); if (sp->wrk->busyobj->vbc == NULL) { @@ -418,12 +418,12 @@ FetchHdr(struct sess *sp, int need_host_hdr) VDI_AddHostHeader(sp->wrk, vc); (void)VTCP_blocking(vc->fd); /* XXX: we should timeout instead */ - WRW_Reserve(w, &vc->fd); - (void)http_Write(w, vc->vsl_id, hp, 0); /* XXX: stats ? */ + WRW_Reserve(wrk, &vc->fd); + (void)http_Write(wrk, vc->vsl_id, hp, 0); /* XXX: stats ? */ /* Deal with any message-body the request might have */ i = FetchReqBody(sp); - if (WRW_FlushRelease(w) || i > 0) { + if (WRW_FlushRelease(wrk) || i > 0) { WSP(sp, SLT_FetchError, "backend write error: %d (%s)", errno, strerror(errno)); VDI_CloseFd(sp->wrk, &sp->wrk->busyobj->vbc); @@ -432,14 +432,14 @@ FetchHdr(struct sess *sp, int need_host_hdr) } /* Checkpoint the vsl.here */ - WSL_Flush(w, 0); + WSL_Flush(wrk, 0); /* XXX is this the right place? */ VSC_C_main->backend_req++; /* Receive response */ - HTC_Init(htc, w->ws, vc->fd, vc->vsl_id, + HTC_Init(htc, wrk->ws, vc->fd, vc->vsl_id, cache_param->http_resp_size, cache_param->http_resp_hdr_len); @@ -470,9 +470,9 @@ FetchHdr(struct sess *sp, int need_host_hdr) } } - hp = w->beresp; + hp = wrk->beresp; - if (http_DissectResponse(w, htc, hp)) { + if (http_DissectResponse(wrk, htc, hp)) { WSP(sp, SLT_FetchError, "http format error"); VDI_CloseFd(sp->wrk, &sp->wrk->busyobj->vbc); /* XXX: other cleanup ? */ @@ -484,37 +484,39 @@ FetchHdr(struct sess *sp, int need_host_hdr) /*--------------------------------------------------------------------*/ int -FetchBody(struct worker *w, struct object *obj) +FetchBody(struct worker *wrk, struct object *obj) { int cls; struct storage *st; int mklen; ssize_t cl; struct http_conn *htc; + struct busyobj *bo; - CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->busyobj, BUSYOBJ_MAGIC); - AZ(w->busyobj->fetch_obj); - CHECK_OBJ_NOTNULL(w->busyobj->vbc, VBC_MAGIC); + 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); CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(obj->http, HTTP_MAGIC); - htc = &w->busyobj->htc; + htc = &bo->htc; - if (w->busyobj->vfp == NULL) - w->busyobj->vfp = &vfp_nop; + if (bo->vfp == NULL) + bo->vfp = &vfp_nop; AssertObjCorePassOrBusy(obj->objcore); - AZ(w->busyobj->vgz_rx); + AZ(bo->vgz_rx); AZ(VTAILQ_FIRST(&obj->store)); - w->busyobj->fetch_obj = obj; - w->busyobj->fetch_failed = 0; + bo->fetch_obj = obj; + bo->fetch_failed = 0; /* XXX: pick up estimate from objdr ? */ cl = 0; - switch (w->busyobj->body_status) { + switch (bo->body_status) { case BS_NONE: cls = 0; mklen = 0; @@ -524,25 +526,25 @@ FetchBody(struct worker *w, struct object *obj) mklen = 1; break; case BS_LENGTH: - cl = fetch_number( w->busyobj->h_content_length, 10); - w->busyobj->vfp->begin(w, cl > 0 ? cl : 0); - cls = fetch_straight(w, htc, cl); + cl = fetch_number(bo->h_content_length, 10); + bo->vfp->begin(wrk, cl > 0 ? cl : 0); + cls = fetch_straight(wrk, htc, cl); mklen = 1; - if (w->busyobj->vfp->end(w)) + if (bo->vfp->end(wrk)) cls = -1; break; case BS_CHUNKED: - w->busyobj->vfp->begin(w, cl); - cls = fetch_chunked(w, htc); + bo->vfp->begin(wrk, cl); + cls = fetch_chunked(wrk, htc); mklen = 1; - if (w->busyobj->vfp->end(w)) + if (bo->vfp->end(wrk)) cls = -1; break; case BS_EOF: - w->busyobj->vfp->begin(w, cl); - cls = fetch_eof(w, htc); + bo->vfp->begin(wrk, cl); + cls = fetch_eof(wrk, htc); mklen = 1; - if (w->busyobj->vfp->end(w)) + if (bo->vfp->end(wrk)) cls = -1; break; case BS_ERROR: @@ -554,44 +556,44 @@ FetchBody(struct worker *w, struct object *obj) mklen = 0; INCOMPL(); } - AZ(w->busyobj->vgz_rx); + AZ(bo->vgz_rx); /* * It is OK for ->end to just leave the last storage segment - * sitting on w->storage, we will always call vfp_nop_end() + * sitting on wrk->storage, we will always call vfp_nop_end() * to get it trimmed or thrown out if empty. */ - AZ(vfp_nop_end(w)); + AZ(vfp_nop_end(wrk)); - w->busyobj->fetch_obj = NULL; + bo->fetch_obj = NULL; - WSLB(w, SLT_Fetch_Body, "%u(%s) cls %d mklen %d", - w->busyobj->body_status, body_status(w->busyobj->body_status), + WSLB(wrk, SLT_Fetch_Body, "%u(%s) cls %d mklen %d", + bo->body_status, body_status(bo->body_status), cls, mklen); - if (w->busyobj->body_status == BS_ERROR) { - VDI_CloseFd(w, &w->busyobj->vbc); + if (bo->body_status == BS_ERROR) { + VDI_CloseFd(wrk, &bo->vbc); return (__LINE__); } if (cls < 0) { - w->stats.fetch_failed++; + wrk->stats.fetch_failed++; /* XXX: Wouldn't this store automatically be released ? */ while (!VTAILQ_EMPTY(&obj->store)) { st = VTAILQ_FIRST(&obj->store); VTAILQ_REMOVE(&obj->store, st, list); STV_free(st); } - VDI_CloseFd(w, &w->busyobj->vbc); + VDI_CloseFd(wrk, &bo->vbc); obj->len = 0; return (__LINE__); } - AZ(w->busyobj->fetch_failed); + AZ(bo->fetch_failed); - if (cls == 0 && w->busyobj->should_close) + if (cls == 0 && bo->should_close) cls = 1; - WSLB(w, SLT_Length, "%zd", obj->len); + WSLB(wrk, SLT_Length, "%zd", obj->len); { /* Sanity check fetch methods accounting */ @@ -600,7 +602,7 @@ FetchBody(struct worker *w, struct object *obj) uu = 0; VTAILQ_FOREACH(st, &obj->store, list) uu += st->len; - if (w->busyobj->do_stream) + if (bo->do_stream) /* Streaming might have started freeing stuff */ assert (uu <= obj->len); @@ -610,14 +612,14 @@ FetchBody(struct worker *w, struct object *obj) if (mklen > 0) { http_Unset(obj->http, H_Content_Length); - http_PrintfHeader(w, w->busyobj->vbc->vsl_id, obj->http, - "Content-Length: %jd", (intmax_t)obj->len); + http_PrintfHeader(wrk, bo->vbc->vsl_id, obj->http, + "Content-Length: %zd", obj->len); } if (cls) - VDI_CloseFd(w, &w->busyobj->vbc); + VDI_CloseFd(wrk, &bo->vbc); else - VDI_RecycleFd(w, &w->busyobj->vbc); + VDI_RecycleFd(wrk, &bo->vbc); return (0); } From phk at varnish-cache.org Tue Dec 6 10:00:50 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 11:00:50 +0100 Subject: [master] 4f47929 Add an objcore->getxid() method. Message-ID: commit 4f47929731b3dc637c0ac756e2babb4787fcb9bb Author: Poul-Henning Kamp Date: Tue Dec 6 10:00:25 2011 +0000 Add an objcore->getxid() method. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 46af4dd..327682c 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -395,12 +395,14 @@ struct storage { */ typedef struct object *getobj_f(struct worker *wrk, struct objcore *oc); +typedef unsigned getxid_f(struct worker *wrk, struct objcore *oc); typedef void updatemeta_f(struct objcore *oc); typedef void freeobj_f(struct objcore *oc); typedef struct lru *getlru_f(const struct objcore *oc); struct objcore_methods { getobj_f *getobj; + getxid_f *getxid; updatemeta_f *updatemeta; freeobj_f *freeobj; getlru_f *getlru; @@ -429,6 +431,16 @@ struct objcore { struct ban *ban; }; +static inline unsigned +oc_getxid(struct worker *wrk, struct objcore *oc) +{ + CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); + + AN(oc->methods); + AN(oc->methods->getxid); + return (oc->methods->getxid(wrk, oc)); +} + static inline struct object * oc_getobj(struct worker *wrk, struct objcore *oc) { diff --git a/bin/varnishd/cache/cache_expire.c b/bin/varnishd/cache/cache_expire.c index 23e3fc6..761a62e 100644 --- a/bin/varnishd/cache/cache_expire.c +++ b/bin/varnishd/cache/cache_expire.c @@ -401,7 +401,7 @@ exp_timer(struct sess *sp, void *priv) CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC); o = oc_getobj(sp->wrk, oc); WSL(sp->wrk, SLT_ExpKill, 0, "%u %.0f", - o->xid, EXP_Ttl(NULL, o) - t); + oc_getxid(sp->wrk, oc), EXP_Ttl(NULL, o) - t); (void)HSH_Deref(sp->wrk, oc, NULL); } NEEDLESS_RETURN(NULL); @@ -414,10 +414,9 @@ exp_timer(struct sess *sp, void *priv) */ int -EXP_NukeOne(struct worker *w, struct lru *lru) +EXP_NukeOne(struct worker *wrk, struct lru *lru) { struct objcore *oc; - struct object *o; /* Find the first currently unused object on the LRU. */ Lck_Lock(&lru->mtx); @@ -446,9 +445,8 @@ EXP_NukeOne(struct worker *w, struct lru *lru) return (-1); /* XXX: bad idea for -spersistent */ - o = oc_getobj(w, oc); - WSL(w, SLT_ExpKill, 0, "%u LRU", o->xid); - (void)HSH_Deref(w, NULL, &o); + WSL(wrk, SLT_ExpKill, 0, "%u LRU", oc_getxid(wrk, oc)); + (void)HSH_Deref(wrk, oc, NULL); return (1); } diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c index 5de0e27..a6156d4 100644 --- a/bin/varnishd/storage/stevedore.c +++ b/bin/varnishd/storage/stevedore.c @@ -48,6 +48,15 @@ static const struct stevedore * volatile stv_next; * Default objcore methods */ +static unsigned __match_proto__(getxid_f) +default_oc_getxid(struct worker *wrk, struct objcore *oc) +{ + struct object *o; + + o = oc_getobj(wrk, oc); + return (o->xid); +} + static struct object * __match_proto__(getobj_f) default_oc_getobj(struct worker *wrk, struct objcore *oc) { @@ -84,6 +93,7 @@ default_oc_getlru(const struct objcore *oc) static struct objcore_methods default_oc_methods = { .getobj = default_oc_getobj, + .getxid = default_oc_getxid, .freeobj = default_oc_freeobj, .getlru = default_oc_getlru, }; From martin at varnish-cache.org Tue Dec 6 10:20:12 2011 From: martin at varnish-cache.org (Martin Blix Grydeland) Date: Tue, 06 Dec 2011 11:20:12 +0100 Subject: [master] 3d723fd Rework the busyobj handling. Message-ID: commit 3d723fdab10f10c7f062e8350e1b81a341b28a21 Author: Martin Blix Grydeland Date: Tue Dec 6 10:37:40 2011 +0100 Rework the busyobj handling. This patch reworks busyobj handling so that busyobjs are owned by the issuing worker, and the worker should explicitly release it when done with it. A busy objcore only lends a pointer to it. This is to fix the current situation where the owning party is murky, and the current code will leak busyobjs in at least one situation. BusyObj's are reference counted in preperation for the streaming code. Patch also adds several asserts to help make sure the busyobjs are sound. Fixes: #1068 diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 327682c..347de56 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -293,7 +293,7 @@ struct worker { struct objhead *nobjhead; struct objcore *nobjcore; struct waitinglist *nwaitinglist; - struct busyobj *nbusyobj; + /* struct busyobj *nbusyobj; */ void *nhashpriv; struct dstat stats; @@ -496,6 +496,8 @@ oc_getlru(const struct objcore *oc) struct busyobj { unsigned magic; #define BUSYOBJ_MAGIC 0x23b95567 + unsigned refcount; + uint8_t *vary; unsigned is_gzip; unsigned is_gunzip; @@ -667,8 +669,14 @@ void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp); void VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc); void VBE_Poll(void); -/* cache_backend_cfg.c */ +/* cache_backend.c */ void VBE_Init(void); +struct busyobj *VBE_GetBusyObj(void); +struct busyobj *VBE_RefBusyObj(struct busyobj *busyobj); +void VBE_DerefBusyObj(struct busyobj **busyobj); + +/* cache_backend_cfg.c */ +void VBE_InitCfg(void); struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb); /* cache_backend_poll.c */ @@ -995,21 +1003,6 @@ void SMP_Init(void); void SMP_Ready(void); void SMP_NewBan(const uint8_t *ban, unsigned len); -#define New_BusyObj(wrk) \ - do { \ - if (wrk->nbusyobj != NULL) { \ - CHECK_OBJ_NOTNULL(wrk->nbusyobj, BUSYOBJ_MAGIC);\ - wrk->busyobj = wrk->nbusyobj; \ - wrk->nbusyobj = NULL; \ - memset(wrk->busyobj, 0, sizeof *wrk->busyobj); \ - wrk->busyobj->magic = BUSYOBJ_MAGIC; \ - } else { \ - ALLOC_OBJ(wrk->busyobj, BUSYOBJ_MAGIC); \ - } \ - CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); \ - AZ(wrk->nbusyobj); \ - } while (0) - /* * A normal pointer difference is signed, but we never want a negative value * so this little tool will make sure we don't get that. @@ -1064,6 +1057,7 @@ AssertObjBusy(const struct object *o) { AN(o->objcore); AN (o->objcore->flags & OC_F_BUSY); + AN(o->objcore->busyobj); } static inline void diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index b661640..263aa17 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -41,6 +41,91 @@ #include "vrt.h" #include "vtcp.h" +static struct lock nbusyobj_mtx; +static struct busyobj *nbusyobj; + +void +VBE_Init(void) +{ + Lck_New(&nbusyobj_mtx, lck_nbusyobj); + nbusyobj = NULL; +} + +/*-------------------------------------------------------------------- + * BusyObj handling + */ + +static struct busyobj * +vbe_NewBusyObj(void) +{ + struct busyobj *busyobj; + + ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC); + AN(busyobj); + return (busyobj); +} + +static void +vbe_FreeBusyObj(struct busyobj *busyobj) +{ + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + AZ(busyobj->refcount); + FREE_OBJ(busyobj); +} + +struct busyobj * +VBE_GetBusyObj(void) +{ + struct busyobj *busyobj = NULL; + + Lck_Lock(&nbusyobj_mtx); + if (nbusyobj != NULL) { + CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC); + busyobj = nbusyobj; + nbusyobj = NULL; + memset(busyobj, 0, sizeof *busyobj); + busyobj->magic = BUSYOBJ_MAGIC; + } + Lck_Unlock(&nbusyobj_mtx); + if (busyobj == NULL) + busyobj = vbe_NewBusyObj(); + AN(busyobj); + busyobj->refcount = 1; + return (busyobj); +} + +struct busyobj * +VBE_RefBusyObj(struct busyobj *busyobj) +{ + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + assert(busyobj->refcount > 0); + busyobj->refcount++; + return (busyobj); +} + +void +VBE_DerefBusyObj(struct busyobj **pbo) +{ + struct busyobj *busyobj; + + busyobj = *pbo; + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + assert(busyobj->refcount > 0); + busyobj->refcount--; + *pbo = NULL; + if (busyobj->refcount > 0) + return; + /* XXX Sanity checks e.g. AZ(busyobj->vbc) */ + Lck_Lock(&nbusyobj_mtx); + if (nbusyobj == NULL) { + nbusyobj = busyobj; + busyobj = NULL; + } + Lck_Unlock(&nbusyobj_mtx); + if (busyobj != NULL) + vbe_FreeBusyObj(busyobj); +} + /*-------------------------------------------------------------------- * The "simple" director really isn't, since thats where all the actual * connections happen. Nontheless, pretend it is simple by sequestering diff --git a/bin/varnishd/cache/cache_backend_cfg.c b/bin/varnishd/cache/cache_backend_cfg.c index cbb8c85..a47aa3c 100644 --- a/bin/varnishd/cache/cache_backend_cfg.c +++ b/bin/varnishd/cache/cache_backend_cfg.c @@ -499,7 +499,7 @@ static struct cli_proto backend_cmds[] = { /*---------------------------------------------------------------------*/ void -VBE_Init(void) +VBE_InitCfg(void) { Lck_New(&VBE_mtx, lck_vbe); diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index 079df44..995268a 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -179,8 +179,11 @@ cnt_prepresp(struct sess *sp) CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); - if (wrk->busyobj != NULL && wrk->busyobj->do_stream) + if (wrk->busyobj != NULL) { + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + AN(wrk->busyobj->do_stream); AssertObjCorePassOrBusy(wrk->obj->objcore); + } wrk->res_mode = 0; @@ -248,9 +251,11 @@ cnt_prepresp(struct sess *sp) case VCL_RET_RESTART: if (sp->restarts >= cache_param->max_restarts) break; - if (wrk->busyobj->do_stream) { + if (wrk->busyobj != NULL) { + AN(wrk->busyobj->do_stream); VDI_CloseFd(wrk, &wrk->busyobj->vbc); HSH_Drop(wrk); + VBE_DerefBusyObj(&wrk->busyobj); } else { (void)HSH_Deref(wrk, NULL, &wrk->obj); } @@ -298,6 +303,7 @@ cnt_deliver(struct sess *sp) wrk = sp->wrk; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + AZ(sp->wrk->busyobj); sp->director = NULL; sp->restarts = 0; @@ -338,6 +344,7 @@ cnt_done(struct sess *sp) CHECK_OBJ_ORNULL(sp->vcl, VCL_CONF_MAGIC); AZ(wrk->obj); + AZ(wrk->busyobj); sp->director = NULL; sp->restarts = 0; @@ -458,7 +465,8 @@ cnt_error(struct sess *sp) if (wrk->obj == NULL) { HSH_Prealloc(sp); - New_BusyObj(wrk); + AZ(wrk->busyobj); + wrk->busyobj = VBE_GetBusyObj(); wrk->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size, (uint16_t)cache_param->http_max_hdr); if (wrk->obj == NULL) @@ -477,6 +485,7 @@ cnt_error(struct sess *sp) wrk->obj->xid = sp->xid; wrk->obj->exp.entered = sp->t_req; } else { + CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); /* XXX: Null the headers ? */ } CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); @@ -501,6 +510,7 @@ cnt_error(struct sess *sp) if (sp->handling == VCL_RET_RESTART && sp->restarts < cache_param->max_restarts) { HSH_Drop(wrk); + VBE_DerefBusyObj(&wrk->busyobj); sp->director = NULL; sp->restarts++; sp->step = STP_RECV; @@ -517,6 +527,7 @@ cnt_error(struct sess *sp) sp->err_code = 0; sp->err_reason = NULL; http_Setup(wrk->bereq, NULL); + VBE_DerefBusyObj(&wrk->busyobj); sp->step = STP_PREPRESP; return (0); } @@ -645,6 +656,7 @@ cnt_fetch(struct sess *sp) AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; } + VBE_DerefBusyObj(&wrk->busyobj); http_Setup(wrk->bereq, NULL); http_Setup(wrk->beresp, NULL); sp->director = NULL; @@ -819,6 +831,7 @@ cnt_fetchbody(struct sess *sp) sp->err_code = 503; sp->step = STP_ERROR; VDI_CloseFd(wrk, &wrk->busyobj->vbc); + VBE_DerefBusyObj(&wrk->busyobj); return (0); } CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); @@ -887,6 +900,7 @@ cnt_fetchbody(struct sess *sp) if (i) { HSH_Drop(wrk); + VBE_DerefBusyObj(&wrk->busyobj); AZ(wrk->obj); sp->err_code = 503; sp->step = STP_ERROR; @@ -899,6 +913,7 @@ cnt_fetchbody(struct sess *sp) AN(wrk->obj->objcore->ban); HSH_Unbusy(wrk); } + VBE_DerefBusyObj(&wrk->busyobj); wrk->acct_tmp.fetch++; sp->step = STP_PREPRESP; return (0); @@ -972,6 +987,7 @@ cnt_streambody(struct sess *sp) assert(WRW_IsReleased(wrk)); assert(wrk->wrw.ciov == wrk->wrw.siov); (void)HSH_Deref(wrk, NULL, &wrk->obj); + VBE_DerefBusyObj(&wrk->busyobj); http_Setup(wrk->resp, NULL); sp->step = STP_DONE; return (0); @@ -1050,6 +1066,7 @@ cnt_hit(struct sess *sp) CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); + AZ(wrk->busyobj); assert(!(wrk->obj->objcore->flags & OC_F_PASS)); @@ -1067,7 +1084,6 @@ cnt_hit(struct sess *sp) /* Drop our object, we won't need it */ (void)HSH_Deref(wrk, NULL, &wrk->obj); wrk->objcore = NULL; - wrk->busyobj = NULL; switch(sp->handling) { case VCL_RET_PASS: @@ -1127,6 +1143,7 @@ cnt_lookup(struct sess *sp) CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); + AZ(wrk->busyobj); if (sp->hash_objhead == NULL) { /* Not a waiting list return */ @@ -1256,20 +1273,21 @@ cnt_miss(struct sess *sp) wrk->connect_timeout = 0; wrk->first_byte_timeout = 0; wrk->between_bytes_timeout = 0; - CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); VCL_miss_method(sp); - CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); + switch(sp->handling) { case VCL_RET_ERROR: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; http_Setup(wrk->bereq, NULL); + VBE_DerefBusyObj(&wrk->busyobj); sp->step = STP_ERROR; return (0); case VCL_RET_PASS: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; + VBE_DerefBusyObj(&wrk->busyobj); sp->step = STP_PASS; return (0); case VCL_RET_FETCH: @@ -1279,6 +1297,7 @@ cnt_miss(struct sess *sp) case VCL_RET_RESTART: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; + VBE_DerefBusyObj(&wrk->busyobj); INCOMPL(); default: WRONG("Illegal action in vcl_miss{}"); @@ -1327,6 +1346,7 @@ cnt_pass(struct sess *sp) CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); AZ(wrk->obj); + AZ(wrk->busyobj); WS_Reset(wrk->ws, NULL); http_Setup(wrk->bereq, wrk->ws); @@ -1345,7 +1365,7 @@ cnt_pass(struct sess *sp) wrk->acct_tmp.pass++; sp->sendbody = 1; sp->step = STP_FETCH; - New_BusyObj(wrk); + wrk->busyobj = VBE_GetBusyObj(); return (0); } @@ -1433,6 +1453,7 @@ cnt_recv(struct sess *sp) CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); AZ(wrk->obj); + AZ(wrk->busyobj); assert(wrk->wrw.ciov == wrk->wrw.siov); /* By default we use the first backend */ diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c index 1f1795c..e33cdbe 100644 --- a/bin/varnishd/cache/cache_hash.c +++ b/bin/varnishd/cache/cache_hash.c @@ -106,11 +106,6 @@ HSH_Prealloc(const struct sess *sp) } CHECK_OBJ_NOTNULL(w->nwaitinglist, WAITINGLIST_MAGIC); - if (w->nbusyobj == NULL) { - ALLOC_OBJ(w->nbusyobj, BUSYOBJ_MAGIC); - XXXAN(w->nbusyobj); - } - if (hash->prep != NULL) hash->prep(sp); } @@ -139,10 +134,10 @@ HSH_Cleanup(struct worker *w) free(w->nhashpriv); w->nhashpriv = NULL; } - if (w->nbusyobj != NULL) { - FREE_OBJ(w->nbusyobj); - w->nbusyobj = NULL; - } + /* if (w->nbusyobj != NULL) { */ + /* FREE_OBJ(w->nbusyobj); */ + /* w->nbusyobj = NULL; */ + /* } */ } void @@ -456,7 +451,8 @@ HSH_Lookup(struct sess *sp, struct objhead **poh) AN(oc->flags & OC_F_BUSY); oc->refcnt = 1; - New_BusyObj(w); + AZ(w->busyobj); + w->busyobj = VBE_GetBusyObj(); VRY_Validate(sp->vary_b); if (sp->vary_l != NULL) @@ -626,8 +622,6 @@ HSH_Unbusy(struct worker *wrk) VTAILQ_REMOVE(&oh->objcs, oc, list); VTAILQ_INSERT_HEAD(&oh->objcs, oc, list); oc->flags &= ~OC_F_BUSY; - AZ(wrk->nbusyobj); - wrk->nbusyobj = oc->busyobj; oc->busyobj = NULL; if (oh->waitinglist != NULL) hsh_rush(oh); @@ -716,16 +710,6 @@ HSH_Deref(struct worker *w, struct objcore *oc, struct object **oo) BAN_DestroyObj(oc); AZ(oc->ban); - if (oc->flags & OC_F_BUSY) { - CHECK_OBJ_NOTNULL(oc->busyobj, BUSYOBJ_MAGIC); - if (w->nbusyobj == NULL) - w->nbusyobj = oc->busyobj; - else - FREE_OBJ(oc->busyobj); - oc->busyobj = NULL; - } - AZ(oc->busyobj); - if (oc->methods != NULL) { oc_freeobj(oc); w->stats.n_object--; diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index fd31de4..fbe7624 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -118,6 +118,7 @@ child_main(void) HTTP_Init(); VBE_Init(); + VBE_InitCfg(); VBP_Init(); WRK_Init(); Pool_Init(); diff --git a/bin/varnishtest/tests/r01068.vtc b/bin/varnishtest/tests/r01068.vtc new file mode 100644 index 0000000..c055d19 --- /dev/null +++ b/bin/varnishtest/tests/r01068.vtc @@ -0,0 +1,24 @@ +varnishtest "Bug 1068 restart on hit in vcl_deliver causes segfault" + +server s1 { + rxreq + txresp +} -start + +varnish v1 -vcl+backend { + sub vcl_deliver { + if (req.http.x-restart && req.restarts == 0) { + return (restart); + } + } +} -start + +client c1 { + txreq + rxresp + expect resp.status == 200 + + txreq -hdr "x-restart: true" + rxresp + expect resp.status == 200 +} -run diff --git a/include/tbl/locks.h b/include/tbl/locks.h index f1b634b..2ad717d 100644 --- a/include/tbl/locks.h +++ b/include/tbl/locks.h @@ -49,4 +49,5 @@ LOCK(vbp) LOCK(vbe) LOCK(backend) LOCK(vcapace) +LOCK(nbusyobj) /*lint -restore */ From phk at varnish-cache.org Tue Dec 6 11:04:27 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 12:04:27 +0100 Subject: [master] 02fd3c7 Implement a getxid method that doesn't require full resurrection of zombie objects. Message-ID: commit 02fd3c797265b7edbd7e5a7759b431cfd5afa91d Author: Poul-Henning Kamp Date: Tue Dec 6 11:03:36 2011 +0000 Implement a getxid method that doesn't require full resurrection of zombie objects. diff --git a/bin/varnishd/storage/storage_persistent_silo.c b/bin/varnishd/storage/storage_persistent_silo.c index b7ef952..7cafe4f 100644 --- a/bin/varnishd/storage/storage_persistent_silo.c +++ b/bin/varnishd/storage/storage_persistent_silo.c @@ -369,6 +369,35 @@ smp_loaded_st(const struct smp_sc *sc, const struct smp_seg *sg, * objcore methods for persistent objects */ +static unsigned __match_proto__(getxid_f) +smp_oc_getxid(struct worker *wrk, struct objcore *oc) +{ + struct object *o; + struct smp_seg *sg; + struct smp_object *so; + + (void)wrk; + CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); + + CAST_OBJ_NOTNULL(sg, oc->priv, SMP_SEG_MAGIC); + so = smp_find_so(sg, oc->priv2); + + o = (void*)(sg->sc->base + so->ptr); + /* + * The object may not be in this segment since we allocate it + * In a separate operation than the smp_object. We could check + * that it is in a later segment, but that would be complicated. + * XXX: For now, be happy if it is inside th silo + */ + ASSERT_PTR_IN_SILO(sg->sc, o); + CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC); + return (o->xid); +} + +/*--------------------------------------------------------------------- + * objcore methods for persistent objects + */ + static struct object * smp_oc_getobj(struct worker *wrk, struct objcore *oc) { @@ -506,6 +535,7 @@ smp_oc_getlru(const struct objcore *oc) } static struct objcore_methods smp_oc_methods = { + .getxid = smp_oc_getxid, .getobj = smp_oc_getobj, .updatemeta = smp_oc_updatemeta, .freeobj = smp_oc_freeobj, From phk at varnish-cache.org Tue Dec 6 11:04:28 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Tue, 06 Dec 2011 12:04:28 +0100 Subject: [master] 7cdeb0d Merge branch 'master' of ssh://git.varnish-cache.org/git/varnish-cache Message-ID: commit 7cdeb0d5653806875fe920a4fdfb6b3d50f51e14 Merge: 02fd3c7 3d723fd Author: Poul-Henning Kamp Date: Tue Dec 6 11:04:23 2011 +0000 Merge branch 'master' of ssh://git.varnish-cache.org/git/varnish-cache From martin at varnish-cache.org Tue Dec 6 13:08:08 2011 From: martin at varnish-cache.org (Martin Blix Grydeland) Date: Tue, 06 Dec 2011 14:08:08 +0100 Subject: [master] 3025017 Add locks to busyobj's and use locks on refcounting. Message-ID: commit 3025017171ad9d0959dfee5b5760b044cd4501e7 Author: Martin Blix Grydeland Date: Tue Dec 6 11:55:58 2011 +0100 Add locks to busyobj's and use locks on refcounting. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 347de56..cf0a6ee 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -496,6 +496,8 @@ oc_getlru(const struct objcore *oc) struct busyobj { unsigned magic; #define BUSYOBJ_MAGIC 0x23b95567 + struct lock mtx; + /* Members passed this line are cleared on reuse */ unsigned refcount; uint8_t *vary; diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index 263aa17..ef937ea 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -34,6 +34,8 @@ #include #include +#include +#include #include "cache.h" @@ -62,6 +64,7 @@ vbe_NewBusyObj(void) ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC); AN(busyobj); + Lck_New(&busyobj->mtx, lck_busyobj); return (busyobj); } @@ -70,6 +73,7 @@ vbe_FreeBusyObj(struct busyobj *busyobj) { CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); AZ(busyobj->refcount); + Lck_Delete(&busyobj->mtx); FREE_OBJ(busyobj); } @@ -83,8 +87,8 @@ VBE_GetBusyObj(void) CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC); busyobj = nbusyobj; nbusyobj = NULL; - memset(busyobj, 0, sizeof *busyobj); - busyobj->magic = BUSYOBJ_MAGIC; + memset((char *)busyobj + offsetof(struct busyobj, refcount), 0, + sizeof *busyobj - offsetof(struct busyobj, refcount)); } Lck_Unlock(&nbusyobj_mtx); if (busyobj == NULL) @@ -98,8 +102,10 @@ struct busyobj * VBE_RefBusyObj(struct busyobj *busyobj) { CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + Lck_Lock(&busyobj->mtx); assert(busyobj->refcount > 0); busyobj->refcount++; + Lck_Unlock(&busyobj->mtx); return (busyobj); } @@ -110,12 +116,18 @@ VBE_DerefBusyObj(struct busyobj **pbo) busyobj = *pbo; CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + Lck_Lock(&busyobj->mtx); assert(busyobj->refcount > 0); busyobj->refcount--; *pbo = NULL; - if (busyobj->refcount > 0) + if (busyobj->refcount > 0) { + Lck_Unlock(&busyobj->mtx); return; + } + Lck_Unlock(&busyobj->mtx); + /* XXX Sanity checks e.g. AZ(busyobj->vbc) */ + Lck_Lock(&nbusyobj_mtx); if (nbusyobj == NULL) { nbusyobj = busyobj; diff --git a/include/tbl/locks.h b/include/tbl/locks.h index 2ad717d..d86da01 100644 --- a/include/tbl/locks.h +++ b/include/tbl/locks.h @@ -50,4 +50,5 @@ LOCK(vbe) LOCK(backend) LOCK(vcapace) LOCK(nbusyobj) +LOCK(busyobj) /*lint -restore */ From phk at varnish-cache.org Wed Dec 7 10:14:29 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Wed, 07 Dec 2011 11:14:29 +0100 Subject: [master] 810428b Give VBE_GetBusyObj() and VBE_DerefBusyObj() a worker argument, we will need it shortly. Message-ID: commit 810428b8d1f7cef243707e0efa178ae045cc6e0e Author: Poul-Henning Kamp Date: Wed Dec 7 10:13:43 2011 +0000 Give VBE_GetBusyObj() and VBE_DerefBusyObj() a worker argument, we will need it shortly. Add more calls to them, they will also be needed shortly. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index cf0a6ee..56f23fd 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -673,9 +673,9 @@ void VBE_Poll(void); /* cache_backend.c */ void VBE_Init(void); -struct busyobj *VBE_GetBusyObj(void); +struct busyobj *VBE_GetBusyObj(struct worker *wrk); struct busyobj *VBE_RefBusyObj(struct busyobj *busyobj); -void VBE_DerefBusyObj(struct busyobj **busyobj); +void VBE_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj); /* cache_backend_cfg.c */ void VBE_InitCfg(void); diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index ef937ea..21c1a4c 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -78,10 +78,11 @@ vbe_FreeBusyObj(struct busyobj *busyobj) } struct busyobj * -VBE_GetBusyObj(void) +VBE_GetBusyObj(struct worker *wrk) { struct busyobj *busyobj = NULL; + (void)wrk; Lck_Lock(&nbusyobj_mtx); if (nbusyobj != NULL) { CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC); @@ -110,10 +111,11 @@ VBE_RefBusyObj(struct busyobj *busyobj) } void -VBE_DerefBusyObj(struct busyobj **pbo) +VBE_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) { struct busyobj *busyobj; + (void)wrk; busyobj = *pbo; CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); Lck_Lock(&busyobj->mtx); diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index 995268a..79e7956 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -255,7 +255,7 @@ cnt_prepresp(struct sess *sp) AN(wrk->busyobj->do_stream); VDI_CloseFd(wrk, &wrk->busyobj->vbc); HSH_Drop(wrk); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); } else { (void)HSH_Deref(wrk, NULL, &wrk->obj); } @@ -466,7 +466,7 @@ cnt_error(struct sess *sp) if (wrk->obj == NULL) { HSH_Prealloc(sp); AZ(wrk->busyobj); - wrk->busyobj = VBE_GetBusyObj(); + wrk->busyobj = VBE_GetBusyObj(wrk); wrk->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size, (uint16_t)cache_param->http_max_hdr); if (wrk->obj == NULL) @@ -510,7 +510,7 @@ cnt_error(struct sess *sp) if (sp->handling == VCL_RET_RESTART && sp->restarts < cache_param->max_restarts) { HSH_Drop(wrk); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->director = NULL; sp->restarts++; sp->step = STP_RECV; @@ -527,7 +527,7 @@ cnt_error(struct sess *sp) sp->err_code = 0; sp->err_reason = NULL; http_Setup(wrk->bereq, NULL); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_PREPRESP; return (0); } @@ -656,7 +656,7 @@ cnt_fetch(struct sess *sp) AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; } - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); http_Setup(wrk->bereq, NULL); http_Setup(wrk->beresp, NULL); sp->director = NULL; @@ -831,7 +831,7 @@ cnt_fetchbody(struct sess *sp) sp->err_code = 503; sp->step = STP_ERROR; VDI_CloseFd(wrk, &wrk->busyobj->vbc); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); return (0); } CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); @@ -900,7 +900,7 @@ cnt_fetchbody(struct sess *sp) if (i) { HSH_Drop(wrk); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); AZ(wrk->obj); sp->err_code = 503; sp->step = STP_ERROR; @@ -913,7 +913,7 @@ cnt_fetchbody(struct sess *sp) AN(wrk->obj->objcore->ban); HSH_Unbusy(wrk); } - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); wrk->acct_tmp.fetch++; sp->step = STP_PREPRESP; return (0); @@ -987,7 +987,7 @@ cnt_streambody(struct sess *sp) assert(WRW_IsReleased(wrk)); assert(wrk->wrw.ciov == wrk->wrw.siov); (void)HSH_Deref(wrk, NULL, &wrk->obj); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); http_Setup(wrk->resp, NULL); sp->step = STP_DONE; return (0); @@ -1281,13 +1281,13 @@ cnt_miss(struct sess *sp) AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; http_Setup(wrk->bereq, NULL); - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_ERROR; return (0); case VCL_RET_PASS: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_PASS; return (0); case VCL_RET_FETCH: @@ -1297,7 +1297,7 @@ cnt_miss(struct sess *sp) case VCL_RET_RESTART: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; - VBE_DerefBusyObj(&wrk->busyobj); + VBE_DerefBusyObj(wrk, &wrk->busyobj); INCOMPL(); default: WRONG("Illegal action in vcl_miss{}"); @@ -1348,6 +1348,7 @@ cnt_pass(struct sess *sp) AZ(wrk->obj); AZ(wrk->busyobj); + wrk->busyobj = VBE_GetBusyObj(wrk); WS_Reset(wrk->ws, NULL); http_Setup(wrk->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_PASS); @@ -1358,6 +1359,7 @@ cnt_pass(struct sess *sp) VCL_pass_method(sp); if (sp->handling == VCL_RET_ERROR) { http_Setup(wrk->bereq, NULL); + VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_ERROR; return (0); } @@ -1365,7 +1367,6 @@ cnt_pass(struct sess *sp) wrk->acct_tmp.pass++; sp->sendbody = 1; sp->step = STP_FETCH; - wrk->busyobj = VBE_GetBusyObj(); return (0); } @@ -1405,6 +1406,7 @@ cnt_pipe(struct sess *sp) CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); wrk->acct_tmp.pipe++; + wrk->busyobj = VBE_GetBusyObj(wrk); WS_Reset(wrk->ws, NULL); http_Setup(wrk->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_PIPE); @@ -1417,6 +1419,7 @@ cnt_pipe(struct sess *sp) PipeSession(sp); assert(WRW_IsReleased(wrk)); + VBE_DerefBusyObj(wrk, &wrk->busyobj); http_Setup(wrk->bereq, NULL); sp->step = STP_DONE; return (0); diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c index e33cdbe..0bd002d 100644 --- a/bin/varnishd/cache/cache_hash.c +++ b/bin/varnishd/cache/cache_hash.c @@ -452,7 +452,7 @@ HSH_Lookup(struct sess *sp, struct objhead **poh) oc->refcnt = 1; AZ(w->busyobj); - w->busyobj = VBE_GetBusyObj(); + w->busyobj = VBE_GetBusyObj(w); VRY_Validate(sp->vary_b); if (sp->vary_l != NULL) From phk at varnish-cache.org Wed Dec 7 10:17:57 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Wed, 07 Dec 2011 11:17:57 +0100 Subject: [master] f483dd6 Replace 'w' with 'wrk' as the variable for worker thread. Message-ID: commit f483dd61d454efd7b8b79f50496237ad73f8ad83 Author: Poul-Henning Kamp Date: Wed Dec 7 10:17:36 2011 +0000 Replace 'w' with 'wrk' as the variable for worker thread. diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c index 0bd002d..8a73f6c 100644 --- a/bin/varnishd/cache/cache_hash.c +++ b/bin/varnishd/cache/cache_hash.c @@ -68,86 +68,86 @@ static const struct hash_slinger *hash; void HSH_Prealloc(const struct sess *sp) { - struct worker *w; + struct worker *wrk; struct objhead *oh; struct objcore *oc; struct waitinglist *wl; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); - w = sp->wrk; + wrk = sp->wrk; - if (w->nobjcore == NULL) { + if (wrk->nobjcore == NULL) { ALLOC_OBJ(oc, OBJCORE_MAGIC); XXXAN(oc); - w->nobjcore = oc; - w->stats.n_objectcore++; + wrk->nobjcore = oc; + wrk->stats.n_objectcore++; oc->flags |= OC_F_BUSY; } - CHECK_OBJ_NOTNULL(w->nobjcore, OBJCORE_MAGIC); + CHECK_OBJ_NOTNULL(wrk->nobjcore, OBJCORE_MAGIC); - if (w->nobjhead == NULL) { + if (wrk->nobjhead == NULL) { ALLOC_OBJ(oh, OBJHEAD_MAGIC); XXXAN(oh); oh->refcnt = 1; VTAILQ_INIT(&oh->objcs); Lck_New(&oh->mtx, lck_objhdr); - w->nobjhead = oh; - w->stats.n_objecthead++; + wrk->nobjhead = oh; + wrk->stats.n_objecthead++; } - CHECK_OBJ_NOTNULL(w->nobjhead, OBJHEAD_MAGIC); + CHECK_OBJ_NOTNULL(wrk->nobjhead, OBJHEAD_MAGIC); - if (w->nwaitinglist == NULL) { + if (wrk->nwaitinglist == NULL) { ALLOC_OBJ(wl, WAITINGLIST_MAGIC); XXXAN(wl); VTAILQ_INIT(&wl->list); - w->nwaitinglist = wl; - w->stats.n_waitinglist++; + wrk->nwaitinglist = wl; + wrk->stats.n_waitinglist++; } - CHECK_OBJ_NOTNULL(w->nwaitinglist, WAITINGLIST_MAGIC); + CHECK_OBJ_NOTNULL(wrk->nwaitinglist, WAITINGLIST_MAGIC); if (hash->prep != NULL) hash->prep(sp); } void -HSH_Cleanup(struct worker *w) +HSH_Cleanup(struct worker *wrk) { - if (w->nobjcore != NULL) { - FREE_OBJ(w->nobjcore); - w->stats.n_objectcore--; - w->nobjcore = NULL; + if (wrk->nobjcore != NULL) { + FREE_OBJ(wrk->nobjcore); + wrk->stats.n_objectcore--; + wrk->nobjcore = NULL; } - if (w->nobjhead != NULL) { - Lck_Delete(&w->nobjhead->mtx); - FREE_OBJ(w->nobjhead); - w->nobjhead = NULL; - w->stats.n_objecthead--; + if (wrk->nobjhead != NULL) { + Lck_Delete(&wrk->nobjhead->mtx); + FREE_OBJ(wrk->nobjhead); + wrk->nobjhead = NULL; + wrk->stats.n_objecthead--; } - if (w->nwaitinglist != NULL) { - FREE_OBJ(w->nwaitinglist); - w->nwaitinglist = NULL; + if (wrk->nwaitinglist != NULL) { + FREE_OBJ(wrk->nwaitinglist); + wrk->nwaitinglist = NULL; } - if (w->nhashpriv != NULL) { + if (wrk->nhashpriv != NULL) { /* XXX: If needed, add slinger method for this */ - free(w->nhashpriv); - w->nhashpriv = NULL; + free(wrk->nhashpriv); + wrk->nhashpriv = NULL; } - /* if (w->nbusyobj != NULL) { */ - /* FREE_OBJ(w->nbusyobj); */ - /* w->nbusyobj = NULL; */ + /* if (wrk->nbusyobj != NULL) { */ + /* FREE_OBJ(wrk->nbusyobj); */ + /* wrk->nbusyobj = NULL; */ /* } */ } void -HSH_DeleteObjHead(struct worker *w, struct objhead *oh) +HSH_DeleteObjHead(struct worker *wrk, struct objhead *oh) { AZ(oh->refcnt); assert(VTAILQ_EMPTY(&oh->objcs)); Lck_Delete(&oh->mtx); - w->stats.n_objecthead--; + wrk->stats.n_objecthead--; FREE_OBJ(oh); } @@ -251,31 +251,31 @@ hsh_testmagic(void *result) struct objcore * HSH_Insert(const struct sess *sp) { - struct worker *w; + struct worker *wrk; struct objhead *oh; struct objcore *oc; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); AN(hash); - w = sp->wrk; + wrk = sp->wrk; HSH_Prealloc(sp); if (cache_param->diag_bitmap & 0x80000000) hsh_testmagic(sp->wrk->nobjhead->digest); AZ(sp->hash_objhead); - AN(w->nobjhead); - oh = hash->lookup(sp, w->nobjhead); + AN(wrk->nobjhead); + oh = hash->lookup(sp, wrk->nobjhead); CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC); - if (oh == w->nobjhead) - w->nobjhead = NULL; + if (oh == wrk->nobjhead) + wrk->nobjhead = NULL; Lck_Lock(&oh->mtx); assert(oh->refcnt > 0); /* Insert (precreated) objcore in objecthead */ - oc = w->nobjcore; - w->nobjcore = NULL; + oc = wrk->nobjcore; + wrk->nobjcore = NULL; oc->refcnt = 1; CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); AZ(oc->flags & OC_F_BUSY); @@ -294,7 +294,7 @@ HSH_Insert(const struct sess *sp) struct objcore * HSH_Lookup(struct sess *sp, struct objhead **poh) { - struct worker *w; + struct worker *wrk; struct objhead *oh; struct objcore *oc; struct objcore *busy_oc, *grace_oc; @@ -306,7 +306,7 @@ HSH_Lookup(struct sess *sp, struct objhead **poh) CHECK_OBJ_NOTNULL(sp->http, HTTP_MAGIC); AN(sp->director); AN(hash); - w = sp->wrk; + wrk = sp->wrk; HSH_Prealloc(sp); memcpy(sp->wrk->nobjhead->digest, sp->digest, sizeof sp->digest); @@ -322,10 +322,10 @@ HSH_Lookup(struct sess *sp, struct objhead **poh) oh = sp->hash_objhead; sp->hash_objhead = NULL; } else { - AN(w->nobjhead); - oh = hash->lookup(sp, w->nobjhead); - if (oh == w->nobjhead) - w->nobjhead = NULL; + AN(wrk->nobjhead); + oh = hash->lookup(sp, wrk->nobjhead); + if (oh == wrk->nobjhead) + wrk->nobjhead = NULL; } CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC); @@ -446,20 +446,20 @@ HSH_Lookup(struct sess *sp, struct objhead **poh) } /* Insert (precreated) objcore in objecthead */ - oc = w->nobjcore; - w->nobjcore = NULL; + oc = wrk->nobjcore; + wrk->nobjcore = NULL; AN(oc->flags & OC_F_BUSY); oc->refcnt = 1; - AZ(w->busyobj); - w->busyobj = VBE_GetBusyObj(w); + AZ(wrk->busyobj); + wrk->busyobj = VBE_GetBusyObj(wrk); VRY_Validate(sp->vary_b); if (sp->vary_l != NULL) - w->busyobj->vary = sp->vary_b; + wrk->busyobj->vary = sp->vary_b; else - w->busyobj->vary = NULL; - oc->busyobj = w->busyobj; + wrk->busyobj->vary = NULL; + oc->busyobj = wrk->busyobj; /* * Busy objects go on the tail, so they will not trip up searches. @@ -659,7 +659,7 @@ HSH_Ref(struct objcore *oc) */ int -HSH_Deref(struct worker *w, struct objcore *oc, struct object **oo) +HSH_Deref(struct worker *wrk, struct objcore *oc, struct object **oo) { struct object *o = NULL; struct objhead *oh; @@ -682,7 +682,7 @@ HSH_Deref(struct worker *w, struct objcore *oc, struct object **oo) */ STV_Freestore(o); STV_free(o->objstore); - w->stats.n_object--; + wrk->stats.n_object--; return (0); } @@ -712,16 +712,16 @@ HSH_Deref(struct worker *w, struct objcore *oc, struct object **oo) if (oc->methods != NULL) { oc_freeobj(oc); - w->stats.n_object--; + wrk->stats.n_object--; } FREE_OBJ(oc); - w->stats.n_objectcore--; + wrk->stats.n_objectcore--; /* Drop our ref on the objhead */ assert(oh->refcnt > 0); if (hash->deref(oh)) return (0); - HSH_DeleteObjHead(w, oh); + HSH_DeleteObjHead(wrk, oh); return (0); } From phk at varnish-cache.org Wed Dec 7 10:31:26 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Wed, 07 Dec 2011 11:31:26 +0100 Subject: [master] 67a4826 Move beresp and bereq to busyobj, but leave the memory allocation in worker for now. Message-ID: commit 67a48263698c6cd5fb8c9e43768805345cc5bea6 Author: Poul-Henning Kamp Date: Wed Dec 7 10:30:44 2011 +0000 Move beresp and bereq to busyobj, but leave the memory allocation in worker for now. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 56f23fd..24c1dc9 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -328,8 +328,8 @@ struct worker { const char *storage_hint; /* Fetch stuff. Here because pipe has no busyobj */ - struct http *bereq; - struct http *beresp; + struct http *x_bereq; + struct http *x_beresp; /* Stream state */ struct stream_ctx *sctx; @@ -510,6 +510,8 @@ struct busyobj { struct vgz *vgz_rx; struct vbc *vbc; + struct http *bereq; + struct http *beresp; struct object *fetch_obj; struct exp exp; struct http_conn htc; diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index 21c1a4c..cf9d60f 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -96,6 +96,8 @@ VBE_GetBusyObj(struct worker *wrk) busyobj = vbe_NewBusyObj(); AN(busyobj); busyobj->refcount = 1; + busyobj->beresp = wrk->x_beresp; + busyobj->bereq = wrk->x_bereq; return (busyobj); } @@ -162,10 +164,10 @@ VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc) { CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(wrk->bereq, HTTP_MAGIC); + CHECK_OBJ_NOTNULL(wrk->busyobj->bereq, HTTP_MAGIC); CHECK_OBJ_NOTNULL(vbc, VBC_MAGIC); CHECK_OBJ_NOTNULL(vbc->vdis, VDI_SIMPLE_MAGIC); - http_PrintfHeader(wrk, vbc->vsl_id, wrk->bereq, + http_PrintfHeader(wrk, vbc->vsl_id, wrk->busyobj->bereq, "Host: %s", vbc->vdis->vrt->hosthdr); } diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index 79e7956..442e2bb 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -262,8 +262,6 @@ cnt_prepresp(struct sess *sp) AZ(wrk->obj); sp->restarts++; sp->director = NULL; - http_Setup(wrk->bereq, NULL); - http_Setup(wrk->beresp, NULL); http_Setup(wrk->resp, NULL); sp->step = STP_RECV; return (0); @@ -476,8 +474,8 @@ cnt_error(struct sess *sp) if (wrk->obj == NULL) { sp->doclose = "Out of objects"; sp->director = NULL; - http_Setup(wrk->beresp, NULL); - http_Setup(wrk->bereq, NULL); + http_Setup(wrk->busyobj->beresp, NULL); + http_Setup(wrk->busyobj->bereq, NULL); sp->step = STP_DONE; return(0); } @@ -526,7 +524,7 @@ cnt_error(struct sess *sp) assert(sp->handling == VCL_RET_DELIVER); sp->err_code = 0; sp->err_reason = NULL; - http_Setup(wrk->bereq, NULL); + http_Setup(wrk->busyobj->bereq, NULL); VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_PREPRESP; return (0); @@ -579,9 +577,9 @@ cnt_fetch(struct sess *sp) AZ(wrk->busyobj->should_close); AZ(wrk->storage_hint); - http_Setup(wrk->beresp, wrk->ws); + http_Setup(wrk->busyobj->beresp, wrk->ws); - need_host_hdr = !http_GetHdr(wrk->bereq, H_Host, NULL); + need_host_hdr = !http_GetHdr(wrk->busyobj->bereq, H_Host, NULL); i = FetchHdr(sp, need_host_hdr); /* @@ -603,8 +601,8 @@ cnt_fetch(struct sess *sp) * and we rely on their content outside of VCL, so collect them * into one line here. */ - http_CollectHdr(wrk->beresp, H_Cache_Control); - http_CollectHdr(wrk->beresp, H_Vary); + http_CollectHdr(wrk->busyobj->beresp, H_Cache_Control); + http_CollectHdr(wrk->busyobj->beresp, H_Vary); /* * Figure out how the fetch is supposed to happen, before the @@ -613,7 +611,7 @@ cnt_fetch(struct sess *sp) */ wrk->busyobj->body_status = RFC2616_Body(sp); - sp->err_code = http_GetStatus(wrk->beresp); + sp->err_code = http_GetStatus(wrk->busyobj->beresp); /* * What does RFC2616 think about TTL ? @@ -657,8 +655,6 @@ cnt_fetch(struct sess *sp) wrk->objcore = NULL; } VBE_DerefBusyObj(wrk, &wrk->busyobj); - http_Setup(wrk->bereq, NULL); - http_Setup(wrk->beresp, NULL); sp->director = NULL; wrk->storage_hint = NULL; @@ -748,10 +744,10 @@ cnt_fetchbody(struct sess *sp) wrk->busyobj->do_gzip = wrk->busyobj->do_gunzip = 0; wrk->busyobj->is_gzip = - http_HdrIs(wrk->beresp, H_Content_Encoding, "gzip"); + http_HdrIs(wrk->busyobj->beresp, H_Content_Encoding, "gzip"); wrk->busyobj->is_gunzip = - !http_GetHdr(wrk->beresp, H_Content_Encoding, NULL); + !http_GetHdr(wrk->busyobj->beresp, H_Content_Encoding, NULL); /* It can't be both */ assert(wrk->busyobj->is_gzip == 0 || wrk->busyobj->is_gunzip == 0); @@ -762,7 +758,7 @@ cnt_fetchbody(struct sess *sp) /* If we do gunzip, remove the C-E header */ if (wrk->busyobj->do_gunzip) - http_Unset(wrk->beresp, H_Content_Encoding); + http_Unset(wrk->busyobj->beresp, H_Content_Encoding); /* We wont gzip unless it is ungziped */ if (wrk->busyobj->do_gzip && !wrk->busyobj->is_gunzip) @@ -770,7 +766,7 @@ cnt_fetchbody(struct sess *sp) /* If we do gzip, add the C-E header */ if (wrk->busyobj->do_gzip) - http_SetHeader(wrk, sp->vsl_id, wrk->beresp, + http_SetHeader(wrk, sp->vsl_id, wrk->busyobj->beresp, "Content-Encoding: gzip"); /* But we can't do both at the same time */ @@ -791,13 +787,13 @@ cnt_fetchbody(struct sess *sp) if (!sp->wantbody) wrk->busyobj->do_stream = 0; - l = http_EstimateWS(wrk->beresp, + l = http_EstimateWS(wrk->busyobj->beresp, pass ? HTTPH_R_PASS : HTTPH_A_INS, &nhttp); /* Create Vary instructions */ if (wrk->objcore != NULL) { CHECK_OBJ_NOTNULL(wrk->objcore, OBJCORE_MAGIC); - vary = VRY_Create(sp, wrk->beresp); + vary = VRY_Create(sp, wrk->busyobj->beresp); if (vary != NULL) { varyl = VSB_len(vary); assert(varyl > 0); @@ -855,7 +851,7 @@ cnt_fetchbody(struct sess *sp) WS_Assert(wrk->obj->ws_o); /* Filter into object */ - hp = wrk->beresp; + hp = wrk->busyobj->beresp; hp2 = wrk->obj->http; hp2->logtag = HTTP_Obj; @@ -891,8 +887,8 @@ cnt_fetchbody(struct sess *sp) /* Use unmodified headers*/ i = FetchBody(wrk, wrk->obj); - http_Setup(wrk->bereq, NULL); - http_Setup(wrk->beresp, NULL); + http_Setup(wrk->busyobj->bereq, NULL); + http_Setup(wrk->busyobj->beresp, NULL); wrk->busyobj->vfp = NULL; assert(WRW_IsReleased(wrk)); AZ(wrk->busyobj->vbc); @@ -961,8 +957,8 @@ cnt_streambody(struct sess *sp) i = FetchBody(wrk, wrk->obj); - http_Setup(wrk->bereq, NULL); - http_Setup(wrk->beresp, NULL); + http_Setup(wrk->busyobj->bereq, NULL); + http_Setup(wrk->busyobj->beresp, NULL); wrk->busyobj->vfp = NULL; AZ(wrk->busyobj->vbc); AN(sp->director); @@ -1075,8 +1071,8 @@ cnt_hit(struct sess *sp) if (sp->handling == VCL_RET_DELIVER) { /* Dispose of any body part of the request */ (void)FetchReqBody(sp); - AZ(wrk->bereq->ws); - AZ(wrk->beresp->ws); + //AZ(wrk->busyobj->bereq->ws); + //AZ(wrk->busyobj->beresp->ws); sp->step = STP_PREPRESP; return (0); } @@ -1257,17 +1253,18 @@ cnt_miss(struct sess *sp) AN(wrk->objcore); CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); WS_Reset(wrk->ws, NULL); - http_Setup(wrk->bereq, wrk->ws); + wrk->busyobj = VBE_GetBusyObj(wrk); + http_Setup(wrk->busyobj->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_FETCH); - http_ForceGet(wrk->bereq); + http_ForceGet(wrk->busyobj->bereq); if (cache_param->http_gzip_support) { /* * We always ask the backend for gzip, even if the * client doesn't grok it. We will uncompress for * the minority of clients which don't. */ - http_Unset(wrk->bereq, H_Accept_Encoding); - http_SetHeader(wrk, sp->vsl_id, wrk->bereq, + http_Unset(wrk->busyobj->bereq, H_Accept_Encoding); + http_SetHeader(wrk, sp->vsl_id, wrk->busyobj->bereq, "Accept-Encoding: gzip"); } wrk->connect_timeout = 0; @@ -1280,7 +1277,7 @@ cnt_miss(struct sess *sp) case VCL_RET_ERROR: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; - http_Setup(wrk->bereq, NULL); + http_Setup(wrk->busyobj->bereq, NULL); VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_ERROR; return (0); @@ -1350,7 +1347,8 @@ cnt_pass(struct sess *sp) wrk->busyobj = VBE_GetBusyObj(wrk); WS_Reset(wrk->ws, NULL); - http_Setup(wrk->bereq, wrk->ws); + wrk->busyobj = VBE_GetBusyObj(wrk); + http_Setup(wrk->busyobj->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_PASS); wrk->connect_timeout = 0; @@ -1358,7 +1356,7 @@ cnt_pass(struct sess *sp) wrk->between_bytes_timeout = 0; VCL_pass_method(sp); if (sp->handling == VCL_RET_ERROR) { - http_Setup(wrk->bereq, NULL); + http_Setup(wrk->busyobj->bereq, NULL); VBE_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_ERROR; return (0); @@ -1404,11 +1402,13 @@ cnt_pipe(struct sess *sp) wrk = sp->wrk; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); + AZ(wrk->busyobj); wrk->acct_tmp.pipe++; wrk->busyobj = VBE_GetBusyObj(wrk); WS_Reset(wrk->ws, NULL); - http_Setup(wrk->bereq, wrk->ws); + wrk->busyobj = VBE_GetBusyObj(wrk); + http_Setup(wrk->busyobj->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_PIPE); VCL_pipe_method(sp); @@ -1419,8 +1419,8 @@ cnt_pipe(struct sess *sp) PipeSession(sp); assert(WRW_IsReleased(wrk)); + http_Setup(wrk->busyobj->bereq, NULL); VBE_DerefBusyObj(wrk, &wrk->busyobj); - http_Setup(wrk->bereq, NULL); sp->step = STP_DONE; return (0); } diff --git a/bin/varnishd/cache/cache_dir_dns.c b/bin/varnishd/cache/cache_dir_dns.c index f735ebf..56bce48 100644 --- a/bin/varnishd/cache/cache_dir_dns.c +++ b/bin/varnishd/cache/cache_dir_dns.c @@ -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->bereq) - hp = sp->wrk->bereq; + if (sp->wrk->busyobj != NULL && sp->wrk->busyobj->bereq) + hp = sp->wrk->busyobj->bereq; else hp = sp->http; diff --git a/bin/varnishd/cache/cache_esi_parse.c b/bin/varnishd/cache/cache_esi_parse.c index e431a8d..8352717 100644 --- a/bin/varnishd/cache/cache_esi_parse.c +++ b/bin/varnishd/cache/cache_esi_parse.c @@ -499,7 +499,7 @@ vep_do_include(struct vep_state *vep, enum dowhat what) VSB_printf(vep->vsb, "%c", 0); } else { VSB_printf(vep->vsb, "%c", 0); - url = vep->wrk->bereq->hd[HTTP_HDR_URL]; + url = vep->wrk->busyobj->bereq->hd[HTTP_HDR_URL]; /* Look for the last / before a '?' */ h = NULL; for (q = url.b; q < url.e && *q != '?'; q++) diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c index 8a1ac5b..936dc30 100644 --- a/bin/varnishd/cache/cache_fetch.c +++ b/bin/varnishd/cache/cache_fetch.c @@ -398,7 +398,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) AN(sp->wrk->objcore->flags & OC_F_BUSY); } - hp = wrk->bereq; + hp = wrk->busyobj->bereq; sp->wrk->busyobj->vbc = VDI_GetFd(NULL, sp); if (sp->wrk->busyobj->vbc == NULL) { @@ -470,7 +470,7 @@ FetchHdr(struct sess *sp, int need_host_hdr) } } - hp = wrk->beresp; + hp = wrk->busyobj->beresp; if (http_DissectResponse(wrk, htc, hp)) { WSP(sp, SLT_FetchError, "http format error"); diff --git a/bin/varnishd/cache/cache_http.c b/bin/varnishd/cache/cache_http.c index 267af00..4a6ba82 100644 --- a/bin/varnishd/cache/cache_http.c +++ b/bin/varnishd/cache/cache_http.c @@ -869,7 +869,7 @@ http_FilterHeader(const struct sess *sp, unsigned how) { struct http *hp; - hp = sp->wrk->bereq; + hp = sp->wrk->busyobj->bereq; CHECK_OBJ_NOTNULL(hp, HTTP_MAGIC); hp->logtag = HTTP_Tx; diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c index 9fa14e0..94a4c09 100644 --- a/bin/varnishd/cache/cache_panic.c +++ b/bin/varnishd/cache/cache_panic.c @@ -197,10 +197,10 @@ pan_wrk(const struct worker *wrk) VSB_printf(pan_vsp, " worker = %p {\n", wrk); pan_ws(wrk->ws, 4); - if (wrk->bereq->ws != NULL) - pan_http("bereq", wrk->bereq, 4); - if (wrk->beresp->ws != NULL) - pan_http("beresp", wrk->beresp, 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); if (wrk->resp->ws != NULL) pan_http("resp", wrk->resp, 4); VSB_printf(pan_vsp, " },\n"); diff --git a/bin/varnishd/cache/cache_pipe.c b/bin/varnishd/cache/cache_pipe.c index 5337eda..8963fb7 100644 --- a/bin/varnishd/cache/cache_pipe.c +++ b/bin/varnishd/cache/cache_pipe.c @@ -78,7 +78,7 @@ PipeSession(struct sess *sp) WRW_Reserve(w, &vc->fd); sp->wrk->acct_tmp.hdrbytes += - http_Write(w, sp->vsl_id, sp->wrk->bereq, 0); + http_Write(w, sp->vsl_id, sp->wrk->busyobj->bereq, 0); if (sp->htc->pipeline.b != NULL) sp->wrk->acct_tmp.bodybytes += diff --git a/bin/varnishd/cache/cache_pool.c b/bin/varnishd/cache/cache_pool.c index 582bb70..cf40e85 100644 --- a/bin/varnishd/cache/cache_pool.c +++ b/bin/varnishd/cache/cache_pool.c @@ -196,8 +196,8 @@ Pool_Work_Thread(void *priv, struct worker *w) Lck_AssertHeld(&pp->mtx); CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->bereq, HTTP_MAGIC); - CHECK_OBJ_NOTNULL(w->beresp, HTTP_MAGIC); + CHECK_OBJ_NOTNULL(w->x_bereq, HTTP_MAGIC); + CHECK_OBJ_NOTNULL(w->x_beresp, HTTP_MAGIC); CHECK_OBJ_NOTNULL(w->resp, HTTP_MAGIC); WS_Reset(w->ws, NULL); @@ -267,8 +267,7 @@ Pool_Work_Thread(void *priv, struct worker *w) w->sp = NULL; WS_Assert(w->ws); - AZ(w->bereq->ws); - AZ(w->beresp->ws); + AZ(w->busyobj); AZ(w->resp->ws); AZ(w->wrw.wfd); AZ(w->storage_hint); diff --git a/bin/varnishd/cache/cache_rfc2616.c b/bin/varnishd/cache/cache_rfc2616.c index 599ffbb..6e7efea 100644 --- a/bin/varnishd/cache/cache_rfc2616.c +++ b/bin/varnishd/cache/cache_rfc2616.c @@ -73,7 +73,7 @@ RFC2616_Ttl(const struct sess *sp) expp = &sp->wrk->busyobj->exp; - hp = sp->wrk->beresp; + hp = sp->wrk->busyobj->beresp; assert(expp->entered != 0.0 && !isnan(expp->entered)); /* If all else fails, cache using default ttl */ @@ -183,7 +183,7 @@ RFC2616_Body(const struct sess *sp) struct http *hp; char *b; - hp = sp->wrk->beresp; + hp = sp->wrk->busyobj->beresp; if (hp->protover < 11 && !http_HdrIs(hp, H_Connection, "keep-alive")) sp->wrk->busyobj->should_close = 1; @@ -192,7 +192,7 @@ RFC2616_Body(const struct sess *sp) else sp->wrk->busyobj->should_close = 0; - if (!strcasecmp(http_GetReq(sp->wrk->bereq), "head")) { + if (!strcasecmp(http_GetReq(sp->wrk->busyobj->bereq), "head")) { /* * A HEAD request can never have a body in the reply, * no matter what the headers might say. diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c index bbf93b5..a696f64 100644 --- a/bin/varnishd/cache/cache_vrt.c +++ b/bin/varnishd/cache/cache_vrt.c @@ -100,10 +100,10 @@ vrt_selecthttp(const struct sess *sp, enum gethdr_e where) hp = sp->http; break; case HDR_BEREQ: - hp = sp->wrk->bereq; + hp = sp->wrk->busyobj->bereq; break; case HDR_BERESP: - hp = sp->wrk->beresp; + hp = sp->wrk->busyobj->beresp; break; case HDR_RESP: hp = sp->wrk->resp; diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c index cb54837..0662e26 100644 --- a/bin/varnishd/cache/cache_vrt_var.c +++ b/bin/varnishd/cache/cache_vrt_var.c @@ -85,15 +85,15 @@ VRT_r_##obj##_##hdr(const struct sess *sp) \ VRT_DO_HDR(req, request, sp->http, HTTP_HDR_REQ) VRT_DO_HDR(req, url, sp->http, HTTP_HDR_URL) VRT_DO_HDR(req, proto, sp->http, HTTP_HDR_PROTO) -VRT_DO_HDR(bereq, request, sp->wrk->bereq, HTTP_HDR_REQ) -VRT_DO_HDR(bereq, url, sp->wrk->bereq, HTTP_HDR_URL) -VRT_DO_HDR(bereq, proto, sp->wrk->bereq, 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(obj, proto, sp->wrk->obj->http, HTTP_HDR_PROTO) VRT_DO_HDR(obj, response, sp->wrk->obj->http, HTTP_HDR_RESPONSE) VRT_DO_HDR(resp, proto, sp->wrk->resp, HTTP_HDR_PROTO) VRT_DO_HDR(resp, response, sp->wrk->resp, HTTP_HDR_RESPONSE) -VRT_DO_HDR(beresp, proto, sp->wrk->beresp, HTTP_HDR_PROTO) -VRT_DO_HDR(beresp, response, sp->wrk->beresp, 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) /*--------------------------------------------------------------------*/ @@ -115,7 +115,7 @@ VRT_r_##obj##_status(const struct sess *sp) \ } VRT_DO_STATUS(obj, sp->wrk->obj->http) -VRT_DO_STATUS(beresp, sp->wrk->beresp) +VRT_DO_STATUS(beresp, sp->wrk->busyobj->beresp) VRT_DO_STATUS(resp, sp->wrk->resp) /*--------------------------------------------------------------------*/ diff --git a/bin/varnishd/cache/cache_wrk.c b/bin/varnishd/cache/cache_wrk.c index 1d80805..73eedb2 100644 --- a/bin/varnishd/cache/cache_wrk.c +++ b/bin/varnishd/cache/cache_wrk.c @@ -153,8 +153,8 @@ wrk_thread_real(void *priv, unsigned shm_workspace, unsigned sess_workspace, w->wlb = w->wlp = wlog; w->wle = wlog + (sizeof wlog) / 4; w->sha256ctx = &sha256; - w->bereq = HTTP_create(http0, nhttp); - w->beresp = HTTP_create(http1, nhttp); + w->x_bereq = HTTP_create(http0, nhttp); + w->x_beresp = HTTP_create(http1, nhttp); w->resp = HTTP_create(http2, nhttp); w->wrw.iov = iov; w->wrw.siov = siov; From phk at varnish-cache.org Wed Dec 7 10:32:14 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Wed, 07 Dec 2011 11:32:14 +0100 Subject: [master] 367c381 Missed part of last commit. Message-ID: commit 367c3817b1fef87cf3c008f0014415d1339c5812 Author: Poul-Henning Kamp Date: Wed Dec 7 10:31:56 2011 +0000 Missed part of last commit. diff --git a/lib/libvmod_std/vmod_std.c b/lib/libvmod_std/vmod_std.c index 14d8503..fc371e7 100644 --- a/lib/libvmod_std/vmod_std.c +++ b/lib/libvmod_std/vmod_std.c @@ -192,7 +192,7 @@ vmod_collect(struct sess *sp, enum gethdr_e e, const char *h) (void)h; if (e == HDR_REQ) http_CollectHdr(sp->http, h); - else if (e == HDR_BERESP) - http_CollectHdr(sp->wrk->beresp, h); + else if (e == HDR_BERESP && sp->wrk->busyobj != NULL) + http_CollectHdr(sp->wrk->busyobj->beresp, h); } From phk at varnish-cache.org Thu Dec 8 06:17:54 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 08 Dec 2011 07:17:54 +0100 Subject: [master] 0bcfeee Move busyobj to their own source file, they are not really backend related and will have somewhat complex semantics. Message-ID: commit 0bcfeee0ae14213f4277b199dadaaab481b7273f Author: Poul-Henning Kamp Date: Thu Dec 8 06:17:22 2011 +0000 Move busyobj to their own source file, they are not really backend related and will have somewhat complex semantics. diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am index 2116701..a4bae7f 100644 --- a/bin/varnishd/Makefile.am +++ b/bin/varnishd/Makefile.am @@ -16,6 +16,7 @@ varnishd_SOURCES = \ cache/cache_backend_cfg.c \ cache/cache_backend_poll.c \ cache/cache_ban.c \ + cache/cache_busyobj.c \ cache/cache_center.c \ cache/cache_cli.c \ cache/cache_dir.c \ diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 24c1dc9..0ee855b 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -673,12 +673,6 @@ void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp); void VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc); void VBE_Poll(void); -/* cache_backend.c */ -void VBE_Init(void); -struct busyobj *VBE_GetBusyObj(struct worker *wrk); -struct busyobj *VBE_RefBusyObj(struct busyobj *busyobj); -void VBE_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj); - /* cache_backend_cfg.c */ void VBE_InitCfg(void); struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb); @@ -703,6 +697,12 @@ struct ban *BAN_RefBan(struct objcore *oc, double t0, const struct ban *tail); void BAN_TailDeref(struct ban **ban); double BAN_Time(const struct ban *ban); +/* cache_busyobj.c */ +void VBO_Init(void); +struct busyobj *VBO_GetBusyObj(struct worker *wrk); +struct busyobj *VBO_RefBusyObj(struct busyobj *busyobj); +void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj); + /* cache_center.c [CNT] */ void CNT_Session(struct sess *sp); void CNT_Init(void); diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index cf9d60f..4d2f18a 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -43,105 +43,6 @@ #include "vrt.h" #include "vtcp.h" -static struct lock nbusyobj_mtx; -static struct busyobj *nbusyobj; - -void -VBE_Init(void) -{ - Lck_New(&nbusyobj_mtx, lck_nbusyobj); - nbusyobj = NULL; -} - -/*-------------------------------------------------------------------- - * BusyObj handling - */ - -static struct busyobj * -vbe_NewBusyObj(void) -{ - struct busyobj *busyobj; - - ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC); - AN(busyobj); - Lck_New(&busyobj->mtx, lck_busyobj); - return (busyobj); -} - -static void -vbe_FreeBusyObj(struct busyobj *busyobj) -{ - CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); - AZ(busyobj->refcount); - Lck_Delete(&busyobj->mtx); - FREE_OBJ(busyobj); -} - -struct busyobj * -VBE_GetBusyObj(struct worker *wrk) -{ - struct busyobj *busyobj = NULL; - - (void)wrk; - Lck_Lock(&nbusyobj_mtx); - if (nbusyobj != NULL) { - CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC); - busyobj = nbusyobj; - nbusyobj = NULL; - memset((char *)busyobj + offsetof(struct busyobj, refcount), 0, - sizeof *busyobj - offsetof(struct busyobj, refcount)); - } - Lck_Unlock(&nbusyobj_mtx); - if (busyobj == NULL) - busyobj = vbe_NewBusyObj(); - AN(busyobj); - busyobj->refcount = 1; - busyobj->beresp = wrk->x_beresp; - busyobj->bereq = wrk->x_bereq; - return (busyobj); -} - -struct busyobj * -VBE_RefBusyObj(struct busyobj *busyobj) -{ - CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); - Lck_Lock(&busyobj->mtx); - assert(busyobj->refcount > 0); - busyobj->refcount++; - Lck_Unlock(&busyobj->mtx); - return (busyobj); -} - -void -VBE_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) -{ - struct busyobj *busyobj; - - (void)wrk; - busyobj = *pbo; - CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); - Lck_Lock(&busyobj->mtx); - assert(busyobj->refcount > 0); - busyobj->refcount--; - *pbo = NULL; - if (busyobj->refcount > 0) { - Lck_Unlock(&busyobj->mtx); - return; - } - Lck_Unlock(&busyobj->mtx); - - /* XXX Sanity checks e.g. AZ(busyobj->vbc) */ - - Lck_Lock(&nbusyobj_mtx); - if (nbusyobj == NULL) { - nbusyobj = busyobj; - busyobj = NULL; - } - Lck_Unlock(&nbusyobj_mtx); - if (busyobj != NULL) - vbe_FreeBusyObj(busyobj); -} - /*-------------------------------------------------------------------- * The "simple" director really isn't, since thats where all the actual * connections happen. Nontheless, pretend it is simple by sequestering diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c new file mode 100644 index 0000000..32bad7e --- /dev/null +++ b/bin/varnishd/cache/cache_busyobj.c @@ -0,0 +1,138 @@ +/*- + * Copyright (c) 2006 Verdens Gang AS + * Copyright (c) 2006-2011 Varnish Software AS + * All rights reserved. + * + * Author: Poul-Henning Kamp + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Handle backend connections and backend request structures. + * + */ + +#include "config.h" + +#include +#include +#include + +#include "cache.h" + +static struct lock nbusyobj_mtx; +static struct busyobj *nbusyobj; + +void +VBO_Init(void) +{ + Lck_New(&nbusyobj_mtx, lck_nbusyobj); + nbusyobj = NULL; +} + +/*-------------------------------------------------------------------- + * BusyObj handling + */ + +static struct busyobj * +vbo_NewBusyObj(void) +{ + struct busyobj *busyobj; + + ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC); + AN(busyobj); + Lck_New(&busyobj->mtx, lck_busyobj); + return (busyobj); +} + +static void +vbe_FreeBusyObj(struct busyobj *busyobj) +{ + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + AZ(busyobj->refcount); + Lck_Delete(&busyobj->mtx); + FREE_OBJ(busyobj); +} + +struct busyobj * +VBO_GetBusyObj(struct worker *wrk) +{ + struct busyobj *busyobj = NULL; + + (void)wrk; + Lck_Lock(&nbusyobj_mtx); + if (nbusyobj != NULL) { + CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC); + busyobj = nbusyobj; + nbusyobj = NULL; + memset((char *)busyobj + offsetof(struct busyobj, refcount), 0, + sizeof *busyobj - offsetof(struct busyobj, refcount)); + } + Lck_Unlock(&nbusyobj_mtx); + if (busyobj == NULL) + busyobj = vbo_NewBusyObj(); + AN(busyobj); + busyobj->refcount = 1; + busyobj->beresp = wrk->x_beresp; + busyobj->bereq = wrk->x_bereq; + return (busyobj); +} + +struct busyobj * +VBO_RefBusyObj(struct busyobj *busyobj) +{ + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + Lck_Lock(&busyobj->mtx); + assert(busyobj->refcount > 0); + busyobj->refcount++; + Lck_Unlock(&busyobj->mtx); + return (busyobj); +} + +void +VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) +{ + struct busyobj *busyobj; + + (void)wrk; + busyobj = *pbo; + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); + Lck_Lock(&busyobj->mtx); + assert(busyobj->refcount > 0); + busyobj->refcount--; + *pbo = NULL; + if (busyobj->refcount > 0) { + Lck_Unlock(&busyobj->mtx); + return; + } + Lck_Unlock(&busyobj->mtx); + + /* XXX Sanity checks e.g. AZ(busyobj->vbc) */ + + Lck_Lock(&nbusyobj_mtx); + if (nbusyobj == NULL) { + nbusyobj = busyobj; + busyobj = NULL; + } + Lck_Unlock(&nbusyobj_mtx); + if (busyobj != NULL) + vbe_FreeBusyObj(busyobj); +} diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index 442e2bb..8826ae2 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -255,7 +255,7 @@ cnt_prepresp(struct sess *sp) AN(wrk->busyobj->do_stream); VDI_CloseFd(wrk, &wrk->busyobj->vbc); HSH_Drop(wrk); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); } else { (void)HSH_Deref(wrk, NULL, &wrk->obj); } @@ -464,7 +464,7 @@ cnt_error(struct sess *sp) if (wrk->obj == NULL) { HSH_Prealloc(sp); AZ(wrk->busyobj); - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); wrk->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size, (uint16_t)cache_param->http_max_hdr); if (wrk->obj == NULL) @@ -508,7 +508,7 @@ cnt_error(struct sess *sp) if (sp->handling == VCL_RET_RESTART && sp->restarts < cache_param->max_restarts) { HSH_Drop(wrk); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->director = NULL; sp->restarts++; sp->step = STP_RECV; @@ -525,7 +525,7 @@ cnt_error(struct sess *sp) sp->err_code = 0; sp->err_reason = NULL; http_Setup(wrk->busyobj->bereq, NULL); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_PREPRESP; return (0); } @@ -654,7 +654,7 @@ cnt_fetch(struct sess *sp) AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; } - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->director = NULL; wrk->storage_hint = NULL; @@ -827,7 +827,7 @@ cnt_fetchbody(struct sess *sp) sp->err_code = 503; sp->step = STP_ERROR; VDI_CloseFd(wrk, &wrk->busyobj->vbc); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); return (0); } CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC); @@ -896,7 +896,7 @@ cnt_fetchbody(struct sess *sp) if (i) { HSH_Drop(wrk); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); AZ(wrk->obj); sp->err_code = 503; sp->step = STP_ERROR; @@ -909,7 +909,7 @@ cnt_fetchbody(struct sess *sp) AN(wrk->obj->objcore->ban); HSH_Unbusy(wrk); } - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); wrk->acct_tmp.fetch++; sp->step = STP_PREPRESP; return (0); @@ -983,7 +983,7 @@ cnt_streambody(struct sess *sp) assert(WRW_IsReleased(wrk)); assert(wrk->wrw.ciov == wrk->wrw.siov); (void)HSH_Deref(wrk, NULL, &wrk->obj); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); http_Setup(wrk->resp, NULL); sp->step = STP_DONE; return (0); @@ -1253,7 +1253,7 @@ cnt_miss(struct sess *sp) AN(wrk->objcore); CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC); WS_Reset(wrk->ws, NULL); - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); http_Setup(wrk->busyobj->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_FETCH); http_ForceGet(wrk->busyobj->bereq); @@ -1278,13 +1278,13 @@ cnt_miss(struct sess *sp) AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; http_Setup(wrk->busyobj->bereq, NULL); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_ERROR; return (0); case VCL_RET_PASS: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_PASS; return (0); case VCL_RET_FETCH: @@ -1294,7 +1294,7 @@ cnt_miss(struct sess *sp) case VCL_RET_RESTART: AZ(HSH_Deref(wrk, wrk->objcore, NULL)); wrk->objcore = NULL; - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); INCOMPL(); default: WRONG("Illegal action in vcl_miss{}"); @@ -1345,9 +1345,9 @@ cnt_pass(struct sess *sp) AZ(wrk->obj); AZ(wrk->busyobj); - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); WS_Reset(wrk->ws, NULL); - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); http_Setup(wrk->busyobj->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_PASS); @@ -1357,7 +1357,7 @@ cnt_pass(struct sess *sp) VCL_pass_method(sp); if (sp->handling == VCL_RET_ERROR) { http_Setup(wrk->busyobj->bereq, NULL); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_ERROR; return (0); } @@ -1405,9 +1405,9 @@ cnt_pipe(struct sess *sp) AZ(wrk->busyobj); wrk->acct_tmp.pipe++; - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); WS_Reset(wrk->ws, NULL); - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); http_Setup(wrk->busyobj->bereq, wrk->ws); http_FilterHeader(sp, HTTPH_R_PIPE); @@ -1420,7 +1420,7 @@ cnt_pipe(struct sess *sp) PipeSession(sp); assert(WRW_IsReleased(wrk)); http_Setup(wrk->busyobj->bereq, NULL); - VBE_DerefBusyObj(wrk, &wrk->busyobj); + VBO_DerefBusyObj(wrk, &wrk->busyobj); sp->step = STP_DONE; return (0); } diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c index 8a73f6c..675afea 100644 --- a/bin/varnishd/cache/cache_hash.c +++ b/bin/varnishd/cache/cache_hash.c @@ -452,7 +452,7 @@ HSH_Lookup(struct sess *sp, struct objhead **poh) oc->refcnt = 1; AZ(wrk->busyobj); - wrk->busyobj = VBE_GetBusyObj(wrk); + wrk->busyobj = VBO_GetBusyObj(wrk); VRY_Validate(sp->vary_b); if (sp->vary_l != NULL) diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index fbe7624..a10b0fe 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -117,7 +117,7 @@ child_main(void) HTTP_Init(); - VBE_Init(); + VBO_Init(); VBE_InitCfg(); VBP_Init(); WRK_Init(); From phk at varnish-cache.org Thu Dec 8 07:13:45 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 08 Dec 2011 08:13:45 +0100 Subject: [master] 0dd1ee2 Complete the busyobj management code by adding a (default-on) per worker cache and a wrapper structure (needed for $param sized elements) and two new stats counters. Message-ID: commit 0dd1ee21b69f043ad55219c592454d17dd8739db Author: Poul-Henning Kamp Date: Thu Dec 8 07:12:33 2011 +0000 Complete the busyobj management code by adding a (default-on) per worker cache and a wrapper structure (needed for $param sized elements) and two new stats counters. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 0ee855b..4435c32 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -106,6 +106,7 @@ struct pool; struct sess; struct sesspool; struct vbc; +struct vbo; struct vef_priv; struct vrt_backend; struct vsb; @@ -293,7 +294,7 @@ struct worker { struct objhead *nobjhead; struct objcore *nobjcore; struct waitinglist *nwaitinglist; - /* struct busyobj *nbusyobj; */ + struct vbo *nvbo; void *nhashpriv; struct dstat stats; @@ -496,9 +497,7 @@ oc_getlru(const struct objcore *oc) struct busyobj { unsigned magic; #define BUSYOBJ_MAGIC 0x23b95567 - struct lock mtx; - /* Members passed this line are cleared on reuse */ - unsigned refcount; + struct vbo *vbo; uint8_t *vary; unsigned is_gzip; @@ -700,8 +699,9 @@ double BAN_Time(const struct ban *ban); /* cache_busyobj.c */ void VBO_Init(void); struct busyobj *VBO_GetBusyObj(struct worker *wrk); -struct busyobj *VBO_RefBusyObj(struct busyobj *busyobj); +void VBO_RefBusyObj(const struct busyobj *busyobj); void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj); +void VBO_Free(struct vbo **vbo); /* cache_center.c [CNT] */ void CNT_Session(struct sess *sp); diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c index 32bad7e..4272725 100644 --- a/bin/varnishd/cache/cache_busyobj.c +++ b/bin/varnishd/cache/cache_busyobj.c @@ -1,8 +1,8 @@ /*- - * Copyright (c) 2006 Verdens Gang AS - * Copyright (c) 2006-2011 Varnish Software AS + * Copyright (c) 2011 Varnish Software AS * All rights reserved. * + * Author: Martin Blix Grydeland * Author: Poul-Henning Kamp * * Redistribution and use in source and binary forms, with or without @@ -38,101 +38,141 @@ #include "cache.h" -static struct lock nbusyobj_mtx; -static struct busyobj *nbusyobj; +struct vbo { + unsigned magic; +#define VBO_MAGIC 0xde3d8223 + struct lock mtx; + unsigned refcount; + struct busyobj bo; +}; + +static struct lock vbo_mtx; +static struct vbo *nvbo; void VBO_Init(void) { - Lck_New(&nbusyobj_mtx, lck_nbusyobj); - nbusyobj = NULL; + Lck_New(&vbo_mtx, lck_busyobj); + nvbo = NULL; } /*-------------------------------------------------------------------- * BusyObj handling */ -static struct busyobj * -vbo_NewBusyObj(void) +static struct vbo * +vbo_New(void) { - struct busyobj *busyobj; + struct vbo *vbo; - ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC); - AN(busyobj); - Lck_New(&busyobj->mtx, lck_busyobj); - return (busyobj); + ALLOC_OBJ(vbo, VBO_MAGIC); + AN(vbo); + Lck_New(&vbo->mtx, lck_busyobj); + return (vbo); } -static void -vbe_FreeBusyObj(struct busyobj *busyobj) +void +VBO_Free(struct vbo **vbop) { - CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); - AZ(busyobj->refcount); - Lck_Delete(&busyobj->mtx); - FREE_OBJ(busyobj); + struct vbo *vbo; + + AN(vbop); + vbo = *vbop; + *vbop = NULL; + CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC); + AZ(vbo->refcount); + Lck_Delete(&vbo->mtx); + FREE_OBJ(vbo); } struct busyobj * VBO_GetBusyObj(struct worker *wrk) { - struct busyobj *busyobj = NULL; - - (void)wrk; - Lck_Lock(&nbusyobj_mtx); - if (nbusyobj != NULL) { - CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC); - busyobj = nbusyobj; - nbusyobj = NULL; - memset((char *)busyobj + offsetof(struct busyobj, refcount), 0, - sizeof *busyobj - offsetof(struct busyobj, refcount)); + struct vbo *vbo = NULL; + + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + + if (wrk->nvbo != NULL) { + vbo = wrk->nvbo; + wrk->nvbo = NULL; + } + + if (vbo == NULL) { + Lck_Lock(&vbo_mtx); + + vbo = nvbo; + nvbo = NULL; + + if (vbo == NULL) + VSC_C_main->busyobj_alloc++; + + Lck_Unlock(&vbo_mtx); } - Lck_Unlock(&nbusyobj_mtx); - if (busyobj == NULL) - busyobj = vbo_NewBusyObj(); - AN(busyobj); - busyobj->refcount = 1; - busyobj->beresp = wrk->x_beresp; - busyobj->bereq = wrk->x_bereq; - return (busyobj); + + if (vbo == NULL) + vbo = vbo_New(); + + CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC); + AZ(vbo->refcount); + AZ(vbo->bo.magic); + vbo->refcount = 1; + vbo->bo.magic = BUSYOBJ_MAGIC; + vbo->bo.vbo = vbo; + vbo->bo.beresp = wrk->x_beresp; + vbo->bo.bereq = wrk->x_bereq; + return (&vbo->bo); } -struct busyobj * -VBO_RefBusyObj(struct busyobj *busyobj) +void +VBO_RefBusyObj(const struct busyobj *busyobj) { + struct vbo *vbo; + CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); - Lck_Lock(&busyobj->mtx); - assert(busyobj->refcount > 0); - busyobj->refcount++; - Lck_Unlock(&busyobj->mtx); - return (busyobj); + vbo = busyobj->vbo; + CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC); + Lck_Lock(&vbo->mtx); + assert(vbo->refcount > 0); + vbo->refcount++; + Lck_Unlock(&vbo->mtx); } void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) { - struct busyobj *busyobj; + struct busyobj *bo; + struct vbo *vbo; + unsigned r; - (void)wrk; - busyobj = *pbo; - CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC); - Lck_Lock(&busyobj->mtx); - assert(busyobj->refcount > 0); - busyobj->refcount--; + CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); + AN(pbo); + bo = *pbo; *pbo = NULL; - if (busyobj->refcount > 0) { - Lck_Unlock(&busyobj->mtx); - return; - } - Lck_Unlock(&busyobj->mtx); - - /* XXX Sanity checks e.g. AZ(busyobj->vbc) */ - - Lck_Lock(&nbusyobj_mtx); - if (nbusyobj == NULL) { - nbusyobj = busyobj; - busyobj = NULL; + CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); + vbo = bo->vbo; + CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC); + Lck_Lock(&vbo->mtx); + assert(vbo->refcount > 0); + r = --vbo->refcount; + Lck_Unlock(&vbo->mtx); + + if (r == 0) { + /* XXX: Sanity checks & cleanup */ + memset(&vbo->bo, 0, sizeof vbo->bo); + + if (cache_param->bo_cache && wrk->nvbo == NULL) { + wrk->nvbo = vbo; + } else { + Lck_Lock(&vbo_mtx); + if (nvbo == NULL) { + nvbo = vbo; + vbo = NULL; + } else + VSC_C_main->busyobj_free++; + Lck_Unlock(&vbo_mtx); + + if (vbo != NULL) + VBO_Free(&vbo); + } } - Lck_Unlock(&nbusyobj_mtx); - if (busyobj != NULL) - vbe_FreeBusyObj(busyobj); } diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c index 675afea..6f6a85f 100644 --- a/bin/varnishd/cache/cache_hash.c +++ b/bin/varnishd/cache/cache_hash.c @@ -134,10 +134,8 @@ HSH_Cleanup(struct worker *wrk) free(wrk->nhashpriv); wrk->nhashpriv = NULL; } - /* if (wrk->nbusyobj != NULL) { */ - /* FREE_OBJ(wrk->nbusyobj); */ - /* wrk->nbusyobj = NULL; */ - /* } */ + if (wrk->nvbo != NULL) + VBO_Free(&wrk->nvbo); } void diff --git a/bin/varnishd/common/params.h b/bin/varnishd/common/params.h index b9b758f..8fd777f 100644 --- a/bin/varnishd/common/params.h +++ b/bin/varnishd/common/params.h @@ -189,6 +189,8 @@ struct params { struct vre_limits vre_limits; + unsigned bo_cache; + /* VSM dimensions */ ssize_t vsm_space; ssize_t vsl_space; diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c index e4be5d8..cc14e41 100644 --- a/bin/varnishd/mgt/mgt_param.c +++ b/bin/varnishd/mgt/mgt_param.c @@ -1105,6 +1105,14 @@ static const struct parspec input_parspec[] = { MUST_RESTART, "1M", "bytes"}, + { "busyobj_worker_cache", tweak_bool, + &mgt_param.bo_cache, 0, 0, + "Cache free busyobj per worker thread." + "Disable this if you have very high hitrates and want" + "to save the memory of one busyobj per worker thread.", + 0, + "true", ""}, + { NULL, NULL, NULL } }; diff --git a/include/tbl/vsc_f_main.h b/include/tbl/vsc_f_main.h index a04767d..ab8415c 100644 --- a/include/tbl/vsc_f_main.h +++ b/include/tbl/vsc_f_main.h @@ -235,6 +235,20 @@ VSC_F(sess_dropped, uint64_t, 1, 'c', " See also param queue_max." ) +/*--------------------------------------------------------------------- + * BusyObj + */ + +VSC_F(busyobj_alloc, uint64_t, 1, 'c', + "Busyobj allocations", + "Number of busyobj structures allocated." +) + +VSC_F(busyobj_free, uint64_t, 1, 'c', + "Busyobj freed", + "Number of busyobj structures freed." +) + /*---------------------------------------------------------------------*/ VSC_F(n_sess_mem, uint64_t, 0, 'i', "N struct sess_mem", "") From phk at varnish-cache.org Thu Dec 8 07:45:35 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 08 Dec 2011 08:45:35 +0100 Subject: [master] d6b6428 Move the beresp and bereq from worker ot busyobj for good. Message-ID: commit d6b64285f179f8d6a66f29c60357f9c33cabb95c Author: Poul-Henning Kamp Date: Thu Dec 8 07:45:21 2011 +0000 Move the beresp and bereq from worker ot busyobj for good. diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 4435c32..ed6a3fd 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -328,10 +328,6 @@ struct worker { /* This is only here so VRT can find it */ const char *storage_hint; - /* Fetch stuff. Here because pipe has no busyobj */ - struct http *x_bereq; - struct http *x_beresp; - /* Stream state */ struct stream_ctx *sctx; diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c index 4272725..ab4db76 100644 --- a/bin/varnishd/cache/cache_busyobj.c +++ b/bin/varnishd/cache/cache_busyobj.c @@ -43,6 +43,7 @@ struct vbo { #define VBO_MAGIC 0xde3d8223 struct lock mtx; unsigned refcount; + uint16_t nhttp; struct busyobj bo; }; @@ -64,9 +65,20 @@ static struct vbo * vbo_New(void) { struct vbo *vbo; + uint16_t nhttp; + ssize_t http_space; - ALLOC_OBJ(vbo, VBO_MAGIC); + assert(cache_param->http_max_hdr < 65536); + nhttp = (uint16_t)cache_param->http_max_hdr; + + http_space = HTTP_estimate(nhttp); + + vbo = malloc(sizeof *vbo + 2 * http_space); AN(vbo); + + memset(vbo, 0, sizeof *vbo); + vbo->magic = VBO_MAGIC; + vbo->nhttp = nhttp; Lck_New(&vbo->mtx, lck_busyobj); return (vbo); } @@ -89,6 +101,7 @@ struct busyobj * VBO_GetBusyObj(struct worker *wrk) { struct vbo *vbo = NULL; + char *p; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); @@ -109,17 +122,25 @@ VBO_GetBusyObj(struct worker *wrk) Lck_Unlock(&vbo_mtx); } + if (vbo != NULL && vbo->nhttp != cache_param->http_max_hdr) + VBO_Free(&vbo); + if (vbo == NULL) vbo = vbo_New(); CHECK_OBJ_NOTNULL(vbo, VBO_MAGIC); AZ(vbo->refcount); + AZ(vbo->bo.magic); vbo->refcount = 1; vbo->bo.magic = BUSYOBJ_MAGIC; vbo->bo.vbo = vbo; - vbo->bo.beresp = wrk->x_beresp; - vbo->bo.bereq = wrk->x_bereq; + + p = (void*)(vbo + 1); + vbo->bo.bereq = HTTP_create(p, vbo->nhttp); + p += HTTP_estimate(vbo->nhttp); + vbo->bo.beresp = HTTP_create(p, vbo->nhttp); + return (&vbo->bo); } diff --git a/bin/varnishd/cache/cache_pool.c b/bin/varnishd/cache/cache_pool.c index cf40e85..a3cb805 100644 --- a/bin/varnishd/cache/cache_pool.c +++ b/bin/varnishd/cache/cache_pool.c @@ -196,8 +196,6 @@ Pool_Work_Thread(void *priv, struct worker *w) Lck_AssertHeld(&pp->mtx); CHECK_OBJ_NOTNULL(w, WORKER_MAGIC); - CHECK_OBJ_NOTNULL(w->x_bereq, HTTP_MAGIC); - CHECK_OBJ_NOTNULL(w->x_beresp, HTTP_MAGIC); CHECK_OBJ_NOTNULL(w->resp, HTTP_MAGIC); WS_Reset(w->ws, NULL); diff --git a/bin/varnishd/cache/cache_wrk.c b/bin/varnishd/cache/cache_wrk.c index 73eedb2..6b1d9dd 100644 --- a/bin/varnishd/cache/cache_wrk.c +++ b/bin/varnishd/cache/cache_wrk.c @@ -139,8 +139,6 @@ wrk_thread_real(void *priv, unsigned shm_workspace, unsigned sess_workspace, uint32_t wlog[shm_workspace / 4]; /* XXX: can we trust these to be properly aligned ? */ unsigned char ws[sess_workspace]; - unsigned char http0[http_space]; - unsigned char http1[http_space]; unsigned char http2[http_space]; struct iovec iov[siov]; struct SHA256Context sha256; @@ -153,8 +151,6 @@ wrk_thread_real(void *priv, unsigned shm_workspace, unsigned sess_workspace, w->wlb = w->wlp = wlog; w->wle = wlog + (sizeof wlog) / 4; w->sha256ctx = &sha256; - w->x_bereq = HTTP_create(http0, nhttp); - w->x_beresp = HTTP_create(http1, nhttp); w->resp = HTTP_create(http2, nhttp); w->wrw.iov = iov; w->wrw.siov = siov; From phk at varnish-cache.org Thu Dec 8 08:01:23 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 08 Dec 2011 09:01:23 +0100 Subject: [master] e541ffb Use the busyobj->vbc also for pipe, so that panic can see it. Message-ID: commit e541ffbd0e75dfa163ea6dabfe426d905a5cb81a Author: Poul-Henning Kamp Date: Thu Dec 8 08:01:08 2011 +0000 Use the busyobj->vbc also for pipe, so that panic can see it. diff --git a/bin/varnishd/cache/cache_pipe.c b/bin/varnishd/cache/cache_pipe.c index 8963fb7..cc98fba 100644 --- a/bin/varnishd/cache/cache_pipe.c +++ b/bin/varnishd/cache/cache_pipe.c @@ -69,11 +69,13 @@ PipeSession(struct sess *sp) CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC); + CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC); w = sp->wrk; vc = VDI_GetFd(NULL, sp); if (vc == NULL) return; + sp->wrk->busyobj->vbc = vc; /* For panic dumping */ (void)VTCP_blocking(vc->fd); WRW_Reserve(w, &vc->fd); @@ -129,4 +131,5 @@ PipeSession(struct sess *sp) } SES_Close(sp, "pipe"); VDI_CloseFd(sp->wrk, &vc); + sp->wrk->busyobj->vbc = NULL; } From phk at varnish-cache.org Thu Dec 8 08:29:25 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 08 Dec 2011 09:29:25 +0100 Subject: [master] dcd622d Split long line Message-ID: commit dcd622df236dfa496b4565eeff9555ad7f37fae5 Author: Poul-Henning Kamp Date: Thu Dec 8 08:29:19 2011 +0000 Split long line diff --git a/bin/varnishd/waiter/cache_waiter_poll.c b/bin/varnishd/waiter/cache_waiter_poll.c index b4863a8..f6be13d 100644 --- a/bin/varnishd/waiter/cache_waiter_poll.c +++ b/bin/varnishd/waiter/cache_waiter_poll.c @@ -161,7 +161,8 @@ vwp_main(void *priv) VTAILQ_REMOVE(&vwp->sesshead, sp, list); if (i == 0) { /* Mov to front of list for speed */ - VTAILQ_INSERT_HEAD(&vwp->sesshead, sp, list); + VTAILQ_INSERT_HEAD(&vwp->sesshead, + sp, list); } else { vwp_unpoll(vwp, fd); SES_Handle(sp, i); From phk at varnish-cache.org Mon Dec 12 11:57:21 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Mon, 12 Dec 2011 12:57:21 +0100 Subject: [master] 03e0bcf Write some generic code for a memory pool and apply it it VBC as the initial guineapig. Message-ID: commit 03e0bcf1beebc82633cbba0a861060a650288058 Author: Poul-Henning Kamp Date: Mon Dec 12 11:54:59 2011 +0000 Write some generic code for a memory pool and apply it it VBC as the initial guineapig. We have a number of pools of objects we maintain dynamically and we will get more in the future, so having a generic facility makes sense. One particular aspect of some of our pools, is that the desired size of object is variable over time, for instance workspaces which depend on parameters etc. Using generic code will allow us to use systematic parameters and VSC stats for all pools, hopefully with some memory savings involved. diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am index a4bae7f..0c3427e 100644 --- a/bin/varnishd/Makefile.am +++ b/bin/varnishd/Makefile.am @@ -34,6 +34,7 @@ varnishd_SOURCES = \ cache/cache_httpconn.c \ cache/cache_lck.c \ cache/cache_main.c \ + cache/cache_mempool.c \ cache/cache_panic.c \ cache/cache_pipe.c \ cache/cache_pool.c \ diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index ed6a3fd..edfe75f 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -99,10 +99,12 @@ struct cli; struct cli_proto; struct director; struct iovec; +struct mempool; struct objcore; struct object; struct objhead; struct pool; +struct poolparam; struct sess; struct sesspool; struct vbc; @@ -667,6 +669,7 @@ void VDI_CloseFd(struct worker *wrk, struct vbc **vbp); void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp); void VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc); void VBE_Poll(void); +void VDI_Init(void); /* cache_backend_cfg.c */ void VBE_InitCfg(void); @@ -849,6 +852,15 @@ int Lck_CondWait(pthread_cond_t *cond, struct lock *lck, struct timespec *ts); #include "tbl/locks.h" #undef LOCK +/* cache_mempool.c */ +struct mempool * MPL_New(const char *name, struct lock *mtx, + volatile struct poolparam *pp, volatile unsigned *cur_size); +void *MPL_GetLocked(struct mempool *mpl, unsigned *size); +void *MPL_Get(struct mempool *mpl, unsigned *size); +void MPL_FreeLocked(struct mempool *mpl, void *item); +void MPL_Free(struct mempool *mpl, void *item); + + /* cache_panic.c */ void PAN_Init(void); diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index 4d2f18a..333b9bf 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -43,6 +43,16 @@ #include "vrt.h" #include "vtcp.h" +static struct mempool *vbcpool; + +static struct poolparam vbcpp = { + .min_pool = 10, + .max_pool = 100, + .max_age = 60, +}; + +static unsigned vbcps = sizeof(struct vbc); + /*-------------------------------------------------------------------- * The "simple" director really isn't, since thats where all the actual * connections happen. Nontheless, pretend it is simple by sequestering @@ -82,14 +92,7 @@ VBE_ReleaseConn(struct vbc *vc) CHECK_OBJ_NOTNULL(vc, VBC_MAGIC); assert(vc->backend == NULL); assert(vc->fd < 0); - - vc->addr = NULL; - vc->addrlen = 0; - vc->recycled = 0; - Lck_Lock(&VBE_mtx); - VSC_C_main->n_vbc--; - Lck_Unlock(&VBE_mtx); - FREE_OBJ(vc); + MPL_Free(vbcpool, vc); } #define FIND_TMO(tmx, dst, sp, be) \ @@ -221,12 +224,10 @@ vbe_NewConn(void) { struct vbc *vc; - ALLOC_OBJ(vc, VBC_MAGIC); + vc = MPL_Get(vbcpool, NULL); XXXAN(vc); + vc->magic = VBC_MAGIC; vc->fd = -1; - Lck_Lock(&VBE_mtx); - VSC_C_main->n_vbc++; - Lck_Unlock(&VBE_mtx); return (vc); } @@ -517,3 +518,11 @@ VRT_init_dir_simple(struct cli *cli, struct director **bp, int idx, bp[idx] = &vs->dir; } + +void +VDI_Init(void) +{ + + vbcpool = MPL_New("vbc", NULL, &vbcpp, &vbcps); + AN(vbcpool); +} diff --git a/bin/varnishd/cache/cache_backend.h b/bin/varnishd/cache/cache_backend.h index 72a1283..a3ae5c2 100644 --- a/bin/varnishd/cache/cache_backend.h +++ b/bin/varnishd/cache/cache_backend.h @@ -170,7 +170,6 @@ void VBE_ReleaseConn(struct vbc *vc); struct backend *vdi_get_backend_if_simple(const struct director *d); /* cache_backend_cfg.c */ -extern struct lock VBE_mtx; void VBE_DropRefConn(struct backend *); void VBE_DropRefVcl(struct backend *); void VBE_DropRefLocked(struct backend *b); diff --git a/bin/varnishd/cache/cache_backend_cfg.c b/bin/varnishd/cache/cache_backend_cfg.c index a47aa3c..c2d022d 100644 --- a/bin/varnishd/cache/cache_backend_cfg.c +++ b/bin/varnishd/cache/cache_backend_cfg.c @@ -43,9 +43,6 @@ #include "vcli_priv.h" #include "vrt.h" -struct lock VBE_mtx; - - /* * The list of backends is not locked, it is only ever accessed from * the CLI thread, so there is no need. @@ -502,6 +499,5 @@ void VBE_InitCfg(void) { - Lck_New(&VBE_mtx, lck_vbe); CLI_AddFuncs(backend_cmds); } diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index a10b0fe..2189104 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -117,6 +117,7 @@ child_main(void) HTTP_Init(); + VDI_Init(); VBO_Init(); VBE_InitCfg(); VBP_Init(); diff --git a/bin/varnishd/cache/cache_mempool.c b/bin/varnishd/cache/cache_mempool.c new file mode 100644 index 0000000..6677c84 --- /dev/null +++ b/bin/varnishd/cache/cache_mempool.c @@ -0,0 +1,164 @@ +/*- + * Copyright (c) 2011 Varnish Software AS + * All rights reserved. + * + * Author: Poul-Henning Kamp + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Generic memory pool + */ + +#include +#include + +#include "config.h" + +#include "cache.h" + +struct memitem { + unsigned magic; +#define MEMITEM_MAGIC 0x42e55401 + VTAILQ_ENTRY(memitem) list; + unsigned size; + double payload; +}; + +struct mempool { + unsigned magic; +#define MEMPOOL_MAGIC 0x37a75a8d + VTAILQ_HEAD(,memitem) list; + struct lock *mtx; + struct lock imtx; + const char *name; + volatile struct poolparam *param; + volatile unsigned *cur_size; + struct VSC_C_mempool *vsc; +}; + +struct mempool * +MPL_New(const char *name, + struct lock *mtx, + volatile struct poolparam *pp, + volatile unsigned *cur_size) +{ + struct mempool *mpl; + + ALLOC_OBJ(mpl, MEMPOOL_MAGIC); + AN(mpl); + mpl->name = name; + mpl->param = pp; + mpl->cur_size = cur_size; + mpl->mtx = mtx; + VTAILQ_INIT(&mpl->list); + Lck_New(&mpl->imtx, lck_mempool); + if (mpl->mtx == NULL) + mpl->mtx = &mpl->imtx; + /* XXX: prealloc min_pool */ + mpl->vsc = VSM_Alloc(sizeof *mpl->vsc, + VSC_CLASS, VSC_TYPE_MEMPOOL, name); + AN(mpl->vsc); + return (mpl); +} + +void * +MPL_GetLocked(struct mempool *mpl, unsigned *size) +{ + struct memitem *mi; + unsigned tsz; + + CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); + Lck_AssertHeld(mpl->mtx); + + mpl->vsc->allocs++; + mpl->vsc->live++; + do { + mi = VTAILQ_FIRST(&mpl->list); + if (mi == NULL) + break; + mpl->vsc->pool--; + CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); + VTAILQ_REMOVE(&mpl->list, mi, list); + if (mi->size < *mpl->cur_size) { + mpl->vsc->toosmall++; + FREE_OBJ(mi); + mi = NULL; + } else { + mpl->vsc->recycle++; + } + } while (mi == NULL); + if (mi == NULL) { + tsz = *mpl->cur_size; + mi = calloc(sizeof *mi + tsz, 1); + AN(mi); + mi->magic = MEMITEM_MAGIC; + mi->size = tsz; + } + if (size != NULL) + *size = mi->size; + return (&mi->payload); +} + +void +MPL_FreeLocked(struct mempool *mpl, void *item) +{ + struct memitem *mi; + + CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); + Lck_AssertHeld(mpl->mtx); + + mpl->vsc->frees++; + mpl->vsc->live--; + + mi = (void*)((uintptr_t)item - offsetof(struct memitem, payload)); + CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); + + if (mi->size < *mpl->cur_size) { + mpl->vsc->toosmall++; + FREE_OBJ(mi); + } else { + mpl->vsc->pool++; + memset(item, 0, mi->size); + VTAILQ_INSERT_HEAD(&mpl->list, mi, list); + } +} + +void * +MPL_Get(struct mempool *mpl, unsigned *size) +{ + void *p; + + CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); + Lck_Lock(mpl->mtx); + p = MPL_GetLocked(mpl, size); + Lck_Unlock(mpl->mtx); + return (p); +} + +void +MPL_Free(struct mempool *mpl, void *item) +{ + CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); + Lck_Lock(mpl->mtx); + MPL_FreeLocked(mpl, item); + Lck_Unlock(mpl->mtx); +} diff --git a/bin/varnishd/common/params.h b/bin/varnishd/common/params.h index 8fd777f..3f1821f 100644 --- a/bin/varnishd/common/params.h +++ b/bin/varnishd/common/params.h @@ -33,6 +33,12 @@ #define VSM_CLASS_PARAM "Params" +struct poolparam { + unsigned min_pool; + unsigned max_pool; + double max_age; +}; + struct params { /* Unprivileged user / group */ diff --git a/include/tbl/locks.h b/include/tbl/locks.h index d86da01..697752d 100644 --- a/include/tbl/locks.h +++ b/include/tbl/locks.h @@ -46,9 +46,9 @@ LOCK(lru) LOCK(cli) LOCK(ban) LOCK(vbp) -LOCK(vbe) LOCK(backend) LOCK(vcapace) LOCK(nbusyobj) LOCK(busyobj) +LOCK(mempool) /*lint -restore */ diff --git a/include/tbl/vsc_all.h b/include/tbl/vsc_all.h index 4d7b927..ae42507 100644 --- a/include/tbl/vsc_all.h +++ b/include/tbl/vsc_all.h @@ -56,3 +56,9 @@ VSC_DO(VBE, vbe, VSC_TYPE_VBE) #include "tbl/vsc_fields.h" #undef VSC_DO_VBE VSC_DONE(VBE, vbe, VSC_TYPE_VBE) + +VSC_DO(MEMPOOL, mempool, VSC_TYPE_MEMPOOL) +#define VSC_DO_MEMPOOL +#include "tbl/vsc_fields.h" +#undef VSC_DO_MEMPOOL +VSC_DONE(MEMPOOL, mempool, VSC_TYPE_MEMPOOL) diff --git a/include/tbl/vsc_f_main.h b/include/tbl/vsc_f_main.h index ab8415c..c8c4ecb 100644 --- a/include/tbl/vsc_f_main.h +++ b/include/tbl/vsc_f_main.h @@ -259,8 +259,6 @@ VSC_F(n_objectcore, uint64_t, 1, 'i', "N struct objectcore", "") VSC_F(n_objecthead, uint64_t, 1, 'i', "N struct objecthead", "") VSC_F(n_waitinglist, uint64_t, 1, 'i', "N struct waitinglist", "") -VSC_F(n_vbc, uint64_t, 0, 'i', "N struct vbc", "") - VSC_F(n_backend, uint64_t, 0, 'i', "N backends", "") VSC_F(n_expired, uint64_t, 0, 'i', "N expired objects", "") diff --git a/include/tbl/vsc_fields.h b/include/tbl/vsc_fields.h index 60cde5d..cc72903 100644 --- a/include/tbl/vsc_fields.h +++ b/include/tbl/vsc_fields.h @@ -106,3 +106,15 @@ VSC_F(happy, uint64_t, 0, 'b', "Happy health probes", "") #endif +/**********************************************************************/ +#ifdef VSC_DO_MEMPOOL + +VSC_F(allocs, uint64_t, 0, 'c', "Allocations", "") +VSC_F(frees, uint64_t, 0, 'c', "Frees", "") +VSC_F(live, uint64_t, 0, 'g', "In use", "") +VSC_F(pool, uint64_t, 0, 'g', "In Pool", "") +VSC_F(recycle, uint64_t, 0, 'g', "Recycled from pool", "") +VSC_F(timeout, uint64_t, 0, 'g', "Timed out from pool", "") +VSC_F(toosmall, uint64_t, 0, 'g', "Too small to recycle", "") + +#endif diff --git a/include/vapi/vsc_int.h b/include/vapi/vsc_int.h index 6ceb723..95346e3 100644 --- a/include/vapi/vsc_int.h +++ b/include/vapi/vsc_int.h @@ -28,13 +28,14 @@ * */ -#define VSC_CLASS "Stat" +#define VSC_CLASS "Stat" #define VSC_TYPE_MAIN "" -#define VSC_TYPE_SMA "SMA" -#define VSC_TYPE_SMF "SMF" -#define VSC_TYPE_VBE "VBE" -#define VSC_TYPE_LCK "LCK" +#define VSC_TYPE_SMA "SMA" +#define VSC_TYPE_SMF "SMF" +#define VSC_TYPE_VBE "VBE" +#define VSC_TYPE_LCK "LCK" +#define VSC_TYPE_MEMPOOL "MEMPOOL" #define VSC_F(n, t, l, f, e, d) t n; From apj at varnish-cache.org Tue Dec 13 14:35:27 2011 From: apj at varnish-cache.org (Andreas Plesner Jacobsen) Date: Tue, 13 Dec 2011 15:35:27 +0100 Subject: [master] 7f3b2a7 Correct ACL syntax Message-ID: commit 7f3b2a79dcc033d249811ff246fdb22dd8ece61d Author: Andreas Plesner Jacobsen Date: Tue Dec 13 15:35:03 2011 +0100 Correct ACL syntax diff --git a/doc/sphinx/tutorial/purging.rst b/doc/sphinx/tutorial/purging.rst index cea1ccd..ecf0e96 100644 --- a/doc/sphinx/tutorial/purging.rst +++ b/doc/sphinx/tutorial/purging.rst @@ -29,7 +29,7 @@ following VCL in place:: acl purge { "localhost"; - "192.168.55.0/24"; + "192.168.55.0"/24; } sub vcl_recv { From phk at varnish-cache.org Wed Dec 14 10:52:22 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Wed, 14 Dec 2011 11:52:22 +0100 Subject: [master] cf024ae Introduce a generic handler for memory pool parameters. Message-ID: commit cf024ae0766179d693b6d5b0d74754134df54647 Author: Poul-Henning Kamp Date: Wed Dec 14 10:51:23 2011 +0000 Introduce a generic handler for memory pool parameters. Minor improvements to a couple param-tweakers as consequence. diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c index 333b9bf..c1bc055 100644 --- a/bin/varnishd/cache/cache_backend.c +++ b/bin/varnishd/cache/cache_backend.c @@ -45,12 +45,6 @@ static struct mempool *vbcpool; -static struct poolparam vbcpp = { - .min_pool = 10, - .max_pool = 100, - .max_age = 60, -}; - static unsigned vbcps = sizeof(struct vbc); /*-------------------------------------------------------------------- @@ -523,6 +517,6 @@ void VDI_Init(void) { - vbcpool = MPL_New("vbc", NULL, &vbcpp, &vbcps); + vbcpool = MPL_New("vbc", NULL, &cache_param->vbc_pool, &vbcps); AN(vbcpool); } diff --git a/bin/varnishd/common/params.h b/bin/varnishd/common/params.h index 3f1821f..8198a78 100644 --- a/bin/varnishd/common/params.h +++ b/bin/varnishd/common/params.h @@ -200,4 +200,6 @@ struct params { /* VSM dimensions */ ssize_t vsm_space; ssize_t vsl_space; + + struct poolparam vbc_pool; }; diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c index cc14e41..fedc0d1 100644 --- a/bin/varnishd/mgt/mgt_param.c +++ b/bin/varnishd/mgt/mgt_param.c @@ -102,33 +102,49 @@ tweak_timeout(struct cli *cli, const struct parspec *par, const char *arg) tweak_generic_timeout(cli, dest, arg); } -static void -tweak_timeout_double(struct cli *cli, const struct parspec *par, - const char *arg) +/*--------------------------------------------------------------------*/ + +static int +tweak_generic_timeout_double(struct cli *cli, volatile double *dest, + const char *arg, double min, double max) { - volatile double *dest; double u; + char *p; - dest = par->priv; if (arg != NULL) { - u = strtod(arg, NULL); - if (u < par->min) { + p = NULL; + u = strtod(arg, &p); + if (*arg == '\0' || *p != '\0') { + VCLI_Out(cli, "Not a number(%s)\n", arg); + VCLI_SetResult(cli, CLIS_PARAM); + return (-1); + } + if (u < min) { VCLI_Out(cli, - "Timeout must be greater or equal to %.g\n", - par->min); + "Timeout must be greater or equal to %.g\n", min); VCLI_SetResult(cli, CLIS_PARAM); - return; + return (-1); } - if (u > par->max) { + if (u > max) { VCLI_Out(cli, - "Timeout must be less than or equal to %.g\n", - par->max); + "Timeout must be less than or equal to %.g\n", max); VCLI_SetResult(cli, CLIS_PARAM); - return; + return (-1); } *dest = u; } else VCLI_Out(cli, "%.6f", *dest); + return (0); +} + +static void +tweak_timeout_double(struct cli *cli, const struct parspec *par, + const char *arg) +{ + volatile double *dest; + + dest = par->priv; + (void)tweak_generic_timeout_double(cli, dest, arg, par->min, par->max); } /*--------------------------------------------------------------------*/ @@ -138,11 +154,19 @@ tweak_generic_double(struct cli *cli, const struct parspec *par, const char *arg) { volatile double *dest; + char *p; double u; dest = par->priv; if (arg != NULL) { - u = strtod(arg, NULL); + p = NULL; + u = strtod(arg, &p); + if (arg == '\0' || *p != '\0') { + VCLI_Out(cli, + "Not a number (%s)\n", arg); + VCLI_SetResult(cli, CLIS_PARAM); + return; + } if (u < par->min) { VCLI_Out(cli, "Must be greater or equal to %.g\n", @@ -206,26 +230,33 @@ tweak_bool(struct cli *cli, const struct parspec *par, const char *arg) /*--------------------------------------------------------------------*/ -void +int tweak_generic_uint(struct cli *cli, volatile unsigned *dest, const char *arg, unsigned min, unsigned max) { unsigned u; + char *p; if (arg != NULL) { + p = NULL; if (!strcasecmp(arg, "unlimited")) u = UINT_MAX; else - u = strtoul(arg, NULL, 0); + u = strtoul(arg, &p, 0); + if (*arg == '\0' || *p != '\0') { + VCLI_Out(cli, "Not a number (%s)\n", arg); + VCLI_SetResult(cli, CLIS_PARAM); + return (-1); + } if (u < min) { VCLI_Out(cli, "Must be at least %u\n", min); VCLI_SetResult(cli, CLIS_PARAM); - return; + return (-1); } if (u > max) { VCLI_Out(cli, "Must be no more than %u\n", max); VCLI_SetResult(cli, CLIS_PARAM); - return; + return (-1); } *dest = u; } else if (*dest == UINT_MAX) { @@ -233,6 +264,7 @@ tweak_generic_uint(struct cli *cli, volatile unsigned *dest, const char *arg, } else { VCLI_Out(cli, "%u", *dest); } + return (0); } /*--------------------------------------------------------------------*/ @@ -243,7 +275,8 @@ tweak_uint(struct cli *cli, const struct parspec *par, const char *arg) volatile unsigned *dest; dest = par->priv; - tweak_generic_uint(cli, dest, arg, (uint)par->min, (uint)par->max); + (void)tweak_generic_uint(cli, dest, arg, + (uint)par->min, (uint)par->max); } /*--------------------------------------------------------------------*/ @@ -554,6 +587,56 @@ tweak_diag_bitmap(struct cli *cli, const struct parspec *par, const char *arg) /*--------------------------------------------------------------------*/ +static void +tweak_poolparam(struct cli *cli, const struct parspec *par, const char *arg) +{ + volatile struct poolparam *pp, px; + char **av; + + pp = par->priv; + if (arg == NULL) { + VCLI_Out(cli, "%u,%u,%g", + pp->min_pool, pp->max_pool, pp->max_age); + } else { + av = VAV_Parse(arg, NULL, ARGV_COMMA); + do { + if (av[0] != NULL) { + VCLI_Out(cli, "Parse error: %s", av[0]); + VCLI_SetResult(cli, CLIS_PARAM); + break; + } + if (av[1] == NULL || av[2] == NULL || av[3] == NULL) { + VCLI_Out(cli, + "Three fields required:" + " min_pool, max_pool and max_age\n"); + VCLI_SetResult(cli, CLIS_PARAM); + break; + } + px = *pp; + if (tweak_generic_uint(cli, &px.min_pool, av[1], + (uint)par->min, (uint)par->max)) + break; + if (tweak_generic_uint(cli, &px.max_pool, av[2], + (uint)par->min, (uint)par->max)) + break; + if (tweak_generic_timeout_double(cli, &px.max_age, + av[3], 0, 1e6)) + break; + if (px.min_pool > px.max_pool) { + VCLI_Out(cli, + "min_pool cannot be larger" + " than max_pool\n"); + VCLI_SetResult(cli, CLIS_PARAM); + break; + } + *pp = px; + } while(0); + + } +} + +/*--------------------------------------------------------------------*/ + /* * Make sure to end all lines with either a space or newline of the * formatting will go haywire. @@ -1113,6 +1196,15 @@ static const struct parspec input_parspec[] = { 0, "true", ""}, + { "vbc_pool", tweak_poolparam, &mgt_param.vbc_pool, 0, 10000, + "Parameters for backend connection memory pool.\n" + "The three numbers are:\n" + " min_pool -- minimum size of free pool.\n" + " max_pool -- maximum size of free pool.\n" + " max_age -- max age of free element.\n", + 0, + "10,100,10", ""}, + { NULL, NULL, NULL } }; diff --git a/bin/varnishd/mgt/mgt_param.h b/bin/varnishd/mgt/mgt_param.h index 2d4a97f..275dfe6 100644 --- a/bin/varnishd/mgt/mgt_param.h +++ b/bin/varnishd/mgt/mgt_param.h @@ -49,7 +49,7 @@ struct parspec { const char *units; }; -void tweak_generic_uint(struct cli *cli, +int tweak_generic_uint(struct cli *cli, volatile unsigned *dest, const char *arg, unsigned min, unsigned max); void tweak_uint(struct cli *cli, const struct parspec *par, const char *arg); void tweak_timeout(struct cli *cli, diff --git a/bin/varnishd/mgt/mgt_pool.c b/bin/varnishd/mgt/mgt_pool.c index badb3f4..e6320fd 100644 --- a/bin/varnishd/mgt/mgt_pool.c +++ b/bin/varnishd/mgt/mgt_pool.c @@ -59,7 +59,7 @@ tweak_thread_pool_min(struct cli *cli, const struct parspec *par, const char *arg) { - tweak_generic_uint(cli, &mgt_param.wthread_min, arg, + (void)tweak_generic_uint(cli, &mgt_param.wthread_min, arg, (unsigned)par->min, mgt_param.wthread_max); } @@ -86,7 +86,7 @@ tweak_stack_size(struct cli *cli, const struct parspec *par, arg = buf; } - tweak_generic_uint(cli, &mgt_param.wthread_stacksize, arg, + (void)tweak_generic_uint(cli, &mgt_param.wthread_stacksize, arg, low, (uint)par->max); } @@ -98,7 +98,7 @@ tweak_thread_pool_max(struct cli *cli, const struct parspec *par, { (void)par; - tweak_generic_uint(cli, &mgt_param.wthread_max, arg, + (void)tweak_generic_uint(cli, &mgt_param.wthread_max, arg, mgt_param.wthread_min, UINT_MAX); } diff --git a/bin/varnishtest/tests/b00034.vtc b/bin/varnishtest/tests/b00034.vtc new file mode 100644 index 0000000..3579fcb --- /dev/null +++ b/bin/varnishtest/tests/b00034.vtc @@ -0,0 +1,13 @@ +varnishtest "mempool param handling" + +server s1 { +} -start + +varnish v1 -vcl+backend {} + +varnish v1 -cliok "param.set vbc_pool 1,10,1" +varnish v1 -clierr 106 "param.set vbc_pool 10" +varnish v1 -clierr 106 "param.set vbc_pool 10,1,1" +varnish v1 -clierr 106 "param.set vbc_pool a,10,10" +varnish v1 -clierr 106 "param.set vbc_pool 10,a,10" +varnish v1 -clierr 106 "param.set vbc_pool 10,10,a" From phk at varnish-cache.org Wed Dec 14 10:52:23 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Wed, 14 Dec 2011 11:52:23 +0100 Subject: [master] a0ac5ac Merge branch 'master' of ssh://git.varnish-cache.org/git/varnish-cache Message-ID: commit a0ac5ac55dafb1d70501ab0a05164e62c3eb716c Merge: cf024ae 7f3b2a7 Author: Poul-Henning Kamp Date: Wed Dec 14 10:52:14 2011 +0000 Merge branch 'master' of ssh://git.varnish-cache.org/git/varnish-cache From perbu at varnish-cache.org Wed Dec 14 15:04:41 2011 From: perbu at varnish-cache.org (Per Buer) Date: Wed, 14 Dec 2011 16:04:41 +0100 Subject: [master] 89ad25e Some clarification on how 'now' works I'm not sure if we should go into more detail about how the whole thing works Message-ID: commit 89ad25ed13e8bbc3aca06a10acb4b1822ecf8e2a Author: Per Buer Date: Wed Dec 14 16:04:39 2011 +0100 Some clarification on how 'now' works I'm not sure if we should go into more detail about how the whole thing works diff --git a/doc/sphinx/reference/vcl.rst b/doc/sphinx/reference/vcl.rst index 5b2e6d0..2c185ed 100644 --- a/doc/sphinx/reference/vcl.rst +++ b/doc/sphinx/reference/vcl.rst @@ -679,7 +679,8 @@ made available to the handler subroutines through global variables. The following variables are always available: now - The current time, in seconds since the epoch. + The current time, in seconds since the epoch. When used in string context + it returns a formatted string. The following variables are available in backend declarations: From phk at varnish-cache.org Thu Dec 15 08:35:14 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 15 Dec 2011 09:35:14 +0100 Subject: [master] 65d9628 Count Trylocks that succeed Message-ID: commit 65d9628481ea72ae2fc939f34391bfc01f92c179 Author: Poul-Henning Kamp Date: Thu Dec 15 08:35:02 2011 +0000 Count Trylocks that succeed diff --git a/bin/varnishd/cache/cache_lck.c b/bin/varnishd/cache/cache_lck.c index 78b5e42..cff9845 100644 --- a/bin/varnishd/cache/cache_lck.c +++ b/bin/varnishd/cache/cache_lck.c @@ -118,6 +118,7 @@ Lck__Trylock(struct lock *lck, const char *p, const char *f, int l) if (r == 0) { AZ(ilck->held); ilck->held = 1; + ilck->stat->locks++; ilck->owner = pthread_self(); } return (r); From phk at varnish-cache.org Thu Dec 15 09:00:58 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 15 Dec 2011 10:00:58 +0100 Subject: [master] 9f5becc FlexeLinting Message-ID: commit 9f5becc0c3d1a409d9e3ac753762cd6ce7149e25 Author: Poul-Henning Kamp Date: Thu Dec 15 09:00:49 2011 +0000 FlexeLinting diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c index fedc0d1..6faf0c5 100644 --- a/bin/varnishd/mgt/mgt_param.c +++ b/bin/varnishd/mgt/mgt_param.c @@ -161,7 +161,7 @@ tweak_generic_double(struct cli *cli, const struct parspec *par, if (arg != NULL) { p = NULL; u = strtod(arg, &p); - if (arg == '\0' || *p != '\0') { + if (*p != '\0') { VCLI_Out(cli, "Not a number (%s)\n", arg); VCLI_SetResult(cli, CLIS_PARAM); @@ -241,12 +241,13 @@ tweak_generic_uint(struct cli *cli, volatile unsigned *dest, const char *arg, p = NULL; if (!strcasecmp(arg, "unlimited")) u = UINT_MAX; - else + else { u = strtoul(arg, &p, 0); - if (*arg == '\0' || *p != '\0') { - VCLI_Out(cli, "Not a number (%s)\n", arg); - VCLI_SetResult(cli, CLIS_PARAM); - return (-1); + if (*arg == '\0' || *p != '\0') { + VCLI_Out(cli, "Not a number (%s)\n", arg); + VCLI_SetResult(cli, CLIS_PARAM); + return (-1); + } } if (u < min) { VCLI_Out(cli, "Must be at least %u\n", min); From phk at varnish-cache.org Thu Dec 15 09:32:25 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 15 Dec 2011 10:32:25 +0100 Subject: [master] b83c68d Formailize some of the macro-crutches I use to explain stuff to FlexeLint. Message-ID: commit b83c68dd51ed522aac12129ecf6e45adbc28ea4f Author: Poul-Henning Kamp Date: Thu Dec 15 09:21:45 2011 +0000 Formailize some of the macro-crutches I use to explain stuff to FlexeLint. diff --git a/bin/varnishd/common/common.h b/bin/varnishd/common/common.h index 2ff5623..3509f25 100644 --- a/bin/varnishd/common/common.h +++ b/bin/varnishd/common/common.h @@ -42,6 +42,26 @@ struct cli; +/********************************************************************** + * FlexeLint and compiler shutuppery + */ + +/* + * In OO-light situations, functions have to match their prototype + * even if that means not const'ing a const'able argument. + * The typedef should be specified as argument to the macro. + */ +#define __match_proto__(xxx) /*lint -e{818} */ + +/* + * State variables may change value before we use the last value we + * set them to. + * Pass no argument. + */ +#define __state_variable__(xxx) /*lint -esym(838,xxx) */ + +/**********************************************************************/ + /* Name of transient storage */ #define TRANSIENT_STORAGE "Transient" @@ -52,8 +72,6 @@ extern pid_t mgt_pid; extern struct vsb *vident; // XXX: -> heritage ? int Symbol_Lookup(struct vsb *vsb, void *ptr); -/* Help shut up FlexeLint */ -#define __match_proto__(xxx) /*lint -e{818} */ /* Really belongs in mgt.h, but storage_file chokes on both */ void mgt_child_inherit(int fd, const char *what); From phk at varnish-cache.org Thu Dec 15 09:32:25 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 15 Dec 2011 10:32:25 +0100 Subject: [master] e9b524b Add the mempool guard-thread Message-ID: commit e9b524b71aca73e048dd38ea8238f323e8be9558 Author: Poul-Henning Kamp Date: Thu Dec 15 09:32:09 2011 +0000 Add the mempool guard-thread diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index edfe75f..9601270 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -855,9 +855,7 @@ int Lck_CondWait(pthread_cond_t *cond, struct lock *lck, struct timespec *ts); /* cache_mempool.c */ struct mempool * MPL_New(const char *name, struct lock *mtx, volatile struct poolparam *pp, volatile unsigned *cur_size); -void *MPL_GetLocked(struct mempool *mpl, unsigned *size); void *MPL_Get(struct mempool *mpl, unsigned *size); -void MPL_FreeLocked(struct mempool *mpl, void *item); void MPL_Free(struct mempool *mpl, void *item); diff --git a/bin/varnishd/cache/cache_mempool.c b/bin/varnishd/cache/cache_mempool.c index 6677c84..6f46a2a 100644 --- a/bin/varnishd/cache/cache_mempool.c +++ b/bin/varnishd/cache/cache_mempool.c @@ -35,6 +35,8 @@ #include "cache.h" +#include "vtim.h" + struct memitem { unsigned magic; #define MEMITEM_MAGIC 0x42e55401 @@ -47,14 +49,114 @@ struct mempool { unsigned magic; #define MEMPOOL_MAGIC 0x37a75a8d VTAILQ_HEAD(,memitem) list; + VTAILQ_HEAD(,memitem) surplus; struct lock *mtx; struct lock imtx; const char *name; volatile struct poolparam *param; volatile unsigned *cur_size; struct VSC_C_mempool *vsc; + unsigned n_pool; + pthread_t thread; }; +/*--------------------------------------------------------------------- + */ + +static struct memitem * +mpl_alloc(const struct mempool *mpl) +{ + unsigned tsz; + struct memitem *mi; + + CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); + tsz = *mpl->cur_size; + mi = calloc(sizeof *mi + tsz, 1); + AN(mi); + mi->magic = MEMITEM_MAGIC; + mi->size = tsz; + return (mi); +} + +/*--------------------------------------------------------------------- + * Pool-guard + * Attempt to keep number of free items in pool inside bounds with + * minimum locking activity. + */ + +static void * +mpl_guard(void *priv) +{ + struct mempool *mpl; + struct memitem *mi = NULL; + double mpl_slp __state_variable__(mpl_slp); + + CAST_OBJ_NOTNULL(mpl, priv, MEMPOOL_MAGIC); + mpl_slp = 0.15; // random + while (1) { + VTIM_sleep(mpl_slp); + mpl_slp = 0.814; // random + + if (mi != NULL && (mpl->n_pool > mpl->param->max_pool || + mi->size < *mpl->cur_size)) { + FREE_OBJ(mi); + mi = NULL; + } + + if (mi == NULL && mpl->n_pool < mpl->param->min_pool) + mi = mpl_alloc(mpl); + + if (mpl->n_pool < mpl->param->min_pool && mi != NULL) { + /* can do */ + } else if (mpl->n_pool > mpl->param->max_pool && mi == NULL) { + /* can do */ + } else if (!VTAILQ_EMPTY(&mpl->surplus)) { + /* can do */ + } else { + continue; /* cannot do */ + } + + mpl_slp = 0.314; + + if (Lck_Trylock(mpl->mtx)) + continue; + + mpl_slp = .01; + + if (mpl->n_pool < mpl->param->min_pool && + mi != NULL && mi->size >= *mpl->cur_size) { + CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); + mpl->vsc->pool++; + mpl->n_pool++; + VTAILQ_INSERT_HEAD(&mpl->list, mi, list); + mi = NULL; + } + if (mpl->n_pool > mpl->param->max_pool && mi == NULL) { + mi = VTAILQ_FIRST(&mpl->list); + CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); + mpl->vsc->pool--; + mpl->n_pool--; + VTAILQ_REMOVE(&mpl->list, mi, list); + } + if (mi == NULL) { + mi = VTAILQ_FIRST(&mpl->surplus); + if (mi != NULL) { + CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); + VTAILQ_REMOVE(&mpl->surplus, mi, list); + } + } + Lck_Unlock(mpl->mtx); + + if (mi != NULL) { + FREE_OBJ(mi); + mi = NULL; + } + } +} + +/*--------------------------------------------------------------------- + */ + struct mempool * MPL_New(const char *name, struct lock *mtx, @@ -70,6 +172,7 @@ MPL_New(const char *name, mpl->cur_size = cur_size; mpl->mtx = mtx; VTAILQ_INIT(&mpl->list); + VTAILQ_INIT(&mpl->surplus); Lck_New(&mpl->imtx, lck_mempool); if (mpl->mtx == NULL) mpl->mtx = &mpl->imtx; @@ -77,88 +180,77 @@ MPL_New(const char *name, mpl->vsc = VSM_Alloc(sizeof *mpl->vsc, VSC_CLASS, VSC_TYPE_MEMPOOL, name); AN(mpl->vsc); + AZ(pthread_create(&mpl->thread, NULL, mpl_guard, mpl)); return (mpl); } void * -MPL_GetLocked(struct mempool *mpl, unsigned *size) +MPL_Get(struct mempool *mpl, unsigned *size) { struct memitem *mi; - unsigned tsz; CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); - Lck_AssertHeld(mpl->mtx); + + Lck_Lock(mpl->mtx); mpl->vsc->allocs++; mpl->vsc->live++; + do { mi = VTAILQ_FIRST(&mpl->list); if (mi == NULL) break; mpl->vsc->pool--; + mpl->n_pool--; CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); VTAILQ_REMOVE(&mpl->list, mi, list); if (mi->size < *mpl->cur_size) { mpl->vsc->toosmall++; - FREE_OBJ(mi); + VTAILQ_INSERT_HEAD(&mpl->surplus, mi, list); mi = NULL; } else { mpl->vsc->recycle++; } } while (mi == NULL); - if (mi == NULL) { - tsz = *mpl->cur_size; - mi = calloc(sizeof *mi + tsz, 1); - AN(mi); - mi->magic = MEMITEM_MAGIC; - mi->size = tsz; - } + + Lck_Unlock(mpl->mtx); + + if (mi == NULL) + mi = mpl_alloc(mpl); if (size != NULL) *size = mi->size; - return (&mi->payload); + + /* Throw away sizeof info for FlexeLint: */ + return ((void*)(uintptr_t)&mi->payload); } void -MPL_FreeLocked(struct mempool *mpl, void *item) +MPL_Free(struct mempool *mpl, void *item) { struct memitem *mi; CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); - Lck_AssertHeld(mpl->mtx); - - mpl->vsc->frees++; - mpl->vsc->live--; mi = (void*)((uintptr_t)item - offsetof(struct memitem, payload)); CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); + memset(item, 0, mi->size); + + Lck_Lock(mpl->mtx); + + mpl->vsc->frees++; + mpl->vsc->live--; if (mi->size < *mpl->cur_size) { mpl->vsc->toosmall++; - FREE_OBJ(mi); + VTAILQ_INSERT_HEAD(&mpl->surplus, mi, list); + } else if (mpl->n_pool >= mpl->param->max_pool) { + mpl->vsc->surplus++; + VTAILQ_INSERT_HEAD(&mpl->surplus, mi, list); } else { mpl->vsc->pool++; - memset(item, 0, mi->size); + mpl->n_pool++; VTAILQ_INSERT_HEAD(&mpl->list, mi, list); } -} - -void * -MPL_Get(struct mempool *mpl, unsigned *size) -{ - void *p; - - CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); - Lck_Lock(mpl->mtx); - p = MPL_GetLocked(mpl, size); - Lck_Unlock(mpl->mtx); - return (p); -} -void -MPL_Free(struct mempool *mpl, void *item) -{ - CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); - Lck_Lock(mpl->mtx); - MPL_FreeLocked(mpl, item); Lck_Unlock(mpl->mtx); } diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c index 6faf0c5..1935344 100644 --- a/bin/varnishd/mgt/mgt_param.c +++ b/bin/varnishd/mgt/mgt_param.c @@ -632,7 +632,6 @@ tweak_poolparam(struct cli *cli, const struct parspec *par, const char *arg) } *pp = px; } while(0); - } } diff --git a/include/tbl/vsc_fields.h b/include/tbl/vsc_fields.h index cc72903..58f4d88 100644 --- a/include/tbl/vsc_fields.h +++ b/include/tbl/vsc_fields.h @@ -116,5 +116,6 @@ VSC_F(pool, uint64_t, 0, 'g', "In Pool", "") VSC_F(recycle, uint64_t, 0, 'g', "Recycled from pool", "") VSC_F(timeout, uint64_t, 0, 'g', "Timed out from pool", "") VSC_F(toosmall, uint64_t, 0, 'g', "Too small to recycle", "") +VSC_F(surplus, uint64_t, 0, 'g', "Too many for pool", "") #endif From phk at varnish-cache.org Thu Dec 15 10:24:05 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 15 Dec 2011 11:24:05 +0100 Subject: [master] 9f4bb5a Gcc is silly... Message-ID: commit 9f4bb5a36442811cf823cb977511fc0964d62cef Author: Poul-Henning Kamp Date: Thu Dec 15 10:23:56 2011 +0000 Gcc is silly... diff --git a/bin/varnishd/cache/cache_mempool.c b/bin/varnishd/cache/cache_mempool.c index 6f46a2a..ac4abf2 100644 --- a/bin/varnishd/cache/cache_mempool.c +++ b/bin/varnishd/cache/cache_mempool.c @@ -152,6 +152,7 @@ mpl_guard(void *priv) mi = NULL; } } + NEEDLESS_RETURN(NULL); } /*--------------------------------------------------------------------- From phk at varnish-cache.org Thu Dec 15 21:55:05 2011 From: phk at varnish-cache.org (Poul-Henning Kamp) Date: Thu, 15 Dec 2011 22:55:05 +0100 Subject: [master] 3e1787c Remove two old relics Message-ID: commit 3e1787cdd2df94894dc695e1101002cf7d0db578 Author: Poul-Henning Kamp Date: Thu Dec 15 21:54:57 2011 +0000 Remove two old relics diff --git a/bin/varnishd/c.sh b/bin/varnishd/c.sh deleted file mode 100644 index 8bab772..0000000 --- a/bin/varnishd/c.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -# A client side script to test the ESI parsing, see s.sh for serverside - -set -e - -echo "" -while true -do - sleep 1 - echo "" - fetch -o - -q http://localhost:8080/ | hexdump -C | - sed 's/$//' - echo "" -done diff --git a/bin/varnishd/s.sh b/bin/varnishd/s.sh deleted file mode 100644 index 469cfb5..0000000 --- a/bin/varnishd/s.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh - -# A server side test-script for pushing the ESI XML parser over a -# storage boundary. -# The crucial trick here is that we send these objects HTTP/0.9 style -# so that cache_fetch puts the first 128k in one storage object and -# the rest in another, thus by putting around 128K space in our test -# data we can put it right before, over and after the storage boundary. -# -# Use c.sh as the client side, and run varnish with this vcl: -# -# backend b1 { -# set backend.host = "Localhost"; -# set backend.port = "8081"; -# } -# -# sub vcl_recv { -# pass; -# } -# -# sub vcl_fetch { -# esi; -# } - -serve () ( - ( - echo 'HTTP/1.0 200 OK' - echo '' - echo "$1" - dd if=/dev/zero bs=$2 count=1 2>/dev/null | tr '\0' ' ' - cat - sleep .1 - ) | nc -l 8081 -) - - - -if false ; then - echo -n " foo bar" | serve Test01 1 - echo -n " foo bar" | serve Test02 2 - # Unterminated CDATA - echo -n " foo { foo bar" | serve Test04::$i $i - done - - for i in `jot 40 131036` - do - echo -n " bar" | serve Test05::$i $i - done - - for i in `jot 22 131040` - do - echo -n "" | serve Test06::$i $i - done - - echo -n " " | serve Test07 10 - - echo -n "