Have Learner objects specify whether they want to collect node latency statistics or not. Ursulas don't currently have a use for the statistics (default is False), but Bob and Porter do for decryption requests.

pull/3562/head
derekpierre 2024-11-06 08:43:02 -05:00
parent b1fb873398
commit 8ceab1a22c
No known key found for this signature in database
3 changed files with 21 additions and 6 deletions

View File

@ -387,6 +387,8 @@ class Alice(Character, actors.PolicyAuthor):
class Bob(Character):
_TRACK_NODE_LATENCY_STATS = True
banner = BOB_BANNER
_default_dkg_variant = FerveoVariant.Simple
_default_crypto_powerups = [SigningPower, DecryptingPower]

View File

@ -79,17 +79,20 @@ class ThresholdDecryptionClient(ThresholdAccessControlClient):
self.log.warn(message)
raise self.ThresholdDecryptionRequestFailed(message)
ursulas_sorted_by_latency = (
ursulas_to_contact = (
self._learner.node_latency_collector.order_addresses_by_latency(
list(encrypted_requests)
)
if self._learner.node_latency_collector
else list(encrypted_requests)
)
# Discussion about WorkerPool parameters:
# "https://github.com/nucypher/nucypher/pull/3393#discussion_r1456307991"
worker_pool = WorkerPool(
worker=worker,
value_factory=self.ThresholdDecryptionRequestFactory(
ursulas_to_contact=ursulas_sorted_by_latency,
ursulas_to_contact=ursulas_to_contact,
batch_size=math.ceil(threshold * 1.25),
threshold=threshold,
),

View File

@ -1,3 +1,4 @@
import contextlib
import time
from collections import deque
from contextlib import suppress
@ -219,6 +220,8 @@ class Learner:
_ROUNDS_WITHOUT_NODES_AFTER_WHICH_TO_SLOW_DOWN = 10
__DEFAULT_MIDDLEWARE_CLASS = RestMiddleware
_TRACK_NODE_LATENCY_STATS = False
_crashed = (
False # moved from Character - why was this in Character and not Learner before
)
@ -262,7 +265,9 @@ class Learner:
self.log = Logger("learning-loop") # type: Logger
self.domain = domain
self.node_latency_collector = NodeLatencyStatsCollector()
self.node_latency_collector = (
NodeLatencyStatsCollector() if self._TRACK_NODE_LATENCY_STATS else None
)
self.learning_deferred = Deferred()
default_middleware = self.__DEFAULT_MIDDLEWARE_CLASS(
@ -830,9 +835,14 @@ class Learner:
return RELAX
try:
with self.node_latency_collector.get_latency_tracker(
current_teacher.checksum_address
):
optional_latency_context_manager = (
self.node_latency_collector.get_latency_tracker(
current_teacher.checksum_address
)
if self.node_latency_collector
else contextlib.nullcontext()
)
with optional_latency_context_manager:
response = self.network_middleware.get_nodes_via_rest(
node=current_teacher,
announce_nodes=announce_nodes,