diff --git a/src/sakia/core/net/network.py b/src/sakia/core/net/network.py index a4cc67663b02290f20aab121c0a0ed4a93a10fb7..eec21ff4c601e49a2b2bdd31b16904ec70ef8644 100644 --- a/src/sakia/core/net/network.py +++ b/src/sakia/core/net/network.py @@ -5,6 +5,7 @@ Created on 24 févr. 2015 """ from .node import Node from ...tools.exceptions import InvalidNodeCurrency +from ...tools.decorators import asyncify import logging import aiohttp import time @@ -44,6 +45,7 @@ class Network(QObject): self._block_found = self.current_blockUID self._timer = QTimer() self._client_session = session + self._discovery_stack = [] @classmethod def create(cls, node): @@ -332,8 +334,10 @@ class Network(QObject): node = self.nodes[index] return self._root_nodes.index(node) - def refresh_once(self): + @asyncify + async def refresh_once(self): for node in self._nodes: + await asyncio.sleep(1) node.refresh(manual=True) async def discover_network(self): @@ -343,6 +347,7 @@ class Network(QObject): """ self._must_crawl = True first_loop = True + asyncio.ensure_future(self.pop_discovery_stack()) while self.continue_crawling(): for node in self.nodes: if self.continue_crawling(): @@ -354,23 +359,40 @@ class Network(QObject): logging.debug("End of network discovery") + async def pop_discovery_stack(self): + """ + Handle poping of nodes in discovery stack + :return: + """ + while self.continue_crawling(): + try: + await asyncio.sleep(1) + peer = self._discovery_stack.pop() + pubkeys = [n.pubkey for n in self.nodes] + if peer.pubkey not in pubkeys: + logging.debug("New node found : {0}".format(peer.pubkey[:5])) + try: + node = Node.from_peer(self.currency, peer, self.session) + node.refresh(manual=True) + self.add_node(node) + self.nodes_changed.emit() + except InvalidNodeCurrency as e: + logging.debug(str(e)) + else: + node = [n for n in self.nodes if n.pubkey == peer.pubkey][0] + if node.peer.blockUID.number < peer.blockUID.number: + logging.debug("Update node : {0}".format(peer.pubkey[:5])) + node.peer = peer + except IndexError: + await asyncio.sleep(2) + def handle_new_node(self, peer): key = VerifyingKey(peer.pubkey) if key.verify_document(peer): - pubkeys = [n.pubkey for n in self.nodes] - if peer.pubkey not in pubkeys: - logging.debug("New node found : {0}".format(peer.pubkey[:5])) - try: - node = Node.from_peer(self.currency, peer, self.session) - node.refresh(manual=True) - self.add_node(node) - self.nodes_changed.emit() - except InvalidNodeCurrency as e: - logging.debug(str(e)) - else: - node = [n for n in self.nodes if n.pubkey == peer.pubkey][0] - if node.peer.blockUID.number < peer.blockUID.number: - node.peer = peer + if len(self._discovery_stack) < 1000 \ + and peer.signatures[0] not in [p.signatures[0] for p in self._discovery_stack]: + logging.debug("Stacking new peer document : {0}".format(peer.pubkey)) + self._discovery_stack.append(peer) else: logging.debug("Wrong document received : {0}".format(peer.signed_raw()))