Handle propagation node stamp cost peering signalling
This commit is contained in:
parent
0f2d3b06c2
commit
bd6fe9f9d1
3 changed files with 29 additions and 23 deletions
|
|
@ -45,42 +45,35 @@ class LXMFPropagationAnnounceHandler:
|
||||||
if self.lxmrouter.propagation_node:
|
if self.lxmrouter.propagation_node:
|
||||||
data = msgpack.unpackb(app_data)
|
data = msgpack.unpackb(app_data)
|
||||||
if pn_announce_data_is_valid(data):
|
if pn_announce_data_is_valid(data):
|
||||||
node_timebase = data[1]
|
pn_active = data[0]
|
||||||
propagation_transfer_limit = None
|
node_timebase = int(data[1])
|
||||||
propagation_sync_limit = None
|
propagation_transfer_limit = int(data[2])
|
||||||
wanted_inbound_peers = None
|
propagation_sync_limit = int(data[3])
|
||||||
if len(data) >= 5:
|
propagation_stamp_cost = int(data[4][0])
|
||||||
try: propagation_sync_limit = int(data[4])
|
propagation_stamp_cost_flexibility = int(data[4][1])
|
||||||
except Exception as e: propagation_sync_limit = None
|
|
||||||
|
|
||||||
if len(data) >= 4:
|
|
||||||
# TODO: Rethink, probably not necessary anymore
|
|
||||||
# try: wanted_inbound_peers = int(data[3])
|
|
||||||
# except: wanted_inbound_peers = None
|
|
||||||
pass
|
|
||||||
|
|
||||||
if len(data) >= 3:
|
|
||||||
try: propagation_transfer_limit = float(data[2])
|
|
||||||
except: propagation_transfer_limit = None
|
|
||||||
|
|
||||||
if destination_hash in self.lxmrouter.static_peers:
|
if destination_hash in self.lxmrouter.static_peers:
|
||||||
self.lxmrouter.peer(destination_hash=destination_hash,
|
self.lxmrouter.peer(destination_hash=destination_hash,
|
||||||
timestamp=node_timebase,
|
timestamp=node_timebase,
|
||||||
propagation_transfer_limit=propagation_transfer_limit,
|
propagation_transfer_limit=propagation_transfer_limit,
|
||||||
propagation_sync_limit=propagation_sync_limit,
|
propagation_sync_limit=propagation_sync_limit,
|
||||||
|
propagation_stamp_cost=propagation_stamp_cost,
|
||||||
|
propagation_stamp_cost_flexibility=propagation_stamp_cost_flexibility,
|
||||||
wanted_inbound_peers=wanted_inbound_peers)
|
wanted_inbound_peers=wanted_inbound_peers)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if self.lxmrouter.autopeer:
|
if self.lxmrouter.autopeer:
|
||||||
if data[0] == True:
|
if pn_active == True:
|
||||||
if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth:
|
if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth:
|
||||||
self.lxmrouter.peer(destination_hash=destination_hash,
|
self.lxmrouter.peer(destination_hash=destination_hash,
|
||||||
timestamp=node_timebase,
|
timestamp=node_timebase,
|
||||||
propagation_transfer_limit=propagation_transfer_limit,
|
propagation_transfer_limit=propagation_transfer_limit,
|
||||||
propagation_sync_limit=propagation_sync_limit,
|
propagation_sync_limit=propagation_sync_limit,
|
||||||
|
propagation_stamp_cost=propagation_stamp_cost,
|
||||||
|
propagation_stamp_cost_flexibility=propagation_stamp_cost_flexibility,
|
||||||
wanted_inbound_peers=wanted_inbound_peers)
|
wanted_inbound_peers=wanted_inbound_peers)
|
||||||
|
|
||||||
elif data[0] == False:
|
elif pn_active == False:
|
||||||
self.lxmrouter.unpeer(destination_hash, node_timebase)
|
self.lxmrouter.unpeer(destination_hash, node_timebase)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
||||||
11
LXMF/LXMF.py
11
LXMF/LXMF.py
|
|
@ -138,11 +138,20 @@ def stamp_cost_from_app_data(app_data=None):
|
||||||
def pn_announce_data_is_valid(data):
|
def pn_announce_data_is_valid(data):
|
||||||
try:
|
try:
|
||||||
if type(data) == bytes: data = msgpack.unpackb(data)
|
if type(data) == bytes: data = msgpack.unpackb(data)
|
||||||
if len(data) < 3: raise ValueError("Invalid announce data: Insufficient peer data")
|
if len(data) < 5: raise ValueError("Invalid announce data: Insufficient peer data")
|
||||||
else:
|
else:
|
||||||
if data[0] != True and data[0] != False: raise ValueError("Invalid announce data: Indeterminate propagation node status")
|
if data[0] != True and data[0] != False: raise ValueError("Invalid announce data: Indeterminate propagation node status")
|
||||||
try: int(data[1])
|
try: int(data[1])
|
||||||
except: raise ValueError("Invalid announce data: Could not decode peer timebase")
|
except: raise ValueError("Invalid announce data: Could not decode peer timebase")
|
||||||
|
try: int(data[2])
|
||||||
|
except: raise ValueError("Invalid announce data: Could not decode peer propagation transfer limit")
|
||||||
|
try: int(data[3])
|
||||||
|
except: raise ValueError("Invalid announce data: Could not decode peer propagation sync limit")
|
||||||
|
if type(data[4]) != list: raise ValueError("Invalid announce data: Could not decode peer stamp costs")
|
||||||
|
try: int(data[4][0])
|
||||||
|
except: raise ValueError("Invalid announce data: Could not decode peer target stamp cost")
|
||||||
|
try: int(data[4][1])
|
||||||
|
except: raise ValueError("Invalid announce data: Could not decode peer stamp cost flexibility")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log(f"Could not validate propagation node announce data: {e}", RNS.LOG_DEBUG)
|
RNS.log(f"Could not validate propagation node announce data: {e}", RNS.LOG_DEBUG)
|
||||||
|
|
|
||||||
|
|
@ -288,8 +288,8 @@ class LXMRouter:
|
||||||
node_state, # Boolean flag signalling propagation node state
|
node_state, # Boolean flag signalling propagation node state
|
||||||
int(time.time()), # Current node timebase
|
int(time.time()), # Current node timebase
|
||||||
self.propagation_per_transfer_limit, # Per-transfer limit for message propagation in kilobytes
|
self.propagation_per_transfer_limit, # Per-transfer limit for message propagation in kilobytes
|
||||||
stamp_cost, # Propagation stamp cost for this node
|
|
||||||
self.propagation_per_sync_limit, # Limit for incoming propagation node syncs
|
self.propagation_per_sync_limit, # Limit for incoming propagation node syncs
|
||||||
|
stamp_cost, # Propagation stamp cost for this node
|
||||||
]
|
]
|
||||||
|
|
||||||
data = msgpack.packb(announce_data)
|
data = msgpack.packb(announce_data)
|
||||||
|
|
@ -1783,7 +1783,7 @@ class LXMRouter:
|
||||||
### Peer Sync & Propagation ###########################
|
### Peer Sync & Propagation ###########################
|
||||||
#######################################################
|
#######################################################
|
||||||
|
|
||||||
def peer(self, destination_hash, timestamp, propagation_transfer_limit, propagation_sync_limit, wanted_inbound_peers = None):
|
def peer(self, destination_hash, timestamp, propagation_transfer_limit, propagation_sync_limit, propagation_stamp_cost, propagation_stamp_cost_flexibility):
|
||||||
if destination_hash in self.peers:
|
if destination_hash in self.peers:
|
||||||
peer = self.peers[destination_hash]
|
peer = self.peers[destination_hash]
|
||||||
if timestamp > peer.peering_timebase:
|
if timestamp > peer.peering_timebase:
|
||||||
|
|
@ -1792,6 +1792,8 @@ class LXMRouter:
|
||||||
peer.next_sync_attempt = 0
|
peer.next_sync_attempt = 0
|
||||||
peer.peering_timebase = timestamp
|
peer.peering_timebase = timestamp
|
||||||
peer.last_heard = time.time()
|
peer.last_heard = time.time()
|
||||||
|
peer.propagation_stamp_cost = propagation_stamp_cost
|
||||||
|
peer.propagation_stamp_cost_flexibility = propagation_stamp_cost_flexibility
|
||||||
peer.propagation_transfer_limit = propagation_transfer_limit
|
peer.propagation_transfer_limit = propagation_transfer_limit
|
||||||
if propagation_sync_limit != None: peer.propagation_sync_limit = propagation_sync_limit
|
if propagation_sync_limit != None: peer.propagation_sync_limit = propagation_sync_limit
|
||||||
else: peer.propagation_sync_limit = propagation_transfer_limit
|
else: peer.propagation_sync_limit = propagation_transfer_limit
|
||||||
|
|
@ -1803,6 +1805,8 @@ class LXMRouter:
|
||||||
peer = LXMPeer(self, destination_hash, sync_strategy=self.default_sync_strategy)
|
peer = LXMPeer(self, destination_hash, sync_strategy=self.default_sync_strategy)
|
||||||
peer.alive = True
|
peer.alive = True
|
||||||
peer.last_heard = time.time()
|
peer.last_heard = time.time()
|
||||||
|
peer.propagation_stamp_cost = propagation_stamp_cost
|
||||||
|
peer.propagation_stamp_cost_flexibility = propagation_stamp_cost_flexibility
|
||||||
peer.propagation_transfer_limit = propagation_transfer_limit
|
peer.propagation_transfer_limit = propagation_transfer_limit
|
||||||
if propagation_sync_limit != None: peer.propagation_sync_limit = propagation_sync_limit
|
if propagation_sync_limit != None: peer.propagation_sync_limit = propagation_sync_limit
|
||||||
else: peer.propagation_sync_limit = propagation_transfer_limit
|
else: peer.propagation_sync_limit = propagation_transfer_limit
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue