fix sendfile exceptions

This commit is contained in:
Jack Robison 2019-12-01 23:05:40 -05:00
parent 669f3394c7
commit 569de37e16
No known key found for this signature in database
GPG key ID: DF25C68FE0239BB2
2 changed files with 13 additions and 5 deletions

View file

@ -163,7 +163,10 @@ class AbstractBlob:
if not self.is_readable(): if not self.is_readable():
raise OSError('blob files cannot be read') raise OSError('blob files cannot be read')
with self.reader_context() as handle: with self.reader_context() as handle:
return await self.loop.sendfile(writer.transport, handle, count=self.get_length()) try:
return await self.loop.sendfile(writer.transport, handle, count=self.get_length())
except (ConnectionResetError, BrokenPipeError, RuntimeError, OSError, AttributeError):
return -1
def decrypt(self, key: bytes, iv: bytes) -> bytes: def decrypt(self, key: bytes, iv: bytes) -> bytes:
""" """

View file

@ -101,16 +101,21 @@ class BlobServerProtocol(asyncio.Protocol):
self.started_transfer.set() self.started_transfer.set()
try: try:
sent = await asyncio.wait_for(blob.sendfile(self), self.transfer_timeout, loop=self.loop) sent = await asyncio.wait_for(blob.sendfile(self), self.transfer_timeout, loop=self.loop)
self.blob_manager.connection_manager.sent_data(self.peer_address_and_port, sent) if sent and sent > 0:
log.info("sent %s (%i bytes) to %s:%i", bh, sent, peer_address, peer_port) self.blob_manager.connection_manager.sent_data(self.peer_address_and_port, sent)
except (ConnectionResetError, BrokenPipeError, RuntimeError, OSError, asyncio.TimeoutError) as err: log.info("sent %s (%i bytes) to %s:%i", bh, sent, peer_address, peer_port)
else:
log.debug("stopped sending %s to %s:%i", bh, peer_address, peer_port)
except (OSError, asyncio.TimeoutError) as err:
if isinstance(err, asyncio.TimeoutError): if isinstance(err, asyncio.TimeoutError):
log.debug("timed out sending blob %s to %s", bh, peer_address) log.debug("timed out sending blob %s to %s", bh, peer_address)
else: else:
log.debug("stopped sending %s to %s:%i", bh, peer_address, peer_port) log.warning("could not read blob %s to send %s:%i", bh, peer_address, peer_port)
self.close() self.close()
finally: finally:
self.transfer_finished.set() self.transfer_finished.set()
else:
log.info("don't have %s to send %s:%i", blob.blob_hash[:8], peer_address, peer_port)
if responses: if responses:
self.send_response(responses) self.send_response(responses)