280
280
socket_path = os.path.join(self._unit_path, HOOK_SOCKET_FILE)
281
281
if hook_name is None:
282
hook_name = "%s-relation-changed" % self._relation_name
284
hook_path = os.path.join(
285
self._unit_path, "formula", "hooks", hook_name)
282
if change.change_type == "departed":
284
"%s-relation-changed" % self._relation_name,
285
"%s-relation-departed" % self._relation_name]
287
hook_names = ["%s-relation-changed" % self._relation_name]
289
hook_names = [hook_name]
287
290
invoker = RelationInvoker(
288
291
context, change, "constant", socket_path, hook_log)
290
yield self._run_lock.acquire()
291
self._log.debug("%s: executing change hook", self._relation_name)
293
yield self._executor(invoker, hook_path)
295
yield self._run_lock.release()
296
self._log.warn("%s: change hook error: %s", self._relation_name, e)
293
for hook_name in hook_names:
294
hook_path = os.path.join(
295
self._unit_path, "formula", "hooks", hook_name)
296
yield self._run_lock.acquire()
297
self._log.debug("%s: executing change hook", self._relation_name)
299
yield self._executor(invoker, hook_path)
301
yield self._run_lock.release()
302
self._log.warn("%s: change hook error: %s", self._relation_name, e)
298
if not self._error_handler:
301
"%s: invoke change hook error handler", self._relation_name)
302
# We can't hold the run lock, when we invoke the error handler, or
303
# we get a deadlock if the handler manipulates the lifecycle.
304
yield self._error_handler(change, e)
306
yield self._run_lock.release()
304
if not self._error_handler:
307
"%s: invoke change hook error handler", self._relation_name)
308
# We can't hold the run lock, when we invoke the error handler, or
309
# we get a deadlock if the handler manipulates the lifecycle.
310
yield self._error_handler(change, e)
312
yield self._run_lock.release()
308
314
def set_hook_error_handler(self, handler):
309
315
"""Set an error handler to be invoked if a hook errors.