Check if lock already acquired by current client
All checks were successful
Lint Checks / Run linter (pull_request) Successful in 49s
Smoke Test / Run basic test suite (pull_request) Successful in 4m58s
Webapp Test / Run webapp test suite (pull_request) Successful in 5m20s
Deploy Test / Run deploy test suite (pull_request) Successful in 5m40s
K8s Deployment Control Test / Run deployment control suite on kind/k8s (pull_request) Successful in 7m42s
K8s Deploy Test / Run deploy test suite on kind/k8s (pull_request) Successful in 9m23s
All checks were successful
Lint Checks / Run linter (pull_request) Successful in 49s
Smoke Test / Run basic test suite (pull_request) Successful in 4m58s
Webapp Test / Run webapp test suite (pull_request) Successful in 5m20s
Deploy Test / Run deploy test suite (pull_request) Successful in 5m40s
K8s Deployment Control Test / Run deployment control suite on kind/k8s (pull_request) Successful in 7m42s
K8s Deploy Test / Run deploy test suite on kind/k8s (pull_request) Successful in 9m23s
This commit is contained in:
parent
b3d20a7478
commit
6caf131236
@ -1,4 +1,3 @@
|
|||||||
import fcntl
|
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
@ -9,7 +8,11 @@ LOCK_TIMEOUT = 30
|
|||||||
LOCK_RETRY_INTERVAL = 3
|
LOCK_RETRY_INTERVAL = 3
|
||||||
|
|
||||||
|
|
||||||
def acquire_lock(lock_file_path, timeout):
|
def acquire_lock(client, lock_file_path, timeout):
|
||||||
|
# Lock alreay acquired by the current client
|
||||||
|
if client.mutex_lock_acquired:
|
||||||
|
return
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
# Check if lock file exists and is potentially stale
|
# Check if lock file exists and is potentially stale
|
||||||
@ -30,6 +33,8 @@ def acquire_lock(lock_file_path, timeout):
|
|||||||
fd = os.open(lock_file_path, os.O_CREAT | os.O_EXCL | os.O_RDWR)
|
fd = os.open(lock_file_path, os.O_CREAT | os.O_EXCL | os.O_RDWR)
|
||||||
with os.fdopen(fd, 'w') as lock_file:
|
with os.fdopen(fd, 'w') as lock_file:
|
||||||
lock_file.write(str(time.time()))
|
lock_file.write(str(time.time()))
|
||||||
|
|
||||||
|
client.mutex_lock_acquired = True
|
||||||
print(f"Registry lock acquired, {lock_file_path}")
|
print(f"Registry lock acquired, {lock_file_path}")
|
||||||
|
|
||||||
# Lock successfully acquired
|
# Lock successfully acquired
|
||||||
@ -39,14 +44,18 @@ def acquire_lock(lock_file_path, timeout):
|
|||||||
print(f"Lock file {lock_file_path} exists, waiting...")
|
print(f"Lock file {lock_file_path} exists, waiting...")
|
||||||
time.sleep(LOCK_RETRY_INTERVAL)
|
time.sleep(LOCK_RETRY_INTERVAL)
|
||||||
|
|
||||||
def release_lock(lock_file_path):
|
|
||||||
|
def release_lock(client, lock_file_path):
|
||||||
try:
|
try:
|
||||||
os.remove(lock_file_path)
|
os.remove(lock_file_path)
|
||||||
|
|
||||||
|
client.mutex_lock_acquired = False
|
||||||
print(f"Registry lock released, {lock_file_path}")
|
print(f"Registry lock released, {lock_file_path}")
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
# Lock file already removed
|
# Lock file already removed
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def registry_mutex():
|
def registry_mutex():
|
||||||
def decorator(func):
|
def decorator(func):
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
@ -56,12 +65,12 @@ def registry_mutex():
|
|||||||
lock_file_path = self.mutex_lock_file
|
lock_file_path = self.mutex_lock_file
|
||||||
|
|
||||||
# Acquire the lock before running the function
|
# Acquire the lock before running the function
|
||||||
acquire_lock(lock_file_path, LOCK_TIMEOUT)
|
acquire_lock(self, lock_file_path, LOCK_TIMEOUT)
|
||||||
try:
|
try:
|
||||||
return func(self, *args, **kwargs)
|
return func(self, *args, **kwargs)
|
||||||
finally:
|
finally:
|
||||||
# Release the lock after the function completes
|
# Release the lock after the function completes
|
||||||
release_lock(lock_file_path)
|
release_lock(self, lock_file_path)
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
@ -117,7 +117,6 @@ class LaconicRegistryClient:
|
|||||||
def __init__(self, config_file, log_file=None, mutex_lock_file=None):
|
def __init__(self, config_file, log_file=None, mutex_lock_file=None):
|
||||||
self.config_file = config_file
|
self.config_file = config_file
|
||||||
self.log_file = log_file
|
self.log_file = log_file
|
||||||
self.mutex_lock_file = mutex_lock_file
|
|
||||||
self.cache = AttrDict(
|
self.cache = AttrDict(
|
||||||
{
|
{
|
||||||
"name_or_id": {},
|
"name_or_id": {},
|
||||||
@ -126,6 +125,9 @@ class LaconicRegistryClient:
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.mutex_lock_file = mutex_lock_file
|
||||||
|
self.mutex_lock_acquired = False
|
||||||
|
|
||||||
def whoami(self, refresh=False):
|
def whoami(self, refresh=False):
|
||||||
if not refresh and "whoami" in self.cache:
|
if not refresh and "whoami" in self.cache:
|
||||||
return self.cache["whoami"]
|
return self.cache["whoami"]
|
||||||
|
Loading…
Reference in New Issue
Block a user