[master] c7e5e1d Simplify the song&dance around our listen sockets, and hopefully make it work more like people would expect.

Poul-Henning Kamp phk at FreeBSD.org
Mon Jan 2 11:45:04 CET 2017


commit c7e5e1d849372393cefd15fb3c30bfbb97704f34
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jan 2 10:44:05 2017 +0000

    Simplify the song&dance around our listen sockets, and hopefully
    make it work more like people would expect.
    
    Fixes #1991

diff --git a/bin/varnishd/common/heritage.h b/bin/varnishd/common/heritage.h
index 6a3d5a0..b7bca53 100644
--- a/bin/varnishd/common/heritage.h
+++ b/bin/varnishd/common/heritage.h
@@ -31,12 +31,24 @@
 
 struct vsm_sc;
 struct suckaddr;
+struct transport;
+
+struct listen_arg {
+	unsigned			magic;
+#define LISTEN_ARG_MAGIC		0xbb2fc333
+	VTAILQ_ENTRY(listen_arg)	list;
+	const char			*name;
+	VTAILQ_HEAD(,listen_sock)	socks;
+	const struct transport		*transport;
+};
 
 struct listen_sock {
 	unsigned			magic;
 #define LISTEN_SOCK_MAGIC		0x999e4b57
 	VTAILQ_ENTRY(listen_sock)	list;
+	VTAILQ_ENTRY(listen_sock)	arglist;
 	int				sock;
+	const struct listen_arg		*arg;
 	char				*name;
 	struct suckaddr			*addr;
 	const struct transport		*transport;
diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 99b4fc0..30b120a 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -45,9 +45,7 @@ extern int		exit_status;
 /* mgt_acceptor.c */
 
 void MAC_Arg(const char *);
-void MAC_Validate(void);
 void MAC_reopen_sockets(struct cli *);
-int MAC_sockets_ready(struct cli *);
 
 /* mgt_child.c */
 extern pid_t child_pid;
diff --git a/bin/varnishd/mgt/mgt_acceptor.c b/bin/varnishd/mgt/mgt_acceptor.c
index 70a333a..b0cc47f 100644
--- a/bin/varnishd/mgt/mgt_acceptor.c
+++ b/bin/varnishd/mgt/mgt_acceptor.c
@@ -49,8 +49,11 @@
 #include "vss.h"
 #include "vtcp.h"
 
+static VTAILQ_HEAD(,listen_arg) listen_args =
+    VTAILQ_HEAD_INITIALIZER(listen_args);
+
 static int
-mac_opensocket(struct listen_sock *ls, struct cli *cli)
+mac_opensocket(struct listen_sock *ls)
 {
 	int fail;
 
@@ -62,9 +65,6 @@ mac_opensocket(struct listen_sock *ls, struct cli *cli)
 	ls->sock = VTCP_bind(ls->addr, NULL);
 	fail = errno;
 	if (ls->sock < 0) {
-		if (cli != NULL)
-			VCLI_Out(cli, "Could not get socket %s: %s\n",
-			    ls->name, strerror(errno));
 		AN(fail);
 		return (fail);
 	}
@@ -80,106 +80,87 @@ void
 MAC_reopen_sockets(struct cli *cli)
 {
 	struct listen_sock *ls;
+	int fail;
 
-	VJ_master(JAIL_MASTER_PRIVPORT);
-	VTAILQ_FOREACH(ls, &heritage.socks, list)
-		(void)mac_opensocket(ls, cli);
-	VJ_master(JAIL_MASTER_LOW);
-}
-
-/*=====================================================================
- * Make sure we have all our sockets (and try once more to get them)
- */
-
-int
-MAC_sockets_ready(struct cli *cli)
-{
-	int retval = 1;
-	struct listen_sock *ls;
-
-	VJ_master(JAIL_MASTER_PRIVPORT);
 	VTAILQ_FOREACH(ls, &heritage.socks, list) {
-		if (ls->sock < 0)
-			(void)mac_opensocket(ls, cli);
-		if (ls->sock < 0)
-			retval = 0;
+		VJ_master(JAIL_MASTER_PRIVPORT);
+		fail = mac_opensocket(ls);
+		VJ_master(JAIL_MASTER_LOW);
+		if (fail == 0)
+			continue;
+		if (cli == NULL)
+			MGT_complain(C_ERR,
+			    "Could not reopen listen socket %s: %s",
+			    ls->name, strerror(fail));
+		else
+			VCLI_Out(cli,
+			    "Could not reopen listen socket %s: %s\n",
+			    ls->name, strerror(fail));
 	}
-	VJ_master(JAIL_MASTER_LOW);
-	return (retval);
 }
 
 /*--------------------------------------------------------------------*/
 
-struct mac_help {
-	unsigned		magic;
-#define MAC_HELP_MAGIC		0x1e00a9d9
-	int			good;
-	const char		*name;
-	const struct transport	*transport;
-};
-
 static int __match_proto__(vss_resolved_f)
 mac_callback(void *priv, const struct suckaddr *sa)
 {
-	struct mac_help *mh;
+	struct listen_arg *la;
 	struct listen_sock *ls;
+	char abuf[VTCP_ADDRBUFSIZE], pbuf[VTCP_PORTBUFSIZE];
+	char nbuf[VTCP_ADDRBUFSIZE+VTCP_PORTBUFSIZE+2];
+	int fail;
 
-	CAST_OBJ_NOTNULL(mh, priv, MAC_HELP_MAGIC);
+	CAST_OBJ_NOTNULL(la, priv, LISTEN_ARG_MAGIC);
 
 	VTAILQ_FOREACH(ls, &heritage.socks, list) {
 		if (!VSA_Compare(sa, ls->addr))
 			ARGV_ERR("-a arguments %s and %s have same address\n",
-			    ls->name, mh->name);
+			    ls->arg->name, la->name);
 	}
 	ALLOC_OBJ(ls, LISTEN_SOCK_MAGIC);
 	AN(ls);
+	ls->arg = la;
 	ls->sock = -1;
 	ls->addr = VSA_Clone(sa);
 	AN(ls->addr);
-	ls->name = strdup(mh->name);
+	ls->name = strdup(la->name);
 	AN(ls->name);
-	ls->transport = mh->transport;
+	ls->transport = la->transport;
+	VJ_master(JAIL_MASTER_PRIVPORT);
+	fail = mac_opensocket(ls);
+	VJ_master(JAIL_MASTER_LOW);
+	if (fail) {
+		free(ls->addr);
+		free(ls->name);
+		FREE_OBJ(ls);
+		if (fail != EAFNOSUPPORT)
+			ARGV_ERR("Could not get socket %s: %s",
+			    la->name, strerror(fail));
+		return(0);
+	}
+	if (VSA_Port(ls->addr) == 0) {
+		/*
+		 * If the argv port number is zero, we adopt whatever
+		 * port number this VTCP_bind() found us, as if
+		 * it was specified by the argv.
+		 */
+		free(ls->addr);
+		ls->addr = VTCP_my_suckaddr(ls->sock);
+		VTCP_myname(ls->sock, abuf, sizeof abuf,
+		    pbuf, sizeof pbuf);
+		bprintf(nbuf, "%s:%s", abuf, pbuf);
+		REPLACE(ls->name, nbuf);
+	}
+	VTAILQ_INSERT_TAIL(&la->socks, ls, arglist);
 	VTAILQ_INSERT_TAIL(&heritage.socks, ls, list);
-	mh->good++;
 	return (0);
 }
 
 void
-MAC_Validate(void)
-{
-	struct listen_sock *ls;
-	int fail;
-	char abuf[VTCP_ADDRBUFSIZE], pbuf[VTCP_PORTBUFSIZE];
-	char nbuf[VTCP_ADDRBUFSIZE+VTCP_PORTBUFSIZE+2];
-
-	VTAILQ_FOREACH(ls, &heritage.socks, list) {
-		VJ_master(JAIL_MASTER_PRIVPORT);
-		fail = mac_opensocket(ls, NULL);
-		VJ_master(JAIL_MASTER_LOW);
-		if (fail)
-			ARGV_ERR("Cannot open socket: %s: %s\n",
-			    ls->name, strerror(fail));
-		if (VSA_Port(ls->addr) == 0) {
-			/*
-			 * If the port number is zero, we adopt whatever
-			 * port number this VTCP_bind() found us, as if
-			 * specified by argument.
-			 */
-			free(ls->addr);
-			ls->addr = VTCP_my_suckaddr(ls->sock);
-			VTCP_myname(ls->sock, abuf, sizeof abuf,
-			    pbuf, sizeof pbuf);
-			bprintf(nbuf, "%s:%s", abuf, pbuf);
-			REPLACE(ls->name, nbuf);
-		}
-	}
-}
-
-void
 MAC_Arg(const char *arg)
 {
 	char **av;
-	struct mac_help *mh;
+	struct listen_arg *la;
 	const char *err;
 	int error;
 	const struct transport *xp;
@@ -190,9 +171,11 @@ MAC_Arg(const char *arg)
 	if (av[0] != NULL)
 		ARGV_ERR("%s\n", av[0]);
 
-	ALLOC_OBJ(mh, MAC_HELP_MAGIC);
-	AN(mh);
-	mh->name = av[1];
+	ALLOC_OBJ(la, LISTEN_ARG_MAGIC);
+	AN(la);
+	VTAILQ_INIT(&la->socks);
+	VTAILQ_INSERT_TAIL(&listen_args, la, list);
+	la->name = av[1];
 
 	if (av[2] == NULL) {
 		xp = XPORT_Find("http/1");
@@ -204,11 +187,10 @@ MAC_Arg(const char *arg)
 			ARGV_ERR("Too many sub-arguments to -a(%s)\n", av[2]);
 	}
 	AN(xp);
-	mh->transport = xp;
+	la->transport = xp;
 
-	error = VSS_resolver(av[1], "80", mac_callback, mh, &err);
-	if (mh->good == 0 || error)
-		ARGV_ERR("socket %s didn't resolve\n", av[1]);
+	error = VSS_resolver(av[1], "80", mac_callback, la, &err);
+	if (VTAILQ_EMPTY(&la->socks) || error)
+		ARGV_ERR("Got no socket(s) for %s\n", av[1]);
 	VAV_Free(av);
-	FREE_OBJ(mh);
 }
diff --git a/bin/varnishd/mgt/mgt_child.c b/bin/varnishd/mgt/mgt_child.c
index 5061af5..9a4d955 100644
--- a/bin/varnishd/mgt/mgt_child.c
+++ b/bin/varnishd/mgt/mgt_child.c
@@ -305,17 +305,6 @@ mgt_launch_child(struct cli *cli)
 	if (child_state != CH_STOPPED && child_state != CH_DIED)
 		return;
 
-	if (!MAC_sockets_ready(cli)) {
-		child_state = CH_STOPPED;
-		if (cli != NULL) {
-			VCLI_SetResult(cli, CLIS_CANT);
-			return;
-		}
-		MGT_complain(C_ERR,
-		    "Child start failed: could not open sockets");
-		return;
-	}
-
 	child_state = CH_STARTING;
 
 	/* Open pipe for mgr->child CLI */
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index 59982ec..9be977b 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -656,6 +656,7 @@ main(int argc, char * const *argv)
 	 */
 	VSUB_closefrom(STDERR_FILENO + 1);
 	mgt_got_fd(STDERR_FILENO);
+
 	setbuf(stdout, NULL);
 	setbuf(stderr, NULL);
 
@@ -855,8 +856,6 @@ main(int argc, char * const *argv)
 	if (VTAILQ_EMPTY(&heritage.socks))
 		MAC_Arg(":80");
 
-	MAC_Validate();
-
 	assert(! VTAILQ_EMPTY(&heritage.socks));
 
 	if (!d_flag) {



More information about the varnish-commit mailing list