@@ -99,7 +99,9 @@ def _process_handshake_error(self, response):
9999 def _on_handshake_start (self ):
100100 if logger .isEnabledFor (logging .DEBUG ):
101101 logger .debug ("Connecting to node(address=%s, port=%d) with protocol context %s" ,
102- self .host , self .port , self .client .protocol_context )
102+ self .host , self .port , self .protocol_context )
103+ if self ._enabled_connection_listener :
104+ self ._connection_listener .publish_handshake_start (self .host , self .port , self .protocol_context )
103105
104106 def _on_handshake_success (self , result ):
105107 features = BitmaskFeature .from_array (result .get ('features' , None ))
@@ -109,24 +111,45 @@ def _on_handshake_success(self, result):
109111
110112 if logger .isEnabledFor (logging .DEBUG ):
111113 logger .debug ("Connected to node(address=%s, port=%d, node_uuid=%s) with protocol context %s" ,
112- self .host , self .port , self .uuid , self .client .protocol_context )
114+ self .host , self .port , self .uuid , self .protocol_context )
115+ if self ._enabled_connection_listener :
116+ self ._connection_listener .publish_handshake_success (self .host , self .port , self .protocol_context , self .uuid )
113117
114118 def _on_handshake_fail (self , err ):
119+ self .failed = True
120+
115121 if isinstance (err , AuthenticationError ):
116122 logger .error ("Authentication failed while connecting to node(address=%s, port=%d): %s" ,
117123 self .host , self .port , err )
124+ if self ._enabled_connection_listener :
125+ self ._connection_listener .publish_authentication_fail (self .host , self .port , self .protocol_context , err )
118126 else :
119127 logger .error ("Failed to perform handshake, connection to node(address=%s, port=%d) "
120128 "with protocol context %s failed: %s" ,
121- self .host , self .port , self .client .protocol_context , err , exc_info = True )
129+ self .host , self .port , self .protocol_context , err , exc_info = True )
130+ if self ._enabled_connection_listener :
131+ self ._connection_listener .publish_handshake_fail (self .host , self .port , self .protocol_context , err )
122132
123133 def _on_connection_lost (self , err = None , expected = False ):
124- if expected and logger .isEnabledFor (logging .DEBUG ):
125- logger .debug ("Connection closed to node(address=%s, port=%d, node_uuid=%s)" ,
126- self .host , self .port , self .uuid )
134+ if expected :
135+ if logger .isEnabledFor (logging .DEBUG ):
136+ logger .debug ("Connection closed to node(address=%s, port=%d, node_uuid=%s)" ,
137+ self .host , self .port , self .uuid )
138+ if self ._enabled_connection_listener :
139+ self ._connection_listener .publish_connection_closed (self .host , self .port , self .uuid )
127140 else :
128141 logger .info ("Connection lost to node(address=%s, port=%d, node_uuid=%s): %s" ,
129142 self .host , self .port , self .uuid , err )
143+ if self ._enabled_connection_listener :
144+ self ._connection_listener .publish_connection_lost (self .host , self .port , self .uuid , err )
145+
146+ @property
147+ def _enabled_connection_listener (self ):
148+ return self .client ._event_listeners and self .client ._event_listeners .enabled_connection_listener
149+
150+ @property
151+ def _connection_listener (self ):
152+ return self .client ._event_listeners
130153
131154
132155class Connection (BaseConnection ):
@@ -216,10 +239,10 @@ def connect(self):
216239 self ._on_handshake_fail (e )
217240 raise e
218241 except Exception as e :
242+ self ._on_handshake_fail (e )
219243 # restore undefined protocol version
220244 if detecting_protocol :
221245 self .client .protocol_context = None
222- self ._on_handshake_fail (e )
223246 raise e
224247
225248 self ._on_handshake_success (result )
@@ -260,7 +283,7 @@ def reconnect(self):
260283 if self .alive :
261284 return
262285
263- self .close ()
286+ self .close (on_reconnect = True )
264287
265288 # connect and silence the connection errors
266289 try :
@@ -352,7 +375,7 @@ def recv(self, flags=None, reconnect=True) -> bytearray:
352375
353376 return data
354377
355- def close (self ):
378+ def close (self , on_reconnect = False ):
356379 """
357380 Try to mark socket closed, then unlink it. This is recommended but
358381 not required, since sockets are automatically closed when
@@ -364,5 +387,6 @@ def close(self):
364387 self ._socket .close ()
365388 except connection_errors :
366389 pass
367- self ._on_connection_lost (expected = True )
390+ if not on_reconnect and not self .failed :
391+ self ._on_connection_lost (expected = True )
368392 self ._socket = None
0 commit comments