summaryrefslogtreecommitdiff
path: root/taskflow/utils/misc.py
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-03-17 05:01:02 +0000
committerGerrit Code Review <review@openstack.org>2015-03-17 05:01:02 +0000
commit349405f70e7ec16c4a1fb90288c710ebc06ccd2f (patch)
tree2cffb5b23040751e5274ece475a1f66b3e082254 /taskflow/utils/misc.py
parent5d2fb53a34d4400a0599dd54f07482422d06f854 (diff)
parenta1f9321c3fda9af6ed4a240091f9c0c4917dc75d (diff)
downloadtaskflow-349405f70e7ec16c4a1fb90288c710ebc06ccd2f.tar.gz
Merge "Ensure we register & deregister conductor listeners"
Diffstat (limited to 'taskflow/utils/misc.py')
-rw-r--r--taskflow/utils/misc.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/taskflow/utils/misc.py b/taskflow/utils/misc.py
index 8624d7c..ee5fb39 100644
--- a/taskflow/utils/misc.py
+++ b/taskflow/utils/misc.py
@@ -437,6 +437,38 @@ def get_duplicate_keys(iterable, key=None):
return duplicates
+class ListenerStack(object):
+ """Listeners that are deregistered on context manager exit.
+
+ TODO(harlowja): replace this with ``contextlib.ExitStack`` or equivalent
+ in the future (that code is in python3.2+ and in a few backports that
+ provide nearly equivalent functionality). When/if
+ https://review.openstack.org/#/c/164222/ merges we should be able to
+ remove this since listeners are already context managers.
+ """
+
+ def __init__(self, log):
+ self._registered = []
+ self._log = log
+
+ def register(self, listeners):
+ for listener in listeners:
+ listener.register()
+ self._registered.append(listener)
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, type, value, tb):
+ while self._registered:
+ listener = self._registered.pop()
+ try:
+ listener.deregister()
+ except Exception:
+ self._log.warn("Failed deregistering listener '%s'",
+ listener, exc_info=True)
+
+
class ExponentialBackoff(object):
"""An iterable object that will yield back an exponential delay sequence.