When merging clients, merge also error count

This commit is contained in:
Yohann D'ANELLO 2021-01-05 21:04:08 +01:00
parent 5bb4748056
commit dc9f836932
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
1 changed files with 18 additions and 11 deletions

View File

@ -36,8 +36,8 @@ class Hazelnut:
# See https://fr.wikipedia.org/wiki/Adresse_IPv6_mappant_IPv4 # See https://fr.wikipedia.org/wiki/Adresse_IPv6_mappant_IPv4
address = "::ffff:" + socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0] address = "::ffff:" + socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
self.addresses = list() self.addresses = set()
self.addresses.append((address, port)) self.addresses.add((address, port))
@property @property
def potential(self) -> bool: def potential(self) -> bool:
@ -53,7 +53,7 @@ class Hazelnut:
A client can have multiple addresses. A client can have multiple addresses.
We contact it only on one of them. We contact it only on one of them.
""" """
return self.addresses[0] return list(self.addresses)[0]
@property @property
def banned(self) -> bool: def banned(self) -> bool:
@ -68,6 +68,19 @@ class Hazelnut:
def __str__(self): def __str__(self):
return repr(self) return repr(self)
def merge(self, other: "Hazelnut") -> "Hazelnut":
"""
Merge the hazelnut data with one other.
The symmetric and active properties are kept from the original client.
"""
self.errors = max(self.errors, other.errors)
self.last_hello_time = max(self.last_hello_time, other.last_hello_time)
self.last_long_hello_time = max(self.last_hello_time, other.last_long_hello_time)
self.addresses.update(self.addresses)
self.addresses.update(other.addresses)
self.id = self.id if self.id > 0 else other.id
return self
class Squirrel(Hazelnut): class Squirrel(Hazelnut):
""" """
@ -686,19 +699,13 @@ class Squirrel(Hazelnut):
if addr in self.hazelnuts: if addr in self.hazelnuts:
# Merge with the previous hazel # Merge with the previous hazel
old_hazel = self.hazelnuts[addr] old_hazel = self.hazelnuts[addr]
for other_addr in old_hazel.addresses: hazelnut.merge(old_hazel)
if other_addr not in hazelnut.addresses:
hazelnut.addresses.append(other_addr)
self.hazelnuts[other_addr] = hazelnut
self.hazelnuts[addr] = hazelnut self.hazelnuts[addr] = hazelnut
for other_hazel in list(self.hazelnuts.values()): for other_hazel in list(self.hazelnuts.values()):
if other_hazel.id == hazelnut.id > 0 and other_hazel != hazelnut: if other_hazel.id == hazelnut.id > 0 and other_hazel != hazelnut:
# The hazelnut with the same id is known as a different address. We merge everything # The hazelnut with the same id is known as a different address. We merge everything
for addr in other_hazel.addresses: hazelnut.merge(other_hazel)
self.hazelnuts[addr] = hazelnut
if addr not in hazelnut.addresses:
hazelnut.addresses.append(addr)
def send_neighbours(self) -> None: def send_neighbours(self) -> None:
""" """