From ffd4c3a8677345657764d13e922f45981d9af5c9 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Mon, 2 Dec 2019 10:57:29 +0200 Subject: [PATCH 1/6] Introduce outages - a dict of all hosts to track multiport configurations / port change events --- src/network/knownnodes.py | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/network/knownnodes.py b/src/network/knownnodes.py index 4840aad9..cf7dfd22 100644 --- a/src/network/knownnodes.py +++ b/src/network/knownnodes.py @@ -34,6 +34,9 @@ knownNodesForgetRating = -0.5 knownNodesActual = False +outages = {} +"""a dict with all hosts""" + logger = logging.getLogger('default') DEFAULT_NODES = ( @@ -71,7 +74,13 @@ def json_deserialize_knownnodes(source): for node in json.load(source): peer = node['peer'] info = node['info'] - peer = Peer(str(peer['host']), peer.get('port', 8444)) + port = peer.get('port', 8444) + peer = Peer(str(peer['host']), port) + outages[peer.host] = { + 'lastseen': info.get('lastseen', time.time()), + 'port': port, + 'stream': info.get('stream', 1) + } knownNodes[node['stream']][peer] = info if not (knownNodesActual or info.get('self')) and peer not in DEFAULT_NODES: @@ -121,11 +130,15 @@ def addKnownNode(stream, peer, lastseen=None, is_self=False): else: lastseen = int(lastseen) try: + prev = outages[peer.host] + if peer.port == prev['port']: + outages[peer.host]['lastseen'] = lastseen info = knownNodes[stream].get(peer) - if lastseen > info['lastseen']: - info['lastseen'] = lastseen - except (KeyError, TypeError): + info['lastseen'] = lastseen + except KeyError: pass + except TypeError: + rating = -0.2 else: return @@ -133,6 +146,22 @@ def addKnownNode(stream, peer, lastseen=None, is_self=False): if len(knownNodes[stream]) > BMConfigParser().safeGetInt( "knownnodes", "maxnodes"): return + try: + prev = outages[peer.host] + except KeyError: + outages[peer.host] = { + 'stream': stream, + 'port': peer.port, + 'lastseen': lastseen + } + else: + if stream == prev['stream']: + if lastseen - prev['lastseen'] > 3600 * 24: + # more than a day ago, this should be port change + del knownNodes[stream][Peer(peer.host, prev['port'])] + outages[peer.host]['port'] = peer.port + else: + rating = -0.2 knownNodes[stream][peer] = { 'lastseen': lastseen, -- 2.47.2 From fd8477c3be87f420632f4a62d0934c1c2f8f6660 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Wed, 4 Dec 2019 11:34:04 +0200 Subject: [PATCH 2/6] Don't update expired node if have enough nodes in that stream --- src/network/knownnodes.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/knownnodes.py b/src/network/knownnodes.py index cf7dfd22..a17fae58 100644 --- a/src/network/knownnodes.py +++ b/src/network/knownnodes.py @@ -138,6 +138,9 @@ def addKnownNode(stream, peer, lastseen=None, is_self=False): except KeyError: pass except TypeError: + # don't update expired node if have enough nodes in that stream + if len(knownNodes[stream]) > 64: + return rating = -0.2 else: return -- 2.47.2 From b2a7292d21e713f24d9aee68a6d56689818edea6 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Wed, 24 Mar 2021 14:54:36 +0200 Subject: [PATCH 3/6] Sudden KeyError in addKnownNode() --- src/network/knownnodes.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/network/knownnodes.py b/src/network/knownnodes.py index a17fae58..e6d2f290 100644 --- a/src/network/knownnodes.py +++ b/src/network/knownnodes.py @@ -161,7 +161,10 @@ def addKnownNode(stream, peer, lastseen=None, is_self=False): if stream == prev['stream']: if lastseen - prev['lastseen'] > 3600 * 24: # more than a day ago, this should be port change - del knownNodes[stream][Peer(peer.host, prev['port'])] + try: + del knownNodes[stream][Peer(peer.host, prev['port'])] + except KeyError: + pass outages[peer.host]['port'] = peer.port else: rating = -0.2 -- 2.47.2 From 3a06263f27552fa8f765779ad8a6049649839012 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Sat, 15 May 2021 20:24:18 +0300 Subject: [PATCH 4/6] Remove duplicate ports for connected nodes upon cleanup --- src/class_singleCleaner.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/class_singleCleaner.py b/src/class_singleCleaner.py index 4555b40f..6c390fdf 100644 --- a/src/class_singleCleaner.py +++ b/src/class_singleCleaner.py @@ -140,9 +140,22 @@ class singleCleaner(StoppableThread): if state.thisapp.daemon or not state.enableGUI: os._exit(1) - # inv/object tracking for connection in BMConnectionPool().connections(): - connection.clean() + connection.clean() # inv/object tracking + if not connection.fullyEstablished: + continue + self.logger.warning( + 'Cleaning up duplicate ports for host %s', + connection.destination.host) + # remove peers with same host and other ports from knownnodes + for stream in connection.streams: + for node in [ + node for node in knownnodes.knownNodes[stream] + if node.host == connection.destination.host + and node.port != connection.destination.port + ]: + self.logger.warning('port %s', node.port) + del knownnodes.knownNodes[stream][node] # discovery tracking exp = time.time() - singleCleaner.expireDiscoveredPeers -- 2.47.2 From a57358d80adf28f40f28a7d12c1bf5c8af49a1ed Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Sat, 15 May 2021 20:48:01 +0300 Subject: [PATCH 5/6] Decrease rating for stream 0 --- src/class_singleCleaner.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class_singleCleaner.py b/src/class_singleCleaner.py index 6c390fdf..dd471f9f 100644 --- a/src/class_singleCleaner.py +++ b/src/class_singleCleaner.py @@ -149,6 +149,9 @@ class singleCleaner(StoppableThread): connection.destination.host) # remove peers with same host and other ports from knownnodes for stream in connection.streams: + if stream == 0: # FIXME: stream 0 is a protocol violation + knownnodes.decreaseRating(connection.destination) + continue for node in [ node for node in knownnodes.knownNodes[stream] if node.host == connection.destination.host -- 2.47.2 From 142fe1adc581308b2d80a54d0f66c0bc75f6c189 Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Sat, 15 May 2021 21:22:02 +0300 Subject: [PATCH 6/6] Warning for stream 0 --- src/class_singleCleaner.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class_singleCleaner.py b/src/class_singleCleaner.py index dd471f9f..9dd77dcb 100644 --- a/src/class_singleCleaner.py +++ b/src/class_singleCleaner.py @@ -150,6 +150,9 @@ class singleCleaner(StoppableThread): # remove peers with same host and other ports from knownnodes for stream in connection.streams: if stream == 0: # FIXME: stream 0 is a protocol violation + self.logger.warning( + 'Found stream 0 for node %s:%i', + connection.destination) knownnodes.decreaseRating(connection.destination) continue for node in [ -- 2.47.2