async def request_blob(loop: asyncio.BaseEventLoop, blob: 'AbstractBlob', address: str, tcp_port: int, peer_connect_timeout: float, blob_download_timeout: float, connected_transport: asyncio.Transport = None, connection_id: int = 0, connection_manager: typing.Optional['ConnectionManager'] = None)\ -> typing.Tuple[int, typing.Optional[asyncio.Transport]]: """ Returns [<downloaded blob>, <keep connection>] """ protocol = BlobExchangeClientProtocol( loop, blob_download_timeout, connection_manager ) if connected_transport and not connected_transport.is_closing(): connected_transport.set_protocol(protocol) protocol.transport = connected_transport log.debug("reusing connection for %s:%d", address, tcp_port) else: connected_transport = None try: if not connected_transport: await asyncio.wait_for(loop.create_connection(lambda: protocol, address, tcp_port), peer_connect_timeout, loop=loop) if blob.get_is_verified() or not blob.is_writeable(): # file exists but not verified means someone is writing right now, give it time, come back later return 0, connected_transport return await protocol.download_blob(blob) except (asyncio.TimeoutError, ConnectionRefusedError, ConnectionAbortedError, OSError): return 0, None
async def request_blob( loop: asyncio.BaseEventLoop, blob: 'BlobFile', protocol: 'BlobExchangeClientProtocol', address: str, tcp_port: int, peer_connect_timeout: float) -> typing.Tuple[bool, bool]: """ Returns [<downloaded blob>, <keep connection>] """ if blob.get_is_verified(): return False, True try: await asyncio.wait_for(loop.create_connection(lambda: protocol, address, tcp_port), peer_connect_timeout, loop=loop) return await protocol.download_blob(blob) except (asyncio.TimeoutError, asyncio.CancelledError, ConnectionRefusedError, ConnectionAbortedError, OSError): return False, False
def create_connection(cls, loop: asyncio.BaseEventLoop, **kwargs) -> types.coroutine: host = kwargs['host'] port = kwargs['port'] return loop.create_connection(lambda: cls(loop), host=host, port=port)