Reduce duplication of code in handling multi-type blocking argument

The 'blocking' argument typically either means blocking as a bool
or blocking true but with the given timeout, so in various drivers they
handle this multi-type argument in nearly the same manner. To unify
that usage we can just have a utils method that breaks the multi-type
argument into its components and uniformly use that in drivers.

Change-Id: I0a6c4b50919fab72d383b9c9f2e772fc931cb6b8
This commit is contained in:
Joshua Harlow 2015-12-03 11:19:10 -08:00
parent f9a9a18b1c
commit 963bba02a0
5 changed files with 21 additions and 27 deletions

View File

@ -74,10 +74,7 @@ class FileLock(locking.Lock):
return self.acquired
def acquire(self, blocking=True):
timeout = None
if not isinstance(blocking, bool):
timeout = float(blocking)
blocking = True
blocking, timeout = utils.convert_blocking(blocking)
watch = timeutils.StopWatch(duration=timeout)
watch.start()
while True:

View File

@ -64,19 +64,15 @@ class IPCLock(locking.Lock):
self._lock = None
def acquire(self, blocking=True):
if (blocking is not True
and sysv_ipc.SEMAPHORE_TIMEOUT_SUPPORTED is False):
raise tooz.NotImplemented(
"This system does not support semaphore timeout")
# Convert blocking argument to a valid timeout value
if blocking is True:
timeout = None
start_time = None
elif blocking is False:
if (blocking is not True and
sysv_ipc.SEMAPHORE_TIMEOUT_SUPPORTED is False):
raise tooz.NotImplemented("This system does not support"
" semaphore timeouts")
blocking, timeout = utils.convert_blocking(blocking)
start_time = None
if not blocking:
timeout = 0
start_time = None
else:
timeout = blocking
elif blocking and timeout is not None:
start_time = time.time()
while True:
try:

View File

@ -74,14 +74,10 @@ class RedisLock(locking.Lock):
return owner_tok == lock_tok
def acquire(self, blocking=True):
if blocking is True or blocking is False:
blocking_timeout = None
else:
blocking_timeout = float(blocking)
blocking = True
blocking, timeout = utils.convert_blocking(blocking)
with _translate_failures():
self.acquired = self._lock.acquire(
blocking=blocking, blocking_timeout=blocking_timeout)
blocking=blocking, blocking_timeout=timeout)
if self.acquired:
self._coord._acquired_locks.add(self)
return self.acquired

View File

@ -56,11 +56,7 @@ class ZooKeeperLock(locking.Lock):
cause=e)
def acquire(self, blocking=True):
if isinstance(blocking, bool):
timeout = None
else:
blocking = True
timeout = float(blocking)
blocking, timeout = utils.convert_blocking(blocking)
self.acquired = self._lock.acquire(blocking=blocking,
timeout=timeout)
return self.acquired

View File

@ -104,6 +104,15 @@ def safe_abs_path(rooted_at, *pieces):
return path
def convert_blocking(blocking):
"""Converts a multi-type blocking variable into its derivatives."""
timeout = None
if not isinstance(blocking, bool):
timeout = float(blocking)
blocking = True
return blocking, timeout
def ensure_tree(path):
"""Create a directory (and any ancestor directories required).