X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/154b9580925120dfd7aa2d7c91c62a350b82108e..05b35f15d87b1c367e62e97c39cbb0b402b0d9c3:/lib/locking.py diff --git a/lib/locking.py b/lib/locking.py index ed9a3a8..3e25917 100644 --- a/lib/locking.py +++ b/lib/locking.py @@ -33,6 +33,7 @@ import errno from ganeti import errors from ganeti import utils +from ganeti import compat def ssynchronized(lock, shared=0): @@ -141,8 +142,12 @@ class _SingleNotifyPipeConditionWaiter(object): while True: remaining_time = running_timeout.Remaining() - if remaining_time is not None and remaining_time < 0.0: - break + if remaining_time is not None: + if remaining_time < 0.0: + break + + # Our calculation uses seconds, poll() wants milliseconds + remaining_time *= 1000 try: result = self._poller.poll(remaining_time) @@ -600,7 +605,7 @@ class SharedLock(object): def acquire(self, shared=0, timeout=None, test_notify=None): """Acquire a shared lock. - @type shared: int + @type shared: integer (0/1) used as a boolean @param shared: whether to acquire in shared mode; by default an exclusive lock will be acquired @type timeout: float @@ -713,6 +718,7 @@ class LockSet: def __init__(self, members=None): """Constructs a new LockSet. + @type members: list of strings @param members: initial members of the set """ @@ -811,8 +817,10 @@ class LockSet: def acquire(self, names, timeout=None, shared=0, test_notify=None): """Acquire a set of resource locks. + @type names: list of strings (or string) @param names: the names of the locks which shall be acquired (special lock names, or instance/node names) + @type shared: integer (0/1) used as a boolean @param shared: whether to acquire in shared mode; by default an exclusive lock will be acquired @type timeout: float or None @@ -968,6 +976,7 @@ class LockSet: You must have acquired the locks, either in shared or in exclusive mode, before releasing them. + @type names: list of strings, or None @param names: the names of the locks which shall be released (defaults to all the locks acquired at that level). @@ -1001,8 +1010,11 @@ class LockSet: def add(self, names, acquired=0, shared=0): """Add a new set of elements to the set + @type names: list of strings @param names: names of the new elements to add + @type acquired: integer (0/1) used as a boolean @param acquired: pre-acquire the new resource? + @type shared: integer (0/1) used as a boolean @param shared: is the pre-acquisition shared? """ @@ -1062,6 +1074,7 @@ class LockSet: You can either not hold anything in the lockset or already hold a superset of the elements you want to delete, exclusively. + @type names: list of strings @param names: names of the resource to remove. @return: a list of locks which we removed; the list is always @@ -1204,7 +1217,7 @@ class GanetiLockManager: """ # This way of checking only works if LEVELS[i] = i, which we check for in # the test cases. - return utils.any((self._is_owned(l) for l in LEVELS[level + 1:])) + return compat.any((self._is_owned(l) for l in LEVELS[level + 1:])) def _BGL_owned(self): # pylint: disable-msg=C0103 """Check if the current thread owns the BGL. @@ -1227,10 +1240,12 @@ class GanetiLockManager: def acquire(self, level, names, timeout=None, shared=0): """Acquire a set of resource locks, at the same level. - @param level: the level at which the locks shall be acquired; - it must be a member of LEVELS. + @type level: member of locking.LEVELS + @param level: the level at which the locks shall be acquired + @type names: list of strings (or string) @param names: the names of the locks which shall be acquired (special lock names, or instance/node names) + @type shared: integer (0/1) used as a boolean @param shared: whether to acquire in shared mode; by default an exclusive lock will be acquired @type timeout: float @@ -1261,8 +1276,9 @@ class GanetiLockManager: You must have acquired the locks, either in shared or in exclusive mode, before releasing them. - @param level: the level at which the locks shall be released; - it must be a member of LEVELS + @type level: member of locking.LEVELS + @param level: the level at which the locks shall be released + @type names: list of strings, or None @param names: the names of the locks which shall be released (defaults to all the locks acquired at that level) @@ -1281,10 +1297,13 @@ class GanetiLockManager: def add(self, level, names, acquired=0, shared=0): """Add locks at the specified level. - @param level: the level at which the locks shall be added; - it must be a member of LEVELS_MOD. + @type level: member of locking.LEVELS_MOD + @param level: the level at which the locks shall be added + @type names: list of strings @param names: names of the locks to acquire + @type acquired: integer (0/1) used as a boolean @param acquired: whether to acquire the newly added locks + @type shared: integer (0/1) used as a boolean @param shared: whether the acquisition will be shared """ @@ -1301,8 +1320,9 @@ class GanetiLockManager: You must either already own the locks you are trying to remove exclusively or not own any lock at an upper level. - @param level: the level at which the locks shall be removed; - it must be a member of LEVELS_MOD + @type level: member of locking.LEVELS_MOD + @param level: the level at which the locks shall be removed + @type names: list of strings @param names: the names of the locks which shall be removed (special lock names, or instance/node names)