Fixed resource transfers hanging for a long time over slow links if proof packet is lost

This commit is contained in:
Mark Qvist 2024-10-10 17:06:43 +02:00
parent d63bbcdc0a
commit 6521f839cd
2 changed files with 17 additions and 1 deletions

View File

@ -118,6 +118,7 @@ class Resource:
PART_TIMEOUT_FACTOR = 4 PART_TIMEOUT_FACTOR = 4
PART_TIMEOUT_FACTOR_AFTER_RTT = 2 PART_TIMEOUT_FACTOR_AFTER_RTT = 2
PROOF_TIMEOUT_FACTOR = 3
MAX_RETRIES = 16 MAX_RETRIES = 16
MAX_ADV_RETRIES = 4 MAX_ADV_RETRIES = 4
SENDER_GRACE_TIME = 10.0 SENDER_GRACE_TIME = 10.0
@ -532,6 +533,10 @@ class Resource:
sleep_time = 0.001 sleep_time = 0.001
elif self.status == Resource.AWAITING_PROOF: elif self.status == Resource.AWAITING_PROOF:
# Decrease timeout factor since proof packets are
# significantly smaller than full req/resp roundtrip
self.timeout_factor = Resource.PROOF_TIMEOUT_FACTOR
sleep_time = self.last_part_sent + (self.rtt*self.timeout_factor+self.sender_grace_time) - time.time() sleep_time = self.last_part_sent + (self.rtt*self.timeout_factor+self.sender_grace_time) - time.time()
if sleep_time < 0: if sleep_time < 0:
if self.retries_left <= 0: if self.retries_left <= 0:
@ -623,6 +628,7 @@ class Resource:
proof_data = self.hash+proof proof_data = self.hash+proof
proof_packet = RNS.Packet(self.link, proof_data, packet_type=RNS.Packet.PROOF, context=RNS.Packet.RESOURCE_PRF) proof_packet = RNS.Packet(self.link, proof_data, packet_type=RNS.Packet.PROOF, context=RNS.Packet.RESOURCE_PRF)
proof_packet.send() proof_packet.send()
RNS.Transport.cache(proof_packet, force_cache=True)
except Exception as e: except Exception as e:
RNS.log("Could not send proof packet, cancelling resource", RNS.LOG_DEBUG) RNS.log("Could not send proof packet, cancelling resource", RNS.LOG_DEBUG)
RNS.log("The contained exception was: "+str(e), RNS.LOG_DEBUG) RNS.log("The contained exception was: "+str(e), RNS.LOG_DEBUG)
@ -919,6 +925,7 @@ class Resource:
if self.sent_parts == len(self.parts): if self.sent_parts == len(self.parts):
self.status = Resource.AWAITING_PROOF self.status = Resource.AWAITING_PROOF
self.retries_left = 3
if self.__progress_callback != None: if self.__progress_callback != None:
try: try:

View File

@ -1738,7 +1738,16 @@ class Transport:
if link.link_id == packet.destination_hash: if link.link_id == packet.destination_hash:
if link.attached_interface == packet.receiving_interface: if link.attached_interface == packet.receiving_interface:
packet.link = link packet.link = link
link.receive(packet) if packet.context == RNS.Packet.CACHE_REQUEST:
cached_packet = Transport.get_cached_packet(packet.data)
if cached_packet != None:
cached_packet.unpack()
RNS.Packet(destination=link, data=cached_packet.data,
packet_type=cached_packet.packet_type, context=cached_packet.context).send()
Transport.jobs_locked = False
else:
link.receive(packet)
else: else:
# In the strange and rare case that an interface # In the strange and rare case that an interface
# is partly malfunctioning, and a link-associated # is partly malfunctioning, and a link-associated