diff --git a/circus/arbiter.py b/circus/arbiter.py index be7ffbf92..554e0bb09 100644 --- a/circus/arbiter.py +++ b/circus/arbiter.py @@ -346,7 +346,7 @@ def reload_from_config(self, config_file=None, inside_circusd=False): if added_sn or deleted_sn: # make sure all existing watchers get the new sockets in # their attributes and get the old removed - # XXX: is this necessary? self.sockets is an mutable + # XXX: is this necessary? self.sockets is a mutable # object for watcher in self.iter_watchers(): # XXX: What happens as initalize is called on a @@ -399,6 +399,9 @@ def reload_from_config(self, config_file=None, inside_circusd=False): changed_wn.add(n) deleted_wn.add(n) added_wn.add(n) + else: + # reload hooks of unchanged watcher + w.reload_hooks() # delete watchers for n in deleted_wn: @@ -417,6 +420,9 @@ def reload_from_config(self, config_file=None, inside_circusd=False): yield self.start_watcher(w) self.watchers.append(w) self._watchers_names[w.name.lower()] = w + # when the watcher was changed reload it's hooks + if n in changed_wn: + w.reload_hooks() @classmethod def load_from_config(cls, config_file, loop=None): diff --git a/circus/watcher.py b/circus/watcher.py index 1a76faf0a..0000e3c3f 100755 --- a/circus/watcher.py +++ b/circus/watcher.py @@ -388,6 +388,11 @@ def _resolve_hooks(self, hooks): for name, (callable_or_name, ignore_failure) in hooks.items(): self._resolve_hook(name, callable_or_name, ignore_failure) + def reload_hooks(self, ignore_failure=False): + for hook_name, func in self.hooks.items(): + hook = func.__module__ + ':' + func.__name__ + self._resolve_hook(hook_name, hook, ignore_failure, reload_module=True) + @property def pending_socket_event(self): return self.on_demand and not self.arbiter.socket_event