async def update_cached_harvesters(self) -> bool: # First remove outdated cache entries self.log.debug( f"update_cached_harvesters cache entries: {len(self.harvester_cache)}" ) remove_hosts = [] for host, host_cache in self.harvester_cache.items(): remove_peers = [] for peer_id, peer_cache in host_cache.items(): # If the peer cache is expired it means the harvester didn't respond for too long if peer_cache.expired(): remove_peers.append(peer_id) for key in remove_peers: del host_cache[key] if len(host_cache) == 0: self.log.debug(f"update_cached_harvesters remove host: {host}") remove_hosts.append(host) for key in remove_hosts: del self.harvester_cache[key] # Now query each harvester and update caches updated = False for connection in self.server.get_connections(NodeType.HARVESTER): cache_entry = await self.get_cached_harvesters(connection) if cache_entry.needs_update(): self.log.debug( f"update_cached_harvesters update harvester: {connection.peer_node_id}" ) cache_entry.bump_last_update() response = await connection.request_plots( harvester_protocol.RequestPlots(), timeout=UPDATE_HARVESTER_CACHE_INTERVAL) if response is not None: if isinstance(response, harvester_protocol.RespondPlots): new_data: Dict = response.to_json_dict() if cache_entry.data != new_data: updated = True self.log.debug( f"update_cached_harvesters cache updated: {connection.peer_node_id}" ) else: self.log.debug( f"update_cached_harvesters no changes for: {connection.peer_node_id}" ) cache_entry.set_data(new_data) else: self.log.error( f"Invalid response from harvester:" f"peer_host {connection.peer_host}, peer_node_id {connection.peer_node_id}" ) else: self.log.error( "Harvester did not respond. You might need to update harvester to the latest version" ) return updated
async def get_plots(self) -> Dict: rpc_response = {} for connection in self.server.get_connections(): if connection.connection_type == NodeType.HARVESTER: peer_host = connection.peer_host peer_port = connection.peer_port peer_full = f"{peer_host}:{peer_port}" response = await connection.request_plots( harvester_protocol.RequestPlots(), timeout=5) if response is None: self.log.error( "Harvester did not respond. You might need to update harvester to the latest version" ) continue if not isinstance(response, harvester_protocol.RespondPlots): self.log.error( f"Invalid response from harvester: {peer_host}:{peer_port}" ) continue rpc_response[peer_full] = response.to_json_dict() return rpc_response
bytes.fromhex( "a04c6b5ac7dfb935f6feecfdd72348ccf1d4be4fe7e26acf271ea3b7d308da61e0a308f7a62495328a81f5147b66634c" ), ), bytes32( bytes.fromhex( "1c96d26def7be696f12e7ebb91d50211e6217ce5d9087c9cd1b84782d5d4b237") ), G1Element( bytes.fromhex( "a04c6b5ac7dfb935f6feecfdd72348ccf1d4be4fe7e26acf271ea3b7d308da61e0a308f7a62495328a81f5147b66634c" ), ), uint64(3368414292564311420), uint64(2573238947935295522), ) request_plots = harvester_protocol.RequestPlots() respond_plots = harvester_protocol.RespondPlots( [plot], ["str"], ["str"], ) ### INTRODUCER PROTOCOL request_peers_introducer = introducer_protocol.RequestPeersIntroducer() respond_peers_introducer = introducer_protocol.RespondPeersIntroducer([ TimestampedPeerInfo( "127.0.0.1", uint16(49878), uint64(15079028934557257795),