From 73baebbd16f83fa4a9443298560bc04f37e82d85 Mon Sep 17 00:00:00 2001 From: ed Date: Sat, 6 Nov 2021 07:15:04 +0100 Subject: [PATCH] initial sigusr1 acc/vol reload --- copyparty/broker_mp.py | 5 +++++ copyparty/broker_mpw.py | 6 +++++- copyparty/broker_thr.py | 3 +++ copyparty/svchub.py | 31 +++++++++++++++++++++++++++++-- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/copyparty/broker_mp.py b/copyparty/broker_mp.py index 3dfae2cf..ebbbeca3 100644 --- a/copyparty/broker_mp.py +++ b/copyparty/broker_mp.py @@ -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: diff --git a/copyparty/broker_mpw.py b/copyparty/broker_mpw.py index a5d14878..5571a5ba 100644 --- a/copyparty/broker_mpw.py +++ b/copyparty/broker_mpw.py @@ -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]) diff --git a/copyparty/broker_thr.py b/copyparty/broker_thr.py index 086dddad..1c7a1abf 100644 --- a/copyparty/broker_thr.py +++ b/copyparty/broker_thr.py @@ -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): diff --git a/copyparty/svchub.py b/copyparty/svchub.py index 7bc3597e..e79dbb6b 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -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()