initial sigusr1 acc/vol reload

This commit is contained in:
ed 2021-11-06 07:15:04 +01:00
parent f327f698b9
commit 73baebbd16
4 changed files with 42 additions and 3 deletions

View file

@ -62,6 +62,11 @@ class BrokerMp(object):
procs.pop()
def reload(self):
self.log("broker", "forwarding reload event")
for _, proc in enumerate(self.procs):
proc.q_pend.put([0, "reload", []])
def collector(self, proc):
"""receive message from hub in other process"""
while True:

View file

@ -29,7 +29,7 @@ class MpWorker(object):
# we inherited signal_handler from parent,
# replace it with something harmless
if not FAKE_MP:
for sig in [signal.SIGINT, signal.SIGTERM]:
for sig in [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1]:
signal.signal(sig, self.signal_handler)
# starting to look like a good idea
@ -69,6 +69,10 @@ class MpWorker(object):
sys.exit(0)
return
elif dest == "reload":
self.logw("mpw reloading")
self.asrv.reload()
elif dest == "listen":
self.httpsrv.listen(args[0], args[1])

View file

@ -21,10 +21,13 @@ class BrokerThr(object):
# instantiate all services here (TODO: inheritance?)
self.httpsrv = HttpSrv(self, None)
self.reload = self.noop
def shutdown(self):
# self.log("broker", "shutting down")
self.httpsrv.shutdown()
def noop(self):
pass
def put(self, want_retval, dest, *args):

View file

@ -37,7 +37,9 @@ class SvcHub(object):
self.argv = argv
self.logf = None
self.stop_req = False
self.reload_req = False
self.stopping = False
self.reloading = False
self.stop_cond = threading.Condition()
self.retcode = 0
self.httpsrv_up = 0
@ -195,7 +197,11 @@ class SvcHub(object):
thr.daemon = True
thr.start()
for sig in [signal.SIGINT, signal.SIGTERM]:
sigs = [signal.SIGINT, signal.SIGTERM]
if not ANYWIN:
sigs.append(signal.SIGUSR1)
for sig in sigs:
signal.signal(sig, self.signal_handler)
# macos hangs after shutdown on sigterm with while-sleep,
@ -219,18 +225,39 @@ class SvcHub(object):
else:
self.stop_thr()
def reload(self):
self.reloading = True
t = threading.Thread(target=self._reload)
t.daemon = True
t.start()
def _reload(self):
self.log("root", "reload scheduled")
with self.up2k.mutex:
self.asrv.reload()
self.broker.reload()
self.reloading = False
def stop_thr(self):
while not self.stop_req:
with self.stop_cond:
self.stop_cond.wait(9001)
if self.reload_req and not self.reloading:
self.reload()
self.shutdown()
def signal_handler(self, sig, frame):
if self.stopping:
return
self.stop_req = True
if sig == signal.SIGUSR1:
self.reload_req = True
else:
self.stop_req = True
with self.stop_cond:
self.stop_cond.notify_all()