diff --git a/src/lib_p2p/p2p_connect_handler.ml b/src/lib_p2p/p2p_connect_handler.ml index 390f2311ec518c26c234523907d2419dbed6e8cc..0fe95ec5315a37d232b23fb525e1ffb184ad5211 100644 --- a/src/lib_p2p/p2p_connect_handler.ml +++ b/src/lib_p2p/p2p_connect_handler.ml @@ -236,7 +236,7 @@ let create_connection t p2p_conn id_point point_info peer_info return conn let is_acceptable t connection_point_info peer_info incoming version = - let open Result_syntax in + let open Lwt_result_syntax in (* Private mode only accept trusted *) let unexpected = t.config.private_mode @@ -247,9 +247,9 @@ let is_acceptable t connection_point_info peer_info incoming version = connection_point_info)) && not (t.dependencies.peer_state_info_trusted peer_info) in - if unexpected then ( - Events.(emit__dont_wait__use_with_care peer_rejected) () ; - tzfail P2p_errors.Private_mode) + if unexpected then + let*! () = Events.(emit peer_rejected) () in + tzfail P2p_errors.Private_mode else (* checking if point is acceptable *) let* version = @@ -258,9 +258,26 @@ let is_acceptable t connection_point_info peer_info incoming version = | Some connection_point_info -> ( match P2p_point_state.get connection_point_info with | Accepted _ | Running _ -> - P2p_rejection.(rejecting Already_connected) - | Requested _ when incoming -> - P2p_rejection.(rejecting Already_connected) + Lwt.return P2p_rejection.(rejecting Already_connected) + | Requested {cancel} when incoming -> + (* Prioritise incoming connections. *) + let*! exns_opt = + Lwt.catch + (fun () -> + Lwt.bind (Lwt_canceler.cancel cancel) (fun result -> + match result with + | Error exns -> Lwt.return_some exns + | Ok () -> Lwt.return_none)) + (fun exn -> Lwt.return_some [exn]) + in + let*! () = + Option.iter_s + (fun exns -> + List.map Error_monad.error_of_exn exns + |> Events.(emit unexpected_cancellation_error)) + exns_opt + in + return version | Requested _ | Disconnected -> return version) in (* Point is acceptable, checking if peer is. *) @@ -269,7 +286,7 @@ let is_acceptable t connection_point_info peer_info incoming version = (* TODO: https://gitlab.com/tezos/tezos/-/issues/4679 in some circumstances cancel and accept... *) | Running _ -> - P2p_rejection.(rejecting Already_connected) + Lwt.return P2p_rejection.(rejecting Already_connected) (* All right, welcome ! *) | Disconnected -> return version @@ -428,9 +445,8 @@ let raw_authenticate t ?point_info canceler scheduled_conn point = let peer_info = P2p_pool.register_peer t.pool info.peer_id in (* [acceptable] is either Ok with a network version, or a Rejecting error with a motive *) - let acceptable = - let open Result_syntax in - let* version = + let*! acceptable = + let*? version = select ~chain_name:t.message_config.chain_name ~distributed_db_versions:t.message_config.distributed_db_versions @@ -444,7 +460,7 @@ let raw_authenticate t ?point_info canceler scheduled_conn point = t.config.max_connections + Random.int 2 > P2p_pool.active_connections t.pool then return_unit - else P2p_rejection.(rejecting Too_many_connections) + else Lwt.return P2p_rejection.(rejecting Too_many_connections) in (* we have a slot, checking if point and peer are acceptable *) is_acceptable t connection_point_info peer_info incoming version diff --git a/src/lib_p2p/p2p_events.ml b/src/lib_p2p/p2p_events.ml index cca6bf5777c8eca8713cb30d4c41e83c5eb0c3dc..47842d3fa989d89eb1c1fb8b362110d4e739b51b 100644 --- a/src/lib_p2p/p2p_events.ml +++ b/src/lib_p2p/p2p_events.ml @@ -244,6 +244,15 @@ module P2p_connect_handler = struct ~pp2:pp_print_top_error_of_trace ("errors", Error_monad.trace_encoding) + let unexpected_cancellation_error = + declare_1 + ~section + ~name:"unexpected_cancellation_error" + ~msg:"unexpected cancellation error: {errors}" + ~level:Error + ~pp1:pp_print_top_error_of_trace + ("errors", Error_monad.trace_encoding) + let connect_status = declare_2 ~section