[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