1- from collections import deque
2- from contextlib import contextmanager
31import contextlib
42import datetime
53import hmac
2220from . import utils
2321from .abc import BMCLAPIFile , Certificate , CertificateType , OpenBMCLAPIConfiguration , ResponseFile , SocketEmitResult
2422from .logger import logger
25- from .config import API_VERSION , ROOT_PATH , cfg , USER_AGENT
23+ from .config import API_VERSION , ROOT_PATH , cfg , USER_AGENT , DEBUG
2624from .storage import CheckStorage , StorageManager
2725from .database import get_db
2826
@@ -159,6 +157,7 @@ def __init__(
159157 self .sio = socketio .AsyncClient (
160158 handle_sigint = False ,
161159 reconnection_attempts = 10 ,
160+ logger = DEBUG
162161 )
163162 self ._keepalive_lock = utils .CustomLock (locked = True )
164163 self ._storage_wait = utils .CustomLock (locked = True )
@@ -171,6 +170,7 @@ def __init__(
171170 self ._retry_times = 0
172171 self ._task_group = None
173172 self ._display_name = None
173+ self ._reconnect_task = None
174174 self ._manager = manager
175175
176176 @property
@@ -216,16 +216,30 @@ async def _():
216216 if not self ._enabled :
217217 return
218218 self ._enabled = False
219- logger .tinfo ("cluster.reconnect" , id = self .id , name = self .display_name )
220- await get_db ().insert_cluster_info (self .id , "socketio" , "reconnect" )
221- await self .enable ()
219+ self ._want_enable = False
222220
223221
224222 @self .sio .on ("disconnect" ) # type: ignore
225223 async def _ ():
226224 logger .tinfo ("cluster.disconnected" , id = self .id , name = self .display_name )
227225 await self .disable ()
228226
227+ @self .sio .eio .on ("reconnect" )
228+ async def _ (attempt : int ):
229+ logger .tinfo ("cluster.reconnect" , id = self .id , name = self .display_name , attempt = attempt )
230+ await get_db ().insert_cluster_info (self .id , "socketio" , "reconnect" )
231+ await self .enable ()
232+
233+ @self .sio .eio .on ("reconnect_error" )
234+ async def _ (err ):
235+ logger .terror ("cluster.reconnect_error" , id = self .id , name = self .display_name , err = err )
236+
237+ @self .sio .eio .on ("reconnect_failed" )
238+ async def _ ():
239+ logger .terror ("cluster.reconnect_failed" , id = self .id , name = self .display_name )
240+
241+ task_group .start_soon (self .reconnect )
242+
229243 task_group .start_soon (self .keepalive )
230244
231245 @utils .event .callback ("storage_disable" )
@@ -238,6 +252,14 @@ async def _(msg: Any):
238252
239253 await self .connect ()
240254
255+ async def reconnect (self ):
256+ if self ._reconnect_task is not None :
257+ return
258+ await anyio .sleep (60 )
259+ self ._reconnect_task = True
260+ await self .connect ()
261+ self ._reconnect_task = None
262+
241263 async def keepalive (self ):
242264 while not self ._stop :
243265 await self ._keepalive_lock .wait ()
0 commit comments