Skip to content

Commit fb1a972

Browse files
committed
Change how BaseService does finished callbacks
1 parent 73ea0e5 commit fb1a972

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

p2p/peer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ def unsubscribe(self, subscriber: PeerSubscriber) -> None:
700700
peer.remove_subscriber(subscriber)
701701

702702
async def start_peer(self, peer: BasePeer) -> None:
703-
asyncio.ensure_future(peer.run(finished_callback=self._peer_finished))
703+
asyncio.ensure_future(peer.run())
704704
await self.wait(peer.events.started.wait(), timeout=1)
705705
try:
706706
# Although connect() may seem like a more appropriate place to perform the DAO fork
@@ -726,6 +726,7 @@ def _add_peer(self,
726726
"""
727727
self.logger.info('Adding %s to pool', peer)
728728
self.connected_nodes[peer.remote] = peer
729+
peer.add_finished_callback(self._peer_finished)
729730
for subscriber in self._subscribers:
730731
subscriber.register_peer(peer)
731732
peer.add_subscriber(subscriber)

p2p/service.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(self) -> None:
2929
class BaseService(ABC, CancellableMixin):
3030
logger: TraceLogger = None
3131
_child_services: List['BaseService']
32+
_finished_callbacks: List[Callable[['BaseService'], None]]
3233
# Number of seconds cancel() will wait for run() to finish.
3334
_wait_until_finished_timeout = 5
3435

@@ -43,6 +44,7 @@ def __init__(self, token: CancelToken=None, loop: asyncio.AbstractEventLoop = No
4344
self._run_lock = asyncio.Lock()
4445
self.events = ServiceEvents()
4546
self._child_services = []
47+
self._finished_callbacks = []
4648

4749
self.loop = loop
4850
base_token = CancelToken(type(self).__name__, loop=loop)
@@ -65,6 +67,9 @@ async def run(
6567
elif self.cancel_token.triggered:
6668
raise RuntimeError("Cannot restart a service that has already been cancelled")
6769

70+
if finished_callback:
71+
self._finished_callbacks.append(finished_callback)
72+
6873
try:
6974
async with self._run_lock:
7075
self.events.started.set()
@@ -81,16 +86,15 @@ async def run(
8186

8287
await self.cleanup()
8388

84-
from p2p.peer import BasePeer # type: ignore
85-
if finished_callback is not None:
86-
finished_callback(self)
87-
elif isinstance(self, BasePeer):
88-
# XXX: Only added to help debug https://github.com/ethereum/py-evm/issues/1023;
89-
# should be removed eventually.
90-
self.logger.warn("%s finished but had no finished_callback", self)
89+
for callback in self._finished_callbacks:
90+
callback(self)
91+
9192
self.events.finished.set()
9293
self.logger.debug("%s halted cleanly", self)
9394

95+
def add_finished_callback(self, finished_callback: Callable[['BaseService'], None]) -> None:
96+
self._finished_callbacks.append(finished_callback)
97+
9498
def run_child_service(self, child_service: 'BaseService') -> 'asyncio.Future[Any]':
9599
"""
96100
Run a child service and keep a reference to it to be considered during the cleanup.

0 commit comments

Comments
 (0)