[master] a9c87f5 retry MAC_reopen_sockets() during child stop

Nils Goroll nils.goroll at uplex.de
Mon Nov 13 13:54:05 UTC 2017


commit a9c87f553cf48026e4b6ade79cbb6b21985d85d3
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Mon Nov 13 14:52:18 2017 +0100

    retry MAC_reopen_sockets() during child stop
    
    Let's see if this fixes #2482

diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 87f1d92..92a6f6d 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -65,7 +65,7 @@ extern const char * const builtin_vcl;
 /* mgt_acceptor.c */
 
 void MAC_Arg(const char *);
-void MAC_reopen_sockets(void);
+int MAC_reopen_sockets(void);
 
 /* mgt_child.c */
 void MCH_Init(void);
diff --git a/bin/varnishd/mgt/mgt_acceptor.c b/bin/varnishd/mgt/mgt_acceptor.c
index 695e882..e834786 100644
--- a/bin/varnishd/mgt/mgt_acceptor.c
+++ b/bin/varnishd/mgt/mgt_acceptor.c
@@ -73,24 +73,28 @@ mac_opensocket(struct listen_sock *ls)
 
 /*=====================================================================
  * Reopen the accept sockets to get rid of listen status.
+ * returns the highest errno encountered, 0 for success
  */
 
-void
+int
 MAC_reopen_sockets(void)
 {
 	struct listen_sock *ls;
-	int fail;
+	int err, fail = 0;
 
 	VTAILQ_FOREACH(ls, &heritage.socks, list) {
 		VJ_master(JAIL_MASTER_PRIVPORT);
-		fail = mac_opensocket(ls);
+		err = mac_opensocket(ls);
 		VJ_master(JAIL_MASTER_LOW);
-		if (fail == 0)
+		if (err == 0)
 			continue;
+		if (err > fail)
+			fail = err;
 		MGT_Complain(C_ERR,
 		    "Could not reopen listen socket %s: %s",
-		    ls->endpoint, strerror(fail));
+		    ls->endpoint, strerror(err));
 	}
+	return fail;
 }
 
 /*--------------------------------------------------------------------*/
diff --git a/bin/varnishd/mgt/mgt_child.c b/bin/varnishd/mgt/mgt_child.c
index 0c2eb11..6121ed2 100644
--- a/bin/varnishd/mgt/mgt_child.c
+++ b/bin/varnishd/mgt/mgt_child.c
@@ -473,7 +473,16 @@ mgt_reap_child(void)
 		fprintf(stderr, "WAIT 0x%jd\n", (intmax_t)r);
 	assert(r == child_pid);
 
-	MAC_reopen_sockets();
+	/*
+	 * XXX exit mgr if we fail even with retries?
+	 * number of retries? interval?
+	 */
+	for (i = 0; i < 3; i++) {
+		if (MAC_reopen_sockets() == 0)
+			break;
+		/* error already logged */
+		(void)sleep(1);
+	}
 
 	VSB_printf(vsb, "Child (%jd) %s", (intmax_t)r,
 	    status ? "died" : "ended");


More information about the varnish-commit mailing list