Use a mutex for registry CLI txs in webapp deployment commands
All checks were successful
Lint Checks / Run linter (pull_request) Successful in 32s
Deploy Test / Run deploy test suite (pull_request) Successful in 4m51s
K8s Deploy Test / Run deploy test suite on kind/k8s (pull_request) Successful in 7m30s
K8s Deployment Control Test / Run deployment control suite on kind/k8s (pull_request) Successful in 5m24s
Webapp Test / Run webapp test suite (pull_request) Successful in 4m48s
Smoke Test / Run basic test suite (pull_request) Successful in 3m51s

This commit is contained in:
Prathamesh Musale 2024-10-23 12:39:25 +05:30
parent 0c47da42fe
commit 8ea84e6b70
3 changed files with 62 additions and 50 deletions

View File

@ -102,7 +102,7 @@ def command(
"max_price": max_price, "max_price": max_price,
"num_providers": num_providers, "num_providers": num_providers,
} }
auction_id = laconic.create_auction(provider_auction_params) auction_id = laconic.create_deployment_auction(provider_auction_params)
print("Deployment auction created:", auction_id) print("Deployment auction created:", auction_id)
if not auction_id: if not auction_id:

View File

@ -0,0 +1,27 @@
import fcntl
from functools import wraps
# Define the file path for the lock
LOCK_FILE_PATH = "/tmp/registry_mutex_lock_file"
def registry_mutex():
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
with open(LOCK_FILE_PATH, 'w') as lock_file:
try:
# Try to acquire the lock
fcntl.flock(lock_file, fcntl.LOCK_EX)
# Call the actual function
result = func(*args, **kwargs)
finally:
# Always release the lock
fcntl.flock(lock_file, fcntl.LOCK_UN)
return result
return wrapper
return decorator

View File

@ -26,6 +26,8 @@ import yaml
from enum import Enum from enum import Enum
from stack_orchestrator.deploy.webapp.registry_mutex import registry_mutex
class AuctionStatus(str, Enum): class AuctionStatus(str, Enum):
COMMIT = "commit" COMMIT = "commit"
@ -391,6 +393,7 @@ class LaconicRegistryClient:
criteria["type"] = "ApplicationDeploymentAuction" criteria["type"] = "ApplicationDeploymentAuction"
return self.list_records(criteria, all) return self.list_records(criteria, all)
@registry_mutex()
def publish(self, record, names=None): def publish(self, record, names=None):
if names is None: if names is None:
names = [] names = []
@ -421,6 +424,7 @@ class LaconicRegistryClient:
finally: finally:
logged_cmd(self.log_file, "rm", "-rf", tmpdir) logged_cmd(self.log_file, "rm", "-rf", tmpdir)
@registry_mutex()
def set_name(self, name, record_id): def set_name(self, name, record_id):
logged_cmd( logged_cmd(
self.log_file, self.log_file,
@ -434,6 +438,7 @@ class LaconicRegistryClient:
record_id, record_id,
) )
@registry_mutex()
def delete_name(self, name): def delete_name(self, name):
logged_cmd( logged_cmd(
self.log_file, self.log_file,
@ -446,6 +451,7 @@ class LaconicRegistryClient:
name, name,
) )
@registry_mutex()
def send_tokens(self, address, amount, type="alnt"): def send_tokens(self, address, amount, type="alnt"):
args = [ args = [
"laconic", "laconic",
@ -464,58 +470,36 @@ class LaconicRegistryClient:
return AttrDict(json.loads(logged_cmd(self.log_file, *args))) return AttrDict(json.loads(logged_cmd(self.log_file, *args)))
def create_auction(self, auction): @registry_mutex()
if auction["kind"] == AUCTION_KIND_PROVIDER: def create_deployment_auction(self, auction):
args = [ args = [
"laconic", "laconic",
"-c", "-c",
self.config_file, self.config_file,
"registry", "registry",
"auction", "auction",
"create", "create",
"--kind", "--kind",
auction["kind"], auction["kind"],
"--commits-duration", "--commits-duration",
str(auction["commits_duration"]), str(auction["commits_duration"]),
"--reveals-duration", "--reveals-duration",
str(auction["reveals_duration"]), str(auction["reveals_duration"]),
"--denom", "--denom",
auction["denom"], auction["denom"],
"--commit-fee", "--commit-fee",
str(auction["commit_fee"]), str(auction["commit_fee"]),
"--reveal-fee", "--reveal-fee",
str(auction["reveal_fee"]), str(auction["reveal_fee"]),
"--max-price", "--max-price",
str(auction["max_price"]), str(auction["max_price"]),
"--num-providers", "--num-providers",
str(auction["num_providers"]) str(auction["num_providers"])
] ]
else:
args = [
"laconic",
"-c",
self.config_file,
"registry",
"auction",
"create",
"--kind",
auction["kind"],
"--commits-duration",
str(auction["commits_duration"]),
"--reveals-duration",
str(auction["reveals_duration"]),
"--denom",
auction["denom"],
"--commit-fee",
str(auction["commit_fee"]),
"--reveal-fee",
str(auction["reveal_fee"]),
"--minimum-bid",
str(auction["minimum_bid"])
]
return json.loads(logged_cmd(self.log_file, *args))["auctionId"] return json.loads(logged_cmd(self.log_file, *args))["auctionId"]
@registry_mutex()
def commit_bid(self, auction_id, amount, type="alnt"): def commit_bid(self, auction_id, amount, type="alnt"):
args = [ args = [
"laconic", "laconic",
@ -532,6 +516,7 @@ class LaconicRegistryClient:
return json.loads(logged_cmd(self.log_file, *args))["reveal_file"] return json.loads(logged_cmd(self.log_file, *args))["reveal_file"]
@registry_mutex()
def reveal_bid(self, auction_id, reveal_file_path): def reveal_bid(self, auction_id, reveal_file_path):
logged_cmd( logged_cmd(
self.log_file, self.log_file,