[master] a4a7384 Do not restart if we cannot get all our listen sockets, and add a test-case to cover this case.

Poul-Henning Kamp phk at FreeBSD.org
Mon Mar 16 11:42:10 CET 2015


commit a4a7384e689835ca8c7b64f6f2bb13ce14828192
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Mar 16 10:41:46 2015 +0000

    Do not restart if we cannot get all our listen sockets, and add
    a test-case to cover this case.

diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 25737c2..9c23cd7 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -42,6 +42,8 @@ extern int		exit_status;
 /* mgt_acceptor.c */
 
 void MAC_Arg(const char *);
+int MAC_open_sockets(struct cli *);
+void MAC_close_sockets(void);
 
 /* mgt_child.c */
 extern pid_t child_pid;
@@ -49,8 +51,6 @@ void MGT_Run(void);
 void mgt_stop_child(void);
 void mgt_got_fd(int fd);
 void MGT_Child_Cli_Fail(void);
-int MAC_open_sockets(void);
-void MAC_close_sockets(void);
 
 /* mgt_cli.c */
 
diff --git a/bin/varnishd/mgt/mgt_acceptor.c b/bin/varnishd/mgt/mgt_acceptor.c
index a49ec16..faa90ff 100644
--- a/bin/varnishd/mgt/mgt_acceptor.c
+++ b/bin/varnishd/mgt/mgt_acceptor.c
@@ -44,6 +44,7 @@
 #include "common/heritage.h"
 
 #include "vav.h"
+#include "vcli_priv.h"
 #include "vsa.h"
 #include "vss.h"
 #include "vtcp.h"
@@ -55,7 +56,7 @@
  */
 
 int
-MAC_open_sockets(void)
+MAC_open_sockets(struct cli *cli)
 {
 	struct listen_sock *ls;
 	int fail;
@@ -73,6 +74,8 @@ MAC_open_sockets(void)
 	if (ls == NULL)
 		return (0);
 	MAC_close_sockets();
+	VCLI_Out(cli, "Could not get socket %s: %s\n",
+	    ls->name, strerror(fail));
 	errno = fail;
 	return (-1);
 }
@@ -109,6 +112,8 @@ mac_callback(void *priv, const struct suckaddr *sa)
 	struct mac_help *mh;
 	struct listen_sock *ls;
 	int sock;
+	char abuf[VTCP_ADDRBUFSIZE], pbuf[VTCP_PORTBUFSIZE];
+	char nbuf[VTCP_ADDRBUFSIZE+VTCP_PORTBUFSIZE+2];
 
 	CAST_OBJ_NOTNULL(mh, priv, MAC_HELP_MAGIC);
 	sock = VTCP_bind(sa, NULL);
@@ -119,15 +124,23 @@ mac_callback(void *priv, const struct suckaddr *sa)
 
 	ALLOC_OBJ(ls, LISTEN_SOCK_MAGIC);
 	AN(ls);
-	if (VSA_Port(sa) == 0)
+	if (VSA_Port(sa) == 0) {
+		/*
+		 * If the port number is zero, we adopt whatever port number
+		 * this VTCP_bind() found us, as if specified by argument.
+		 */
 		ls->addr = VTCP_my_suckaddr(sock);
-	else
+		VTCP_myname(sock, abuf, sizeof abuf, pbuf, sizeof pbuf);
+		bprintf(nbuf, "%s:%s", abuf, pbuf);
+		ls->name = strdup(nbuf);
+	} else {
 		ls->addr = VSA_Clone(sa);
+		ls->name = strdup(mh->name);
+	}
 	AN(ls->addr);
+	AN(ls->name);
 	AZ(close(sock));
 	ls->sock = -1;
-	ls->name = strdup(priv);
-	AN(ls->name);
 	VTAILQ_INSERT_TAIL(&heritage.socks, ls, list);
 	mh->good++;
 	return (0);
diff --git a/bin/varnishd/mgt/mgt_child.c b/bin/varnishd/mgt/mgt_child.c
index ae9033d..eca8af2 100644
--- a/bin/varnishd/mgt/mgt_child.c
+++ b/bin/varnishd/mgt/mgt_child.c
@@ -303,11 +303,10 @@ mgt_launch_child(struct cli *cli)
 	if (child_state != CH_STOPPED && child_state != CH_DIED)
 		return;
 
-	if (MAC_open_sockets() != 0) {
+	if (MAC_open_sockets(cli) != 0) {
 		child_state = CH_STOPPED;
 		if (cli != NULL) {
 			VCLI_SetResult(cli, CLIS_CANT);
-			VCLI_Out(cli, "Could not open sockets");
 			return;
 		}
 		REPORT0(LOG_ERR,
diff --git a/bin/varnishtest/tests/c00069.vtc b/bin/varnishtest/tests/c00069.vtc
new file mode 100644
index 0000000..76c4b56
--- /dev/null
+++ b/bin/varnishtest/tests/c00069.vtc
@@ -0,0 +1,21 @@
+varnishtest "Test failure if our listen socket gets stolen"
+
+server s1 {
+	rxreq
+	txresp
+} -start
+
+varnish v1 -arg "-a :0" -vcl+backend {} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.status == 200
+} -run
+
+varnish v1 -stop
+
+# Now have another varnish steal the listen socket
+varnish v2 -arg "-a ${v1_addr}:${v1_port}" -vcl+backend {} -start
+
+varnish v1 -clierr 300 "start"



More information about the varnish-commit mailing list