From b6bbe6d6488f0f08d0c991ced98c702c5a2dedba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Wed, 5 Feb 2025 01:32:20 +0100 Subject: [PATCH 1/4] Octez/P2P: Prioritise incoming connections --- src/lib_p2p/p2p_connect_handler.ml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib_p2p/p2p_connect_handler.ml b/src/lib_p2p/p2p_connect_handler.ml index 390f2311ec51..6bdbd315fbb1 100644 --- a/src/lib_p2p/p2p_connect_handler.ml +++ b/src/lib_p2p/p2p_connect_handler.ml @@ -259,8 +259,25 @@ let is_acceptable t connection_point_info peer_info incoming version = match P2p_point_state.get connection_point_info with | Accepted _ | Running _ -> P2p_rejection.(rejecting Already_connected) - | Requested _ when incoming -> - P2p_rejection.(rejecting Already_connected) + | Requested {cancel} when incoming -> + (* Prioritise incoming connections. *) + Lwt.dont_wait + (fun () -> + Lwt.bind (Lwt_canceler.cancel cancel) (fun result -> + match result with + | Error err -> + let tztrace = List.map Error_monad.error_of_exn err in + Format.eprintf + "Unexpected error while cancelling: %a@." + Error_monad.pp_print_trace + tztrace ; + Lwt.return_unit + | Ok () -> Lwt.return_unit)) + (fun exn -> + Format.eprintf + "Unexpected exn while cancelling: %s@." + (Printexc.to_string exn)) ; + return version | Requested _ | Disconnected -> return version) in (* Point is acceptable, checking if peer is. *) -- GitLab From a825c1ccd43ba19385aa04f90d00cc12a0752894 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Mon, 17 Feb 2025 20:21:43 +0100 Subject: [PATCH 2/4] P2P: Lwt-ise is_acceptable function --- src/lib_p2p/p2p_connect_handler.ml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/lib_p2p/p2p_connect_handler.ml b/src/lib_p2p/p2p_connect_handler.ml index 6bdbd315fbb1..d01177070cc8 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 @@ -258,7 +258,7 @@ 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) + Lwt.return P2p_rejection.(rejecting Already_connected) | Requested {cancel} when incoming -> (* Prioritise incoming connections. *) Lwt.dont_wait @@ -286,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 @@ -445,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 @@ -461,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 -- GitLab From a453959f839428fd66c0f38324c50ab6223809d6 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Mon, 17 Feb 2025 20:24:49 +0100 Subject: [PATCH 3/4] P2P: don't use dont_wait in is_acceptable --- src/lib_p2p/p2p_connect_handler.ml | 43 +++++++++++++++++------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/lib_p2p/p2p_connect_handler.ml b/src/lib_p2p/p2p_connect_handler.ml index d01177070cc8..2cd890c73223 100644 --- a/src/lib_p2p/p2p_connect_handler.ml +++ b/src/lib_p2p/p2p_connect_handler.ml @@ -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 = @@ -261,22 +261,27 @@ let is_acceptable t connection_point_info peer_info incoming version = Lwt.return P2p_rejection.(rejecting Already_connected) | Requested {cancel} when incoming -> (* Prioritise incoming connections. *) - Lwt.dont_wait - (fun () -> - Lwt.bind (Lwt_canceler.cancel cancel) (fun result -> - match result with - | Error err -> - let tztrace = List.map Error_monad.error_of_exn err in - Format.eprintf - "Unexpected error while cancelling: %a@." - Error_monad.pp_print_trace - tztrace ; - Lwt.return_unit - | Ok () -> Lwt.return_unit)) - (fun exn -> - Format.eprintf - "Unexpected exn while cancelling: %s@." - (Printexc.to_string exn)) ; + let*! () = + Lwt.catch + (fun () -> + Lwt.bind (Lwt_canceler.cancel cancel) (fun result -> + match result with + | Error err -> + let tztrace = + List.map Error_monad.error_of_exn err + in + Format.eprintf + "Unexpected error while cancelling: %a@." + Error_monad.pp_print_trace + tztrace ; + Lwt.return_unit + | Ok () -> Lwt.return_unit)) + (fun exn -> + Format.eprintf + "Unexpected exn while cancelling: %s@." + (Printexc.to_string exn) ; + Lwt.return_unit) + in return version | Requested _ | Disconnected -> return version) in -- GitLab From 5b56fe7dd0afaa3ce0e1ffe1f03fd68f1bdfd23a Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Mon, 17 Feb 2025 20:36:30 +0100 Subject: [PATCH 4/4] P2P: add an event for unexpected cancellation error --- src/lib_p2p/p2p_connect_handler.ml | 27 +++++++++++---------------- src/lib_p2p/p2p_events.ml | 9 +++++++++ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/lib_p2p/p2p_connect_handler.ml b/src/lib_p2p/p2p_connect_handler.ml index 2cd890c73223..0fe95ec5315a 100644 --- a/src/lib_p2p/p2p_connect_handler.ml +++ b/src/lib_p2p/p2p_connect_handler.ml @@ -261,26 +261,21 @@ let is_acceptable t connection_point_info peer_info incoming version = Lwt.return P2p_rejection.(rejecting Already_connected) | Requested {cancel} when incoming -> (* Prioritise incoming connections. *) - let*! () = + let*! exns_opt = Lwt.catch (fun () -> Lwt.bind (Lwt_canceler.cancel cancel) (fun result -> match result with - | Error err -> - let tztrace = - List.map Error_monad.error_of_exn err - in - Format.eprintf - "Unexpected error while cancelling: %a@." - Error_monad.pp_print_trace - tztrace ; - Lwt.return_unit - | Ok () -> Lwt.return_unit)) - (fun exn -> - Format.eprintf - "Unexpected exn while cancelling: %s@." - (Printexc.to_string exn) ; - Lwt.return_unit) + | 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) diff --git a/src/lib_p2p/p2p_events.ml b/src/lib_p2p/p2p_events.ml index cca6bf5777c8..47842d3fa989 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 -- GitLab