3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-12-28 05:32:51 +01:00

Retry when socket.send() fails with BlockingIOError / EAGAIN

This commit is contained in:
James Lu 2020-09-29 17:43:38 +00:00
parent 2aa00d6efc
commit d50de12834

View File

@ -2091,11 +2091,22 @@ class IRCNetwork(PyLinkNetworkCoreWithUtils):
log.debug("(%s) -> %s", self.name, data)
try:
self._socket.send(encoded_data)
except:
log.exception("(%s) Failed to send message %r; aborting!", self.name, data)
self.disconnect()
while True:
try:
self._socket.send(encoded_data)
except (BlockingIOError, ssl.SSLWantReadError, ssl.SSLWantWriteError):
# The send attempt failed, wait a little bit.
# I would prefer using a blocking socket and MSG_DONTWAIT in recv()'s flags
# but SSLSocket doesn't support that...
throttle_time = self.serverdata.get('throttle_time', 0)
if self._aborted.wait(throttle_time):
break
continue
except:
log.exception("(%s) Failed to send message %r; aborting!", self.name, data)
self.disconnect()
else:
break
def send(self, data, queue=True):
"""send() wrapper with optional queueing support."""