diff --git a/src/sakia/data/connectors/bma.py b/src/sakia/data/connectors/bma.py index 0a3378b779bff2382ed1c68ac156561c302f00c2..9aa648f8e66b61607a98ed3658b72aff14ff9d90 100644 --- a/src/sakia/data/connectors/bma.py +++ b/src/sakia/data/connectors/bma.py @@ -187,7 +187,7 @@ class BmaConnector: nodes_generator = (n for n in synced_nodes) answers = {} answers_data = {} - nb_verification = min(max(1, 0.66 * len(synced_nodes)), 6) + nb_verification = min(max(1, 0.66 * len(synced_nodes)), 3) # We try to find agreeing nodes from one 1 to 66% of nodes, max 10 session = aiohttp.ClientSession() filtered_data = {} diff --git a/src/sakia/data/graphs/base_graph.py b/src/sakia/data/graphs/base_graph.py index 602d72e0aae712e6181a681ae4aad6168fb57063..63456e268685240a6113f2891f1559e2f9eb5d58 100644 --- a/src/sakia/data/graphs/base_graph.py +++ b/src/sakia/data/graphs/base_graph.py @@ -6,6 +6,7 @@ from PyQt5.QtCore import QLocale, QDateTime, QObject, QT_TRANSLATE_NOOP from sakia.errors import NoPeerAvailable from .constants import EdgeStatus, NodeStatus from sakia.constants import MAX_CONFIRMATIONS +import asyncio def sentry_display(identity): @@ -194,10 +195,14 @@ class BaseGraph(QObject): # add certifiers of uid for certification in tuple(certifier_list): certifier = self.identities_service.get_identity(certification.certifier) + futures = [self.node_status(certifier)] if not certifier: - certifier = await self.identities_service.find_from_pubkey(certification.certifier) - self.identities_service.insert_or_update_identity(certifier) - node_status = await self.node_status(certifier) + futures.append(self.identities_service.find_from_pubkey(certification.certifier)) + results = await asyncio.gather(*futures) + node_status = results[0] + if not certifier: + certifier = results[1] + self.identities_service.insert_or_update_identity(certifier) self.add_certifier_node(certifier, identity, certification, node_status) except NoPeerAvailable as e: logging.debug(str(e)) @@ -213,10 +218,14 @@ class BaseGraph(QObject): # add certified by uid for certification in tuple(certified_list): certified = self.identities_service.get_identity(certification.certified) + futures = [self.node_status(certified)] + if not certified: + futures.append(self.identities_service.find_from_pubkey(certification.certified)) + results = await asyncio.gather(*futures) + node_status = results[0] if not certified: - certified = await self.identities_service.find_from_pubkey(certification.certified) - self.identities_service.insert_or_update_identity(certified) - node_status = await self.node_status(certified) + certified = results[1] + self.identities_service.insert_or_update_identity(certified) self.add_certified_node(identity, certified, certification, node_status) except NoPeerAvailable as e: diff --git a/src/sakia/data/processors/nodes.py b/src/sakia/data/processors/nodes.py index a128b9308a750c9ce61277b264c4d9678fdb21c5..1e334fc46d8a88133913031ad9a52150b094b84f 100644 --- a/src/sakia/data/processors/nodes.py +++ b/src/sakia/data/processors/nodes.py @@ -145,7 +145,6 @@ class NodesProcessor: logging.debug("Update node : {0}".format(head.pubkey[:5])) node.previous_buid = node.current_buid node.current_buid = head.blockstamp - node.state = 0 self._repo.update(node) return node, True return node, False @@ -169,7 +168,7 @@ class NodesProcessor: def handle_success(self, node): if not node.online(): node.last_state_change = time.time() - node.state = 0 + node.state = node.state - 1 self.update_node(node) def handle_failure(self, node, weight=1): diff --git a/src/sakia/data/repositories/nodes.py b/src/sakia/data/repositories/nodes.py index 3d537093b0dcdb3774d7160e53c131966a32a8f2..ee02104c4f3e65cbba2d88c84f0d187fc75a8814 100644 --- a/src/sakia/data/repositories/nodes.py +++ b/src/sakia/data/repositories/nodes.py @@ -151,21 +151,13 @@ class NodesRepo: return [] def current_buid(self, currency): - req = """SELECT `current_buid`, - COUNT(`current_buid`) AS `value_occurrence` - FROM `nodes` - WHERE state == 1 AND member == 1 AND currency == ? - GROUP BY `current_buid` - ORDER BY `value_occurrence` DESC - LIMIT 1;""" - c = self._conn.execute("""SELECT `current_buid`, COUNT(`current_buid`) AS `value_occurrence` FROM `nodes` - WHERE state <= ? AND member == 1 AND currency == ? + WHERE member == 1 AND currency == ? GROUP BY `current_buid` ORDER BY `value_occurrence` DESC - LIMIT 1;""", (Node.FAILURE_THRESHOLD, currency,)) + LIMIT 1;""", (currency,)) data = c.fetchone() if data: return block_uid(data[0]) @@ -173,10 +165,10 @@ class NodesRepo: c = self._conn.execute("""SELECT `current_buid`, COUNT(`current_buid`) AS `value_occurrence` FROM `nodes` - WHERE state <= ? AND currency == ? + WHERE currency == ? GROUP BY `current_buid` ORDER BY `value_occurrence` DESC - LIMIT 1;""", (Node.FAILURE_THRESHOLD, currency,)) + LIMIT 1;""", (currency,)) data = c.fetchone() if data: return block_uid(data[0]) diff --git a/src/sakia/services/network.py b/src/sakia/services/network.py index d52b28b2acffb976ad417d3e25e00bf0fc721bff..eae35138eee1432152adf3aeba2dc02852d76aea 100644 --- a/src/sakia/services/network.py +++ b/src/sakia/services/network.py @@ -216,6 +216,7 @@ class NetworkService(QObject): node.member = identity.member node.uid = identity.uid self._processor.update_node(node) + self._processor.handle_success(node) self.node_changed.emit(node) except errors.DuniterError as e: self._logger.error(e.message)