Skip to content
This repository was archived by the owner on Jul 1, 2021. It is now read-only.

Commit 0f7a312

Browse files
committed
Use asyncio.Server as an async ctx manager in our TCP listener
This was added on py37, and ensures we don't silence crashes in our TCP listener server
1 parent d88fdd7 commit 0f7a312

File tree

2 files changed

+14
-21
lines changed

2 files changed

+14
-21
lines changed

setup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
"websockets>=8.1.0",
4949
"jsonschema==3.0.1",
5050
"mypy-extensions>=0.4.3,<0.5.0",
51-
"typing_extensions>=3.7.4,<4.0.0",
5251
"ruamel.yaml==0.16.10",
5352
"argcomplete>=1.10.0,<2",
5453
"multiaddr>=0.0.8,<0.1.0",

trinity/server.py

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
from abc import abstractmethod
22
import asyncio
3-
import contextlib
43
from typing import (
5-
AsyncIterator,
64
Generic,
75
Tuple,
86
Type,
@@ -103,21 +101,6 @@ def __init__(self,
103101
def _make_peer_pool(self) -> TPeerPool:
104102
...
105103

106-
@contextlib.asynccontextmanager
107-
async def tcp_listener(self) -> AsyncIterator[None]:
108-
# TODO: Support IPv6 addresses as well.
109-
tcp_listener = await asyncio.start_server(
110-
self.receive_handshake,
111-
host=BOUND_IP,
112-
port=self.port,
113-
)
114-
try:
115-
yield
116-
finally:
117-
self.logger.info("Server finished, closing TCP listener...")
118-
tcp_listener.close()
119-
await tcp_listener.wait_closed()
120-
121104
async def run(self) -> None:
122105
self.logger.info("Running server...")
123106
self.logger.info(
@@ -129,9 +112,20 @@ async def run(self) -> None:
129112
self.logger.info('network: %s', self.network_id)
130113
self.logger.info('peers: max_peers=%s', self.max_peers)
131114

132-
async with self.tcp_listener():
133-
self.manager.run_daemon_child_service(self.peer_pool)
134-
await self.manager.wait_finished()
115+
# TODO: Support IPv6 addresses as well.
116+
tcp_listener = await asyncio.start_server(
117+
self.receive_handshake,
118+
host=BOUND_IP,
119+
port=self.port,
120+
)
121+
try:
122+
# mypy doesn't know that the Server returned above is an async contextmanager.
123+
async with tcp_listener: # type: ignore
124+
self.manager.run_daemon_child_service(self.peer_pool)
125+
await tcp_listener.serve_forever()
126+
finally:
127+
self.logger.info("TCP Listener finished, cancelling Server")
128+
self.manager.cancel()
135129

136130
async def receive_handshake(
137131
self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None:

0 commit comments

Comments
 (0)