[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