Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _acquire_masters(self):
self._value = os.urandom(self.num_random_bytes)
self._extension_num = 0
futures, num_masters_acquired = set(), 0
with ContextTimer() as timer, \
concurrent.futures.ThreadPoolExecutor() as executor:
for master in self.masters:
futures.add(executor.submit(self._acquire_master, master))
for future in concurrent.futures.as_completed(futures):
with contextlib.suppress(TimeoutError, ConnectionError):
num_masters_acquired += future.result()
quorum = num_masters_acquired >= len(self.masters) // 2 + 1
elapsed = timer.elapsed() - self._drift()
validity_time = self.auto_release_time - elapsed
if quorum and max(validity_time, 0):
return True
else:
with contextlib.suppress(ReleaseUnlockedLock):
self.release()
return False
>>> printer_lock_1.locked()
0
>>> printer_lock_2.release()
If we do currently hold the lock, then this method returns the current
lease's Time To Live (TTL) in ms.
>>> printer_lock_1.acquire()
True
>>> 9 * 1000 < printer_lock_1.locked() < 10 * 1000
True
>>> printer_lock_1.release()
'''
futures, num_masters_acquired, ttls = set(), 0, []
with ContextTimer() as timer, \
concurrent.futures.ThreadPoolExecutor() as executor:
for master in self.masters:
futures.add(executor.submit(self._acquired_master, master))
for future in concurrent.futures.as_completed(futures):
with contextlib.suppress(TimeoutError, ConnectionError):
ttl = future.result()
num_masters_acquired += ttl > 0
ttls.append(ttl)
quorum = num_masters_acquired >= len(self.masters) // 2 + 1
if quorum:
ttls = sorted(ttls, reverse=True)
validity_time = ttls[len(self.masters) // 2]
validity_time -= timer.elapsed() + self._drift()
return max(validity_time, 0)
else:
return 0
>>> printer_lock_2.acquire(timeout=1)
False
>>> printer_lock_1.release()
If blocking is False and timeout is -1, then try just once right now to
acquire the lock. Return True if the lock was acquired; False if it
wasn't.
>>> printer_lock_1.acquire()
True
>>> printer_lock_2.acquire(blocking=False)
False
>>> printer_lock_1.release()
'''
if blocking:
with ContextTimer() as timer:
while timeout == -1 or timer.elapsed() / 1000 < timeout:
if self._acquire_masters():
return True
else:
time.sleep(random.uniform(0, self.RETRY_DELAY/1000))
return False
elif timeout == -1:
return self._acquire_masters()
else:
raise ValueError("can't specify a timeout for a non-blocking call")