Skip to content

Instantly share code, notes, and snippets.

@samueleresca
Created May 6, 2021 21:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samueleresca/fba9d47adbb206794d47aec8fe79accb to your computer and use it in GitHub Desktop.
Save samueleresca/fba9d47adbb206794d47aec8fe79accb to your computer and use it in GitHub Desktop.
def search(nodes: List[Node[T]],
read_fraction: Optional[Distribution] = None,
write_fraction: Optional[Distribution] = None,
optimize: str = LOAD,
resilience: int = 0,
load_limit: Optional[float] = None,
network_limit: Optional[float] = None,
latency_limit: Optional[datetime.timedelta] = None,
f: int = 0,
timeout: datetime.timedelta = datetime.timedelta(seconds=0)) \
-> Tuple[QuorumSystem[T], Strategy[T]]:
start_time = datetime.datetime.now()
def metric(sigma: Strategy[T]) -> float:
if optimize == LOAD:
return sigma.load(read_fraction, write_fraction)
elif optimize == NETWORK:
return sigma.network_load(read_fraction, write_fraction)
else:
return sigma.latency(read_fraction, write_fraction).total_seconds()
opt_qs: Optional[QuorumSystem[T]] = None
opt_sigma: Optional[Strategy[T]] = None
opt_metric: Optional[float] = None
def do_search(exprs: Iterator[Expr[T]]) -> None:
nonlocal opt_qs
nonlocal opt_sigma
nonlocal opt_metric
for reads in exprs:
qs = QuorumSystem(reads=reads)
if qs.resilience() < resilience:
continue
try:
sigma = qs.strategy(optimize = optimize,
load_limit = load_limit,
network_limit = network_limit,
latency_limit = latency_limit,
read_fraction = read_fraction,
write_fraction = write_fraction,
f = f)
sigma_metric = metric(sigma)
if opt_metric is None or sigma_metric < opt_metric:
opt_qs = qs
opt_sigma = sigma
opt_metric = sigma_metric
except NoStrategyFoundError:
pass
if (timeout != datetime.timedelta(seconds=0) and
datetime.datetime.now() - start_time >= timeout):
return
do_search(_dup_free_exprs(nodes, max_height=2))
do_search(_dup_free_exprs(nodes))
if opt_qs is None:
raise ValueError('no quorum system found')
else:
assert opt_sigma is not None
return (opt_qs, opt_sigma
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment