diff --git a/evio/controllers/link_manager.py b/evio/controllers/link_manager.py index 807a581..1616d18 100644 --- a/evio/controllers/link_manager.py +++ b/evio/controllers/link_manager.py @@ -150,8 +150,7 @@ class LinkManager(ControllerModule): tnlid = cbt.request.params.params["TunnelId"] else: tnlid = cbt.request.params["TunnelId"] - tnl = self._tunnels.get(tnlid) - self._cleanup_failed_tunnel_data(tnl) + self._rollback_link_creation_changes(tnlid) def req_handler_auth_tunnel(self, cbt: CBT): """Node B""" @@ -719,7 +718,7 @@ class LinkManager(ControllerModule): self.free_cbt(cbt) def on_tnl_timeout(self, tnl: Tunnel, timeout: float): - self._cleanup_failed_tunnel_data(tnl) + self._rollback_link_creation_changes(tnl.tnlid) def _register_abort_handlers(self): self._abort_handler_tbl = { diff --git a/evio/controllers/tincan_tunnel.py b/evio/controllers/tincan_tunnel.py index feb57c1..07a72f4 100644 --- a/evio/controllers/tincan_tunnel.py +++ b/evio/controllers/tincan_tunnel.py @@ -157,9 +157,10 @@ class TincanTunnel(ControllerModule): self.send_control(json.dumps(ctl)) def req_handler_query_link_stats(self, cbt: CBT): - if not self._is_request_current(cbt): - self.complete_cbt(cbt) - return + # if not self._is_request_current(cbt): + # Todo: TypeError - list indices must be integers or slices, not str + # self.complete_cbt(cbt) + # return msg = cbt.request.params ctl = broker.CTL_QUERY_LINK_STATS ctl["TransactionId"] = cbt.tag diff --git a/evio/controllers/topology.py b/evio/controllers/topology.py index d9dc888..33c7628 100644 --- a/evio/controllers/topology.py +++ b/evio/controllers/topology.py @@ -134,16 +134,16 @@ class DiscoveredPeer: class NetworkOverlay: _REFLECT: list[str] = [ - "_max_concurrent_edits", "node_id", "overlay_id", - "new_peer_count", - "_graph_transformation", - "known_peers_list", - "ond_peers", - "adjacency_list", "_loc_id", - "_encr_req", + "_max_concurrent_edits", + "num_active_edits", + "new_peer_count", + "known_peers", + "ond_peers", + "_graph_transformation", + "adjacency_list", ] def __init__(self, node_id: str, overlay_id: str, **kwargs): @@ -180,6 +180,10 @@ class NetworkOverlay: def transformation(self): return self._graph_transformation + @property + def num_active_edits(self): + return self._max_concurrent_edits - self._bsemp._value + @transformation.setter def transformation(self, new_transformation): """ @@ -199,6 +203,12 @@ class NetworkOverlay: def known_peers_list(self): return [*self.known_peers.keys()] + @property + def available_peers(self) -> list: + return [ + peer_id for peer_id, disc in self.known_peers.items() if disc.is_available + ] + def acquire(self) -> bool: return self._bsemp.acquire(blocking=False) @@ -816,14 +826,11 @@ class Topology(ControllerModule): ovl.new_peer_count = 0 ovl_cfg = self.config["Overlays"][olid] enf_lnks = ovl_cfg.get("StaticEdges", []) - peer_list = [ - peer_id - for peer_id in ovl.known_peers - if ovl.known_peers[peer_id].is_available - ] + peer_list = ovl.available_peers if not peer_list: - ovl.release() # necessary as not bound to a CBT - return + raise ValueError( + "No peers are available to produce a new Network Graph" + ) min_succ = int(ovl_cfg.get("MinSuccessors", MIN_SUCCESSORS)) max_ond = int(ovl_cfg.get("MaxOnDemandEdges", MAX_ON_DEMAND_EDGES)) num_peers = len(peer_list) if len(peer_list) > 1 else 2 @@ -854,8 +861,9 @@ class Topology(ControllerModule): peer_list, ovl.get_adj_list(), ovl.ond_peers ) ovl.release() # necessary as not bound to a CBT - except Exception: + except Exception as excp: ovl.release() + self.logger.info(excp) self._process_next_transition(ovl) def _process_next_transition(self, net_ovl: NetworkOverlay):