1
1
import asyncio
2
2
import logging
3
3
from dataclasses import dataclass
4
- from typing import Optional
4
+ from typing import Optional , Sequence
5
5
6
+ import aiohttp
6
7
from aleph_p2p_client import AlephP2PServiceClient
7
8
from configmanager import Config
8
9
@@ -55,9 +56,13 @@ async def reconnect_p2p_job(
55
56
await asyncio .sleep (config .p2p .reconnect_delay .value )
56
57
57
58
58
- async def check_peer (peer_uri : str , timeout : int = 1 ) -> PeerStatus :
59
+ async def check_peer (
60
+ session : aiohttp .ClientSession , peer_uri : str , timeout : int = 1
61
+ ) -> PeerStatus :
59
62
try :
60
- version_info = await api_get_request (peer_uri , "version" , timeout = timeout )
63
+ version_info = await api_get_request (
64
+ session , peer_uri , "version" , timeout = timeout
65
+ )
61
66
if version_info is not None :
62
67
return PeerStatus (peer_uri = peer_uri , is_online = True , version = version_info )
63
68
@@ -67,6 +72,23 @@ async def check_peer(peer_uri: str, timeout: int = 1) -> PeerStatus:
67
72
return PeerStatus (peer_uri = peer_uri , is_online = False , version = None )
68
73
69
74
75
+ async def request_version (peers : Sequence [str ], my_ip : str , timeout : int = 1 ):
76
+ jobs = []
77
+ connector = aiohttp .TCPConnector (limit_per_host = 5 )
78
+ timeout_conf = aiohttp .ClientTimeout (total = timeout )
79
+
80
+ async with aiohttp .ClientSession (
81
+ connector = connector , timeout = timeout_conf
82
+ ) as session :
83
+ for peer in peers :
84
+ if my_ip in peer :
85
+ continue
86
+
87
+ jobs .append (check_peer (session , peer ))
88
+
89
+ return await asyncio .gather (* jobs )
90
+
91
+
70
92
async def tidy_http_peers_job (
71
93
config : Config , session_factory : AsyncDbSessionFactory , node_cache : NodeCache
72
94
) -> None :
@@ -77,20 +99,14 @@ async def tidy_http_peers_job(
77
99
await asyncio .sleep (2 )
78
100
79
101
while True :
80
- jobs = []
81
102
82
103
try :
83
104
async with session_factory () as session :
84
105
peers = await get_all_addresses_by_peer_type (
85
106
session = session , peer_type = PeerType .HTTP
86
107
)
87
108
88
- for peer in peers :
89
- if my_ip in peer :
90
- continue
91
-
92
- jobs .append (check_peer (peer ))
93
- peer_statuses = await asyncio .gather (* jobs )
109
+ peer_statuses = await request_version (peers = peers , my_ip = my_ip )
94
110
95
111
for peer_status in peer_statuses :
96
112
peer_in_api_servers = await node_cache .has_api_server (
0 commit comments