[master] 3ba46b255 Encapsulat the backend connection endpoint data in a separate structure.

Poul-Henning Kamp phk at FreeBSD.org
Fri Nov 6 17:03:09 UTC 2020


commit 3ba46b255538330de29bb111bff0b54dda9bce9f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Nov 6 17:01:54 2020 +0000

    Encapsulat the backend connection endpoint data in a separate structure.

diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 056a5eb00..f4a9aadc4 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -560,21 +560,22 @@ VRT_backend_vsm_need(VRT_CTX)
 }
 
 static uint64_t
-vrt_hash_be(const struct vrt_backend *vrt)
+vrt_hash_be(const struct vrt_endpoint *vep)
 {
 	struct VSHA256Context cx[1];
 	unsigned char ident[VSHA256_DIGEST_LENGTH];
 
+	CHECK_OBJ_NOTNULL(vep, VRT_ENDPOINT_MAGIC);
 	VSHA256_Init(cx);
 	VSHA256_Update(cx, vbe_proto_ident, strlen(vbe_proto_ident));
-	if (vrt->ipv4_suckaddr != NULL)
-		VSHA256_Update(cx, vrt->ipv4_suckaddr, vsa_suckaddr_len);
-	if (vrt->ipv6_suckaddr != NULL)
-		VSHA256_Update(cx, vrt->ipv6_suckaddr, vsa_suckaddr_len);
-	if (vrt->path != NULL)
-		VSHA256_Update(cx, vrt->path, strlen(vrt->path));
-	if (vrt->prefix_ptr != NULL)
-		VSHA256_Update(cx, vrt->prefix_ptr, vrt->prefix_len);
+	if (vep->ipv4 != NULL)
+		VSHA256_Update(cx, vep->ipv4, vsa_suckaddr_len);
+	if (vep->ipv6 != NULL)
+		VSHA256_Update(cx, vep->ipv6, vsa_suckaddr_len);
+	if (vep->uds_path != NULL)
+		VSHA256_Update(cx, vep->uds_path, strlen(vep->uds_path));
+	if (vep->ident != NULL)
+		VSHA256_Update(cx, vep->ident, vep->ident_len);
 	VSHA256_Final(ident, cx);
 	return (vbe64dec(ident));
 }
@@ -586,20 +587,22 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
 	struct backend *be;
 	struct vcl *vcl;
 	const struct vrt_backend_probe *vbp;
+	const struct vrt_endpoint *vep;
 	const struct vdi_methods *m;
 	const struct suckaddr *sa;
 	char abuf[VTCP_ADDRBUFSIZE];
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
-	if (vrt->path == NULL) {
-		if (vrt->ipv4_suckaddr == NULL && vrt->ipv6_suckaddr == NULL) {
+	vep = vrt->endpoint;
+	CHECK_OBJ_NOTNULL(vep, VRT_ENDPOINT_MAGIC);
+	if (vep->uds_path == NULL) {
+		if (vep->ipv4 == NULL && vep->ipv6 == NULL) {
 			VRT_fail(ctx, "%s: Illegal IP", __func__);
 			return (NULL);
 		}
 	} else
-		assert(vrt->ipv4_suckaddr == NULL &&
-		    vrt->ipv6_suckaddr == NULL);
+		assert(vep->ipv4== NULL && vep->ipv6== NULL);
 
 	vcl = ctx->vcl;
 	AN(vcl);
@@ -617,14 +620,14 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
 #undef DN
 
 	if (be->hosthdr == NULL) {
-		if (vrt->path != NULL)
+		if (vrt->endpoint->uds_path != NULL)
 			sa = bogo_ip;
-		else if (cache_param->prefer_ipv6 && vrt->ipv6_suckaddr != NULL)
-			sa = vrt->ipv6_suckaddr;
-		else if (vrt->ipv4_suckaddr != NULL)
-			sa = vrt->ipv4_suckaddr;
+		else if (cache_param->prefer_ipv6 && vep->ipv6 != NULL)
+			sa = vep->ipv6;
+		else if (vep->ipv4!= NULL)
+			sa = vep->ipv4;
 		else
-			sa = vrt->ipv6_suckaddr;
+			sa = vep->ipv6;
 		VTCP_name(sa, abuf, sizeof abuf, NULL, 0);
 		REPLACE(be->hosthdr, abuf);
 	}
@@ -633,8 +636,8 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
 	    "%s.%s", VCL_Name(ctx->vcl), vrt->vcl_name);
 	AN(be->vsc);
 
-	be->tcp_pool = VTP_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr,
-	    vrt->path, vrt_hash_be(vrt));
+	be->tcp_pool = VTP_Ref(vep->ipv4, vep->ipv6,
+	    vep->uds_path, vrt_hash_be(vrt->endpoint));
 	AN(be->tcp_pool);
 
 	vbp = vrt->probe;
@@ -670,6 +673,7 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
 VCL_BACKEND
 VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
 {
+	CHECK_OBJ_NOTNULL(vrt->endpoint, VRT_ENDPOINT_MAGIC);
 	return (VRT_new_backend_clustered(ctx, NULL, vrt));
 }
 
diff --git a/include/vrt.h b/include/vrt.h
index f9894ed73..4dea8c50a 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -380,20 +380,27 @@ extern const void * const vrt_magic_string_unset;
  * One of those things...
  */
 
+struct vrt_endpoint {
+	unsigned			magic;
+#define VRT_ENDPOINT_MAGIC		0xcc419347
+	VCL_IP				ipv4;
+	VCL_IP				ipv6;
+	const char			*uds_path;
+	const void			*ident;
+	int				ident_len;
+};
+
 #define VRT_BACKEND_FIELDS(rigid)				\
 	rigid char			*vcl_name;		\
 	rigid char			*ipv4_addr;		\
 	rigid char			*ipv6_addr;		\
 	rigid char			*port;			\
-	rigid char			*path;			\
 	rigid char			*hosthdr;		\
 	vtim_dur			connect_timeout;	\
 	vtim_dur			first_byte_timeout;	\
 	vtim_dur			between_bytes_timeout;	\
 	unsigned			max_connections;	\
-	unsigned			proxy_header;		\
-	void				*prefix_ptr;		\
-	unsigned			prefix_len;
+	unsigned			proxy_header;
 
 #define VRT_BACKEND_HANDLE()			\
 	do {					\
@@ -401,7 +408,6 @@ extern const void * const vrt_magic_string_unset;
 		DA(ipv4_addr);			\
 		DA(ipv6_addr);			\
 		DA(port);			\
-		DA(path);			\
 		DA(hosthdr);			\
 		DN(connect_timeout);		\
 		DN(first_byte_timeout);		\
@@ -413,9 +419,8 @@ extern const void * const vrt_magic_string_unset;
 struct vrt_backend {
 	unsigned			magic;
 #define VRT_BACKEND_MAGIC		0x4799ce6c
+	const struct vrt_endpoint	*endpoint;
 	VRT_BACKEND_FIELDS(const)
-	VCL_IP				ipv4_suckaddr;
-	VCL_IP				ipv6_suckaddr;
 	VCL_PROBE			probe;
 };
 
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index 6747a7544..41674efd2 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -58,11 +58,11 @@ vcc_default_probe(struct vcc *tl)
  */
 
 static void
-Emit_Sockaddr(struct vcc *tl, const struct token *t_host,
+Emit_Sockaddr(struct vcc *tl, struct vsb *vsb1, const struct token *t_host,
     const struct token *t_port)
 {
 	const char *ipv4, *ipv4a, *ipv6, *ipv6a, *pa;
-	char buf[256];
+	char buf[BUFSIZ];
 
 	AN(t_host->dec);
 
@@ -74,17 +74,19 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host,
 	    &ipv4, &ipv4a, &ipv6, &ipv6a, &pa, 2, t_host, "Backend host");
 	ERRCHK(tl);
 	if (ipv4 != NULL) {
-		Fb(tl, 0, "\t.ipv4_suckaddr = (const struct suckaddr *)%s,\n",
+		VSB_printf(vsb1,
+		    "\t.ipv4 = (const struct suckaddr *)%s,\n",
 		    ipv4);
 		Fb(tl, 0, "\t.ipv4_addr = \"%s\",\n", ipv4a);
 	}
 	if (ipv6 != NULL) {
-		Fb(tl, 0, "\t.ipv6_suckaddr = (const struct suckaddr *)%s,\n",
+		VSB_printf(vsb1,
+		    "\t.ipv6 = (const struct suckaddr *)%s,\n",
 		    ipv6);
 		Fb(tl, 0, "\t.ipv6_addr = \"%s\",\n", ipv6a);
 	}
 	Fb(tl, 0, "\t.port = \"%s\",\n", pa);
-	Fb(tl, 0, "\t.path = (void *) 0,\n");
+	VSB_printf(vsb1, "\t.uds_path = (void *) 0,\n");
 }
 
 /*
@@ -93,7 +95,8 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host,
  * the IP suckaddrs to NULL.
  */
 static void
-Emit_UDS_Path(struct vcc *tl, const struct token *t_path, const char *errid)
+Emit_UDS_Path(struct vcc *tl, struct vsb *vsb1,
+    const struct token *t_path, const char *errid)
 {
 	struct stat st;
 
@@ -121,12 +124,11 @@ Emit_UDS_Path(struct vcc *tl, const struct token *t_path, const char *errid)
 		vcc_ErrWhere(tl, t_path);
 		return;
 	}
-	Fb(tl, 0, "\t.path = \"%s\",\n", t_path->dec);
-	Fb(tl, 0, "\t.ipv4_suckaddr = (void *) 0,\n");
-	Fb(tl, 0, "\t.ipv6_suckaddr = (void *) 0,\n");
+	VSB_printf(vsb1, "\t.uds_path = \"%s\",\n", t_path->dec);
+	VSB_printf(vsb1, "\t.ipv4 = (void *) 0,\n");
+	VSB_printf(vsb1, "\t.ipv6 = (void *) 0,\n");
 }
 
-
 /*--------------------------------------------------------------------
  * Disallow mutually exclusive field definitions
  */
@@ -346,7 +348,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 	struct token *t_did = NULL;
 	struct fld_spec *fs;
 	struct inifin *ifp;
-	struct vsb *vsb;
+	struct vsb *vsb1, *vsb2;
 	char *p;
 	unsigned u;
 	double t;
@@ -364,9 +366,11 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 	    "?proxy_header",
 	    NULL);
 
-	vsb = VSB_new_auto();
-	AN(vsb);
-	tl->fb = vsb;
+	vsb1 = VSB_new_auto();
+	AN(vsb1);
+	vsb2 = VSB_new_auto();
+	AN(vsb2);
+	tl->fb = vsb2;
 
 	if (tl->t->tok == ID &&
 	    (vcc_IdIs(tl->t, "none") || vcc_IdIs(tl->t, "None"))) {
@@ -381,10 +385,16 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 
 	SkipToken(tl, '{');
 
+	VSB_printf(vsb1,
+	    "\nstatic const struct vrt_endpoint vgc_dir_ep_%s = {\n",
+	    vgcname);
+	VSB_printf(vsb1, "\t.magic = VRT_ENDPOINT_MAGIC,\n");
+
 	Fb(tl, 0, "\nstatic const struct vrt_backend vgc_dir_priv_%s = {\n",
 	    vgcname);
 
 	Fb(tl, 0, "\t.magic = VRT_BACKEND_MAGIC,\n");
+	Fb(tl, 0, "\t.endpoint = &vgc_dir_ep_%s,\n", vgcname);
 	Fb(tl, 0, "\t.vcl_name = \"%.*s", PF(t_be));
 	Fb(tl, 0, "\",\n");
 
@@ -517,10 +527,10 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 	assert(t_host != NULL || t_path != NULL);
 	if (t_host != NULL)
 		/* Check that the hostname makes sense */
-		Emit_Sockaddr(tl, t_host, t_port);
+		Emit_Sockaddr(tl, vsb1, t_host, t_port);
 	else
 		/* Check that the path can be a legal UDS */
-		Emit_UDS_Path(tl, t_path, "Backend path");
+		Emit_UDS_Path(tl, vsb1, t_path, "Backend path");
 	ERRCHK(tl);
 
 	ExpectErr(tl, '}');
@@ -543,10 +553,15 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
 
 	vcc_NextToken(tl);
 
+	VSB_printf(vsb1, "};\n");
+	AZ(VSB_finish(vsb1));
+	Fh(tl, 0, "%s", VSB_data(vsb1));
+	VSB_destroy(&vsb1);
+
 	tl->fb = NULL;
-	AZ(VSB_finish(vsb));
-	Fh(tl, 0, "%s", VSB_data(vsb));
-	VSB_destroy(&vsb);
+	AZ(VSB_finish(vsb2));
+	Fh(tl, 0, "%s", VSB_data(vsb2));
+	VSB_destroy(&vsb2);
 
 	ifp = New_IniFin(tl);
 	VSB_printf(ifp->ini,
diff --git a/lib/libvmod_debug/vmod_debug.c b/lib/libvmod_debug/vmod_debug.c
index 429730c3b..a3cfa0dae 100644
--- a/lib/libvmod_debug/vmod_debug.c
+++ b/lib/libvmod_debug/vmod_debug.c
@@ -522,10 +522,13 @@ cooldown_thread(void *priv)
 static VCL_BACKEND
 create_cold_backend(VRT_CTX)
 {
+	struct vrt_endpoint vep[1];
 	struct vrt_backend be[1];
 
+	INIT_OBJ(vep, VRT_ENDPOINT_MAGIC);
+	vep->uds_path = "/";
 	INIT_OBJ(be, VRT_BACKEND_MAGIC);
-	be->path = "/";
+	be->endpoint = vep;
 	be->vcl_name = "doomed";
 	return (VRT_new_backend(ctx, be));
 }
diff --git a/lib/libvmod_debug/vmod_debug_dyn.c b/lib/libvmod_debug/vmod_debug_dyn.c
index 3ef74544c..68739f641 100644
--- a/lib/libvmod_debug/vmod_debug_dyn.c
+++ b/lib/libvmod_debug/vmod_debug_dyn.c
@@ -65,13 +65,16 @@ dyn_dir_init(VRT_CTX, struct xyzzy_debug_dyn *dyn,
 {
 	struct suckaddr *sa;
 	VCL_BACKEND dir, dir2;
+	struct vrt_endpoint vep;
 	struct vrt_backend vrt;
 
 	CHECK_OBJ_NOTNULL(dyn, VMOD_DEBUG_DYN_MAGIC);
 	XXXAN(addr);
 	XXXAN(port);
 
+	INIT_OBJ(&vep, VRT_ENDPOINT_MAGIC);
 	INIT_OBJ(&vrt, VRT_BACKEND_MAGIC);
+	vrt.endpoint = &vep;
 	vrt.port = port;
 	vrt.vcl_name = dyn->vcl_name;
 	vrt.hosthdr = addr;
@@ -81,10 +84,10 @@ dyn_dir_init(VRT_CTX, struct xyzzy_debug_dyn *dyn,
 	AN(sa);
 	if (VSA_Get_Proto(sa) == AF_INET) {
 		vrt.ipv4_addr = addr;
-		vrt.ipv4_suckaddr = sa;
+		vep.ipv4 = sa;
 	} else if (VSA_Get_Proto(sa) == AF_INET6) {
 		vrt.ipv6_addr = addr;
-		vrt.ipv6_suckaddr = sa;
+		vep.ipv6 = sa;
 	} else
 		WRONG("Wrong proto family");
 
@@ -171,6 +174,7 @@ static int
 dyn_uds_init(VRT_CTX, struct xyzzy_debug_dyn_uds *uds, VCL_STRING path)
 {
 	VCL_BACKEND dir, dir2;
+	struct vrt_endpoint vep;
 	struct vrt_backend vrt;
 	struct stat st;
 
@@ -197,12 +201,14 @@ dyn_uds_init(VRT_CTX, struct xyzzy_debug_dyn_uds *uds, VCL_STRING path)
 		return (-1);
 	}
 
+	INIT_OBJ(&vep, VRT_ENDPOINT_MAGIC);
 	INIT_OBJ(&vrt, VRT_BACKEND_MAGIC);
-	vrt.path = path;
+	vrt.endpoint = &vep;
+	vep.uds_path = path;
 	vrt.vcl_name = uds->vcl_name;
 	vrt.hosthdr = "localhost";
-	vrt.ipv4_suckaddr = NULL;
-	vrt.ipv6_suckaddr = NULL;
+	vep.ipv4 = NULL;
+	vep.ipv6 = NULL;
 
 	if ((dir = VRT_new_backend(ctx, &vrt)) == NULL)
 		return (-1);


More information about the varnish-commit mailing list