1
0

interface: speed up handle_disconnect via shorter flush-buffer-timeout

Note in particular that _RSClient.__aexit__ calls session.close()
so a lot of time can pass between interface.taskgroup raising and
handle_disconnect seeing the exception.

related https://github.com/spesmilo/electrum/issues/7677
This commit is contained in:
SomberNight
2022-02-22 15:13:42 +01:00
parent 4f102d7752
commit 2acecc5859

View File

@@ -220,6 +220,19 @@ class NotificationSession(RPCSession):
MAX_INCOMING_MSG_SIZE)) MAX_INCOMING_MSG_SIZE))
return NewlineFramer(max_size=max_size) return NewlineFramer(max_size=max_size)
async def close(self, *, force_after: int = None):
"""Closes the connection and waits for it to be closed.
We try to flush buffered data to the wire, which can take some time.
"""
if force_after is None:
# We give up after a while and just abort the connection.
# Note: specifically if the server is running Fulcrum, waiting seems hopeless,
# the connection must be aborted (see https://github.com/cculianu/Fulcrum/issues/76)
# Note: if the ethernet cable was pulled or wifi disconnected, that too might
# wait until this timeout is triggered
force_after = 1 # seconds
await super().close(force_after=force_after)
class NetworkException(Exception): pass class NetworkException(Exception): pass
@@ -693,11 +706,6 @@ class Interface(Logger):
"""Closes the connection and waits for it to be closed. """Closes the connection and waits for it to be closed.
We try to flush buffered data to the wire, which can take some time. We try to flush buffered data to the wire, which can take some time.
""" """
if force_after is None:
# We give up after a while and just abort the connection.
# Note: specifically if the server is running Fulcrum, waiting seems hopeless,
# the connection must be aborted (see https://github.com/cculianu/Fulcrum/issues/76)
force_after = 1 # seconds
if self.session: if self.session:
await self.session.close(force_after=force_after) await self.session.close(force_after=force_after)
# monitor_connection will cancel tasks # monitor_connection will cancel tasks