The cinder.coordination
Module¶
Coordination and locking utilities.
-
class
Coordinator
(agent_id=None, prefix=”)¶ Bases:
object
Tooz coordination wrapper.
Coordination member id is created from concatenated prefix and agent_id parameters.
Parameters: - agent_id (str) – Agent identifier
- prefix (str) – Used to provide member identifier with a meaningful prefix.
-
get_lock
(name)¶ Return a Tooz backend lock.
Parameters: name (str) – The lock name that is used to identify it across all nodes.
-
heartbeat
()¶ Coordinator heartbeat.
Method that every couple of seconds (config: coordination.heartbeat) sends heartbeat to prove that the member is not dead.
If connection to coordination backend is broken it tries to reconnect every couple of seconds (config: coordination.initial_reconnect_backoff up to coordination.max_reconnect_backoff)
-
start
()¶ Connect to coordination backend and start heartbeat.
-
stop
()¶ Disconnect from coordination backend and stop heartbeat.
-
class
Lock
(lock_name, lock_data=None, coordinator=None)¶ Bases:
tooz.locking.Lock
Lock with dynamic name.
Parameters: - lock_name (str) – Lock name.
- lock_data (dict) – Data for lock name formatting.
- coordinator – Coordinator class to use when creating lock. Defaults to the global coordinator.
Using it like so:
with Lock('mylock'): ...
ensures that only one process at a time will execute code in context. Lock name can be formatted using Python format string syntax:
Lock('foo-{volume.id}, {'volume': ...,})
Available field names are keys of lock_data.
-
acquire
(blocking=None)¶ Attempts to acquire lock.
Parameters: blocking – If True, blocks until the lock is acquired. If False, returns right away. Otherwise, the value is used as a timeout value and the call returns maximum after this number of seconds. Returns: returns true if acquired (false if not) Return type: bool
-
name
¶
-
release
()¶ Attempts to release lock.
The behavior of releasing a lock which was not acquired in the first place is undefined.
-
synchronized
(lock_name, blocking=True, coordinator=None)¶ Synchronization decorator.
Parameters: - lock_name (str) – Lock name.
- blocking – If True, blocks until the lock is acquired. If False, raises exception when not acquired. Otherwise, the value is used as a timeout value and if lock is not acquired after this number of seconds exception is raised.
- coordinator – Coordinator class to use when creating lock. Defaults to the global coordinator.
Raises: tooz.coordination.LockAcquireFailed – if lock is not acquired
Decorating a method like so:
@synchronized('mylock') def foo(self, *args): ...
ensures that only one process will execute the foo method at a time.
Different methods can share the same lock:
@synchronized('mylock') def foo(self, *args): ... @synchronized('mylock') def bar(self, *args): ...
This way only one of either foo or bar can be executing at a time.
Lock name can be formatted using Python format string syntax:
@synchronized('{f_name}-{vol.id}-{snap[name]}') def foo(self, vol, snap): ...
Available field names are: decorated function parameters and f_name as a decorated function name.