@@ -180,7 +180,11 @@ impl Operation for ConnectOp {
180180 } ;
181181 let mut skip_connections = skip_connections. clone ( ) ;
182182 let mut skip_forwards = skip_forwards. clone ( ) ;
183- skip_connections. extend ( [ this_peer. clone ( ) , query_target. peer . clone ( ) ] ) ;
183+ skip_connections. extend ( [
184+ this_peer. clone ( ) ,
185+ query_target. peer . clone ( ) ,
186+ joiner. peer . clone ( ) ,
187+ ] ) ;
184188 skip_forwards. extend ( [ this_peer. clone ( ) , query_target. peer . clone ( ) ] ) ;
185189 if this_peer == & query_target. peer {
186190 // this peer should be the original target queries
@@ -222,9 +226,21 @@ impl Operation for ConnectOp {
222226 tx = %id,
223227 query_target = %query_target. peer,
224228 joiner = %joiner. peer,
225- "Gateway has no desirable peer to offer to joiner " ,
229+ "Gateway found no suitable peers to forward CheckConnectivity request " ,
226230 ) ;
227- return_msg = None ;
231+ // Send a negative response back to the joiner to inform them
232+ // that no suitable peers are currently available
233+ let response = ConnectResponse :: AcceptedBy {
234+ accepted : false ,
235+ acceptor : own_loc. clone ( ) ,
236+ joiner : joiner. peer . clone ( ) ,
237+ } ;
238+ return_msg = Some ( ConnectMsg :: Response {
239+ id : * id,
240+ sender : own_loc. clone ( ) ,
241+ target : joiner. clone ( ) ,
242+ msg : response,
243+ } ) ;
228244 new_state = None ;
229245 }
230246 } else {
@@ -269,17 +285,27 @@ impl Operation for ConnectOp {
269285 } ,
270286 ..
271287 } => {
288+ let this_peer = op_manager. ring . connection_manager . own_location ( ) ;
272289 if sender. peer == joiner. peer {
273290 tracing:: error!(
274291 tx = %id,
275292 sender = %sender. peer,
276293 joiner = %joiner. peer,
277- at = %op_manager . ring . connection_manager . own_location ( ) . peer,
278- "Connectivity check from self, aborting "
294+ at = %this_peer . peer,
295+ "Connectivity check from self (sender == joiner), rejecting operation "
279296 ) ;
280- std:: process:: exit ( 1 ) ;
297+ return Err ( OpError :: UnexpectedOpState ) ;
298+ }
299+ if this_peer. peer == joiner. peer {
300+ tracing:: error!(
301+ tx = %id,
302+ this_peer = %this_peer. peer,
303+ joiner = %joiner. peer,
304+ sender = %sender. peer,
305+ "Received CheckConnectivity where this peer is the joiner (self-connection attempt), rejecting operation"
306+ ) ;
307+ return Err ( OpError :: UnexpectedOpState ) ;
281308 }
282- let this_peer = op_manager. ring . connection_manager . own_location ( ) ;
283309 let joiner_loc = joiner
284310 . location
285311 . expect ( "should be already set at the p2p bridge level" ) ;
@@ -978,16 +1004,19 @@ async fn connect_request(
9781004 None ,
9791005 ) ;
9801006
981- // Push the new operation and send the message
1007+ // Push the new operation
9821008 op_manager
9831009 . push ( new_tx_id, OpEnum :: Connect ( Box :: new ( new_op) ) )
9841010 . await ?;
9851011
1012+ // Send the FindOptimalPeer message to the gateway over the network
1013+ // We use notify_node_event with a SendMessage event to ensure it goes through
1014+ // the proper network channel, not just local processing
9861015 op_manager
987- . notify_op_change (
988- NetMessage :: from ( msg ) ,
989- OpEnum :: Connect ( Box :: new ( ConnectOp :: new ( new_tx_id , None , None , None ) ) ) ,
990- )
1016+ . notify_node_event ( NodeEvent :: SendMessage {
1017+ target : gateway . peer . clone ( ) ,
1018+ msg : Box :: new ( NetMessage :: from ( msg ) ) ,
1019+ } )
9911020 . await ?;
9921021 Ok ( ( ) )
9931022 }
@@ -1171,13 +1200,17 @@ fn select_forward_target(
11711200 left_htl : usize ,
11721201 skip_forwards : & HashSet < PeerId > ,
11731202) -> Option < PeerKeyLocation > {
1203+ // Create an extended skip list that includes the joiner to prevent forwarding to the joiner
1204+ let mut extended_skip = skip_forwards. clone ( ) ;
1205+ extended_skip. insert ( joiner. peer . clone ( ) ) ;
1206+
11741207 if left_htl >= connection_manager. rnd_if_htl_above {
11751208 tracing:: debug!(
11761209 tx = %id,
11771210 joiner = %joiner. peer,
11781211 "Randomly selecting peer to forward connect request" ,
11791212 ) ;
1180- connection_manager. random_peer ( |p| !skip_forwards . contains ( p) )
1213+ connection_manager. random_peer ( |p| !extended_skip . contains ( p) )
11811214 } else {
11821215 tracing:: debug!(
11831216 tx = %id,
@@ -1188,7 +1221,7 @@ fn select_forward_target(
11881221 . routing (
11891222 joiner. location . unwrap ( ) ,
11901223 Some ( & request_peer. peer ) ,
1191- skip_forwards ,
1224+ & extended_skip ,
11921225 router,
11931226 )
11941227 . and_then ( |pkl| ( pkl. peer != joiner. peer ) . then_some ( pkl) )
0 commit comments