[master] 7043f69 Fully privatize struct vbc.

Poul-Henning Kamp phk at FreeBSD.org
Wed Jun 24 22:45:12 CEST 2015


commit 7043f697cfc001f7768ca5a17d14cfacb9320eaf
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jun 24 20:42:26 2015 +0000

    Fully privatize struct vbc.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index a9c04c9..b96d765 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -118,7 +118,6 @@ struct transport;
 struct req;
 struct sess;
 struct suckaddr;
-struct vbc;
 struct vrt_priv;
 struct vsb;
 struct waitinglist;
@@ -236,7 +235,7 @@ struct http_conn {
 	ssize_t			content_length;
 	enum body_status	body_status;
 	struct vfp_ctx		vfc[1];
-	struct vbc		*vbc;
+	void			*priv;
 
 	/* Timeouts */
 	double			first_byte_timeout;
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 9b144f5..7ed2673 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -79,7 +79,7 @@ VBE_Healthy(const struct backend *backend, double *changed)
  * Get a connection to the backend
  */
 
-static int
+static struct vbc *
 vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo)
 {
 	struct vbc *vc;
@@ -95,20 +95,20 @@ vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo)
 	if (!VBE_Healthy(bp, NULL)) {
 		// XXX: per backend stats ?
 		VSC_C_main->backend_unhealthy++;
-		return (-1);
+		return (NULL);
 	}
 
 	if (bp->max_connections > 0 && bp->n_conn >= bp->max_connections) {
 		// XXX: per backend stats ?
 		VSC_C_main->backend_busy++;
-		return (-1);
+		return (NULL);
 	}
 
 	AZ(bo->htc);
 	bo->htc = WS_Alloc(bo->ws, sizeof *bo->htc);
 	if (bo->htc == NULL)
 		/* XXX: counter ? */
-		return (-1);
+		return (NULL);
 	bo->htc->doclose = SC_NULL;
 
 	FIND_TMO(connect_timeout, tmod, bo, bp);
@@ -117,7 +117,7 @@ vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo)
 		// XXX: Per backend stats ?
 		VSC_C_main->backend_fail++;
 		bo->htc = NULL;
-		return (-1);
+		return (NULL);
 	}
 
 	assert(vc->fd >= 0);
@@ -136,13 +136,13 @@ vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo)
 
 	bp->vsc->req++;
 	INIT_OBJ(bo->htc, HTTP_CONN_MAGIC);
-	bo->htc->vbc = vc;
+	bo->htc->priv = vc;
 	bo->htc->fd = vc->fd;
 	FIND_TMO(first_byte_timeout,
 	    bo->htc->first_byte_timeout, bo, bp);
 	FIND_TMO(between_bytes_timeout,
 	    bo->htc->between_bytes_timeout, bo, bp);
-	return (vc->fd);
+	return (vc);
 }
 
 static unsigned __match_proto__(vdi_healthy_f)
@@ -162,6 +162,7 @@ vbe_dir_finish(const struct director *d, struct worker *wrk,
     struct busyobj *bo)
 {
 	struct backend *bp;
+	struct vbc *vbc;
 
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
@@ -169,27 +170,25 @@ vbe_dir_finish(const struct director *d, struct worker *wrk,
 	CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
 
 	CHECK_OBJ_NOTNULL(bo->htc, HTTP_CONN_MAGIC);
-	CHECK_OBJ_ORNULL(bo->htc->vbc, VBC_MAGIC);
-	if (bo->htc->vbc == NULL)
-		return;
-	if (bo->htc->vbc->state != VBC_STATE_USED)
-		VBT_Wait(wrk, bo->htc->vbc);
+	CAST_OBJ_NOTNULL(vbc, bo->htc->priv, VBC_MAGIC);
+	bo->htc->priv = NULL;
+	if (vbc->state != VBC_STATE_USED)
+		VBT_Wait(wrk, vbc);
 	if (bo->htc->doclose != SC_NULL) {
-		VSLb(bo->vsl, SLT_BackendClose, "%d %s", bo->htc->vbc->fd,
+		VSLb(bo->vsl, SLT_BackendClose, "%d %s", vbc->fd,
 		    bp->display_name);
-		VBT_Close(bp->tcp_pool, &bo->htc->vbc);
+		VBT_Close(bp->tcp_pool, &vbc);
 		Lck_Lock(&bp->mtx);
 	} else {
-		VSLb(bo->vsl, SLT_BackendReuse, "%d %s", bo->htc->vbc->fd,
+		VSLb(bo->vsl, SLT_BackendReuse, "%d %s", vbc->fd,
 		    bp->display_name);
 		Lck_Lock(&bp->mtx);
 		VSC_C_main->backend_recycle++;
-		VBT_Recycle(wrk, bp->tcp_pool, &bo->htc->vbc);
+		VBT_Recycle(wrk, bp->tcp_pool, &vbc);
 	}
 #define ACCT(foo)	bp->vsc->foo += bo->acct.foo;
 #include "tbl/acct_fields_bereq.h"
 #undef ACCT
-	bo->htc->vbc = NULL;
 	Lck_Unlock(&bp->mtx);
 	bo->htc = NULL;
 }
@@ -200,6 +199,7 @@ vbe_dir_gethdrs(const struct director *d, struct worker *wrk,
 {
 	int i, extrachance = 1;
 	struct backend *bp;
+	struct vbc *vbc;
 
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
@@ -215,34 +215,34 @@ vbe_dir_gethdrs(const struct director *d, struct worker *wrk,
 		http_PrintfHeader(bo->bereq, "Host: %s", bp->hosthdr);
 
 	do {
-		i = vbe_dir_getfd(wrk, bp, bo);
-		if (i < 0) {
+		vbc = vbe_dir_getfd(wrk, bp, bo);
+		if (vbc == NULL) {
 			VSLb(bo->vsl, SLT_FetchError, "no backend connection");
 			return (-1);
 		}
 		AN(bo->htc);
-		if (bo->htc->vbc->state != VBC_STATE_STOLEN)
+		if (vbc->state != VBC_STATE_STOLEN)
 			extrachance = 0;
 
 		i = V1F_SendReq(wrk, bo, &bo->acct.bereq_hdrbytes, 0);
 
-		if (bo->htc->vbc->state != VBC_STATE_USED)
-			VBT_Wait(wrk, bo->htc->vbc);
+		if (vbc->state != VBC_STATE_USED)
+			VBT_Wait(wrk, vbc);
 
-		assert(bo->htc->vbc->state == VBC_STATE_USED);
+		assert(vbc->state == VBC_STATE_USED);
 
-		if (!i)
+		if (i == 0)
 			i = V1F_FetchRespHdr(bo);
+		if (i == 0) {
+			AN(bo->htc->priv);
+			return (0);
+		}
 
 		/*
 		 * If we recycled a backend connection, there is a finite chance
 		 * that the backend closed it before we got the bereq to it.
 		 * In that case do a single automatic retry if req.boy allows.
 		 */
-		if (i == 0) {
-			AN(bo->htc->vbc);
-			return (0);
-		}
 		vbe_dir_finish(d, wrk, bo);
 		AZ(bo->htc);
 		if (i < 0)
@@ -275,14 +275,15 @@ static const struct suckaddr * __match_proto__(vdi_getip_f)
 vbe_dir_getip(const struct director *d, struct worker *wrk,
     struct busyobj *bo)
 {
+	struct vbc *vbc;
 
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CHECK_OBJ_NOTNULL(bo->htc, HTTP_CONN_MAGIC);
-	CHECK_OBJ_NOTNULL(bo->htc->vbc, VBC_MAGIC);
+	CAST_OBJ_NOTNULL(vbc, bo->htc->priv, VBC_MAGIC);
 
-	return (bo->htc->vbc->addr);
+	return (vbc->addr);
 }
 
 /*--------------------------------------------------------------------*/
@@ -290,9 +291,10 @@ vbe_dir_getip(const struct director *d, struct worker *wrk,
 static void
 vbe_dir_http1pipe(const struct director *d, struct req *req, struct busyobj *bo)
 {
-	int i, fd;
+	int i;
 	struct backend *bp;
 	struct v1p_acct v1a;
+	struct vbc *vbc;
 
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -300,23 +302,25 @@ vbe_dir_http1pipe(const struct director *d, struct req *req, struct busyobj *bo)
 	CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
 
 	memset(&v1a, 0, sizeof v1a);
-	req->res_mode = RES_PIPE;
 
-	fd = vbe_dir_getfd(req->wrk, bp, bo);
 	/* This is hackish... */
 	v1a.req = req->acct.req_hdrbytes;
 	req->acct.req_hdrbytes = 0;
 
-	if (fd < 0) {
+	req->res_mode = RES_PIPE;
+
+	vbc = vbe_dir_getfd(req->wrk, bp, bo);
+
+	if (vbc == NULL) {
 		VSLb(bo->vsl, SLT_FetchError, "no backend connection");
 		SES_Close(req->sp, SC_RX_TIMEOUT);
 	} else {
 		i = V1F_SendReq(req->wrk, bo, &v1a.bereq, 1);
 		VSLb_ts_req(req, "Pipe", W_TIM_real(req->wrk));
-		if (bo->htc->vbc->state == VBC_STATE_STOLEN)
-			VBT_Wait(req->wrk, bo->htc->vbc);
+		if (vbc->state == VBC_STATE_STOLEN)
+			VBT_Wait(req->wrk, vbc);
 		if (i == 0)
-			V1P_Process(req, fd, &v1a);
+			V1P_Process(req, vbc->fd, &v1a);
 		VSLb_ts_req(req, "PipeSess", W_TIM_real(req->wrk));
 		SES_Close(req->sp, SC_TX_PIPE);
 		bo->htc->doclose = SC_TX_PIPE;
diff --git a/bin/varnishd/cache/cache_backend.h b/bin/varnishd/cache/cache_backend.h
index d7cb7d7..d1613f4 100644
--- a/bin/varnishd/cache/cache_backend.h
+++ b/bin/varnishd/cache/cache_backend.h
@@ -38,7 +38,6 @@
  */
 
 struct vbp_target;
-struct vbc;
 struct vrt_ctx;
 struct vrt_backend_probe;
 struct tcp_pool;
@@ -82,9 +81,10 @@ struct backend {
 	struct director		director[1];
 };
 
-/* -------------------------------------------------------------------*/
+/*---------------------------------------------------------------------
+ * Backend connection -- private to cache_backend*.c 
+ */
 
-/* Backend connection */
 struct vbc {
 	unsigned		magic;
 #define VBC_MAGIC		0x0c5e6592
@@ -102,6 +102,10 @@ struct vbc {
 	pthread_cond_t		*cond;
 };
 
+/*---------------------------------------------------------------------
+ * Prototypes
+ */
+
 /* cache_backend.c */
 void VBE_fill_director(struct backend *be);
 
diff --git a/bin/varnishd/http1/cache_http1_fetch.c b/bin/varnishd/http1/cache_http1_fetch.c
index 04f3952..2a2099b 100644
--- a/bin/varnishd/http1/cache_http1_fetch.c
+++ b/bin/varnishd/http1/cache_http1_fetch.c
@@ -42,8 +42,6 @@
 
 #include "hash/hash_slinger.h"
 
-#include "cache/cache_director.h"
-#include "cache/cache_backend.h"
 #include "cache_http1.h"
 
 /*--------------------------------------------------------------------
diff --git a/bin/varnishd/http1/cache_http1_pipe.c b/bin/varnishd/http1/cache_http1_pipe.c
index 6614a14..85df545 100644
--- a/bin/varnishd/http1/cache_http1_pipe.c
+++ b/bin/varnishd/http1/cache_http1_pipe.c
@@ -39,8 +39,6 @@
 #include "vrt.h"
 
 #include "cache_http1.h"
-#include "cache/cache_director.h"
-#include "cache/cache_backend.h"
 
 static struct lock pipestat_mtx;
 



More information about the varnish-commit mailing list