@@ -103,7 +103,9 @@ def _process_handshake_error(self, response):
103103 def _on_handshake_start (self ):
104104 if logger .isEnabledFor (logging .DEBUG ):
105105 logger .debug ("Connecting to node(address=%s, port=%d) with protocol context %s" ,
106- self .host , self .port , self .client .protocol_context )
106+ self .host , self .port , self .protocol_context )
107+ if self ._enabled_connection_listener :
108+ self ._connection_listener .publish_handshake_start (self .host , self .port , self .protocol_context )
107109
108110 def _on_handshake_success (self , result ):
109111 features = BitmaskFeature .from_array (result .get ('features' , None ))
@@ -113,24 +115,45 @@ def _on_handshake_success(self, result):
113115
114116 if logger .isEnabledFor (logging .DEBUG ):
115117 logger .debug ("Connected to node(address=%s, port=%d, node_uuid=%s) with protocol context %s" ,
116- self .host , self .port , self .uuid , self .client .protocol_context )
118+ self .host , self .port , self .uuid , self .protocol_context )
119+ if self ._enabled_connection_listener :
120+ self ._connection_listener .publish_handshake_success (self .host , self .port , self .protocol_context , self .uuid )
117121
118122 def _on_handshake_fail (self , err ):
123+ self .failed = True
124+
119125 if isinstance (err , AuthenticationError ):
120126 logger .error ("Authentication failed while connecting to node(address=%s, port=%d): %s" ,
121127 self .host , self .port , err )
128+ if self ._enabled_connection_listener :
129+ self ._connection_listener .publish_authentication_fail (self .host , self .port , self .protocol_context , err )
122130 else :
123131 logger .error ("Failed to perform handshake, connection to node(address=%s, port=%d) "
124132 "with protocol context %s failed: %s" ,
125- self .host , self .port , self .client .protocol_context , err , exc_info = True )
133+ self .host , self .port , self .protocol_context , err , exc_info = True )
134+ if self ._enabled_connection_listener :
135+ self ._connection_listener .publish_handshake_fail (self .host , self .port , self .protocol_context , err )
126136
127137 def _on_connection_lost (self , err = None , expected = False ):
128- if expected and logger .isEnabledFor (logging .DEBUG ):
129- logger .debug ("Connection closed to node(address=%s, port=%d, node_uuid=%s)" ,
130- self .host , self .port , self .uuid )
138+ if expected :
139+ if logger .isEnabledFor (logging .DEBUG ):
140+ logger .debug ("Connection closed to node(address=%s, port=%d, node_uuid=%s)" ,
141+ self .host , self .port , self .uuid )
142+ if self ._enabled_connection_listener :
143+ self ._connection_listener .publish_connection_closed (self .host , self .port , self .uuid )
131144 else :
132145 logger .info ("Connection lost to node(address=%s, port=%d, node_uuid=%s): %s" ,
133146 self .host , self .port , self .uuid , err )
147+ if self ._enabled_connection_listener :
148+ self ._connection_listener .publish_connection_lost (self .host , self .port , self .uuid , err )
149+
150+ @property
151+ def _enabled_connection_listener (self ):
152+ return self .client ._event_listeners and self .client ._event_listeners .enabled_connection_listener
153+
154+ @property
155+ def _connection_listener (self ):
156+ return self .client ._event_listeners
134157
135158
136159class Connection (BaseConnection ):
@@ -221,10 +244,10 @@ def connect(self):
221244 self ._on_handshake_fail (e )
222245 raise e
223246 except Exception as e :
247+ self ._on_handshake_fail (e )
224248 # restore undefined protocol version
225249 if detecting_protocol :
226250 self .client .protocol_context = None
227- self ._on_handshake_fail (e )
228251 raise e
229252
230253 self ._on_handshake_success (result )
@@ -266,7 +289,7 @@ def reconnect(self):
266289 if self .alive :
267290 return
268291
269- self .close ()
292+ self .close (on_reconnect = True )
270293
271294 # connect and silence the connection errors
272295 try :
@@ -358,7 +381,7 @@ def recv(self, flags=None, reconnect=True) -> bytearray:
358381
359382 return data
360383
361- def close (self ):
384+ def close (self , on_reconnect = False ):
362385 """
363386 Try to mark socket closed, then unlink it. This is recommended but
364387 not required, since sockets are automatically closed when
@@ -370,5 +393,6 @@ def close(self):
370393 self ._socket .close ()
371394 except connection_errors :
372395 pass
373- self ._on_connection_lost (expected = True )
396+ if not on_reconnect and not self .failed :
397+ self ._on_connection_lost (expected = True )
374398 self ._socket = None
0 commit comments