From ac5a311af70f305389245f0e099d9edc630f2620 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 19 Feb 2025 13:34:37 +0100 Subject: [PATCH 1/6] DAL/Node: add an option --verbose to control details of some frequent events --- src/bin_dal_node/cli.ml | 13 +++++++++-- src/bin_dal_node/cli.mli | 2 ++ src/bin_dal_node/configuration_file.ml | 29 +++++++++++++++++++++---- src/bin_dal_node/configuration_file.mli | 3 +++ src/bin_dal_node/main.ml | 2 ++ 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/bin_dal_node/cli.ml b/src/bin_dal_node/cli.ml index f014a9cf5982..95326ef75cfc 100644 --- a/src/bin_dal_node/cli.ml +++ b/src/bin_dal_node/cli.ml @@ -307,13 +307,20 @@ module Term = struct & opt (some service_namespace_arg) None & info ~docs ~doc ~env:service_namespace_env ["service-namespace"]) + let verbose = + let open Cmdliner in + let doc = + "Controls the verbosity of some emitted events. Default value is false." + in + Arg.(value & flag & info ~docs ~doc ["verbose"]) + let term process = Cmdliner.Term.( ret (const process $ data_dir $ rpc_addr $ expected_pow $ net_addr $ public_addr $ endpoint $ metrics_addr $ attester_profile $ producer_profile $ observer_profile $ bootstrap_profile $ peers - $ history_mode $ service_name $ service_namespace)) + $ history_mode $ service_name $ service_namespace $ verbose)) end module Run = struct @@ -386,6 +393,7 @@ type options = { history_mode : Configuration_file.history_mode option; service_name : string option; service_namespace : string option; + verbose : bool; } type t = Run | Config_init @@ -393,7 +401,7 @@ type t = Run | Config_init let make ~run = let run subcommand data_dir rpc_addr expected_pow listen_addr public_addr endpoint metrics_addr attesters producers observers bootstrap_flag peers - history_mode service_name service_namespace = + history_mode service_name service_namespace verbose = let run profile = run subcommand @@ -410,6 +418,7 @@ let make ~run = history_mode; service_name; service_namespace; + verbose; } in let profile = Operator_profile.make ~attesters ~producers ?observers () in diff --git a/src/bin_dal_node/cli.mli b/src/bin_dal_node/cli.mli index e98817cdece5..118a52ff97f1 100644 --- a/src/bin_dal_node/cli.mli +++ b/src/bin_dal_node/cli.mli @@ -52,6 +52,8 @@ type options = { service_name : string option; (** Name of the service provided by this node. *) service_namespace : string option; (** Namespace for the service. *) + verbose : bool; + (** Emit events related to connections. Default value is false. *) } (** Subcommands that can be used by the DAL node. In the future this type diff --git a/src/bin_dal_node/configuration_file.ml b/src/bin_dal_node/configuration_file.ml index a5d61e40e994..099f677064d5 100644 --- a/src/bin_dal_node/configuration_file.ml +++ b/src/bin_dal_node/configuration_file.ml @@ -77,6 +77,7 @@ type t = { version : int; service_name : string option; service_namespace : string option; + verbose : bool; } let default_data_dir = Filename.concat (Sys.getenv "HOME") ".tezos-dal-node" @@ -127,6 +128,7 @@ let default = version = current_version; service_name = None; service_namespace = None; + verbose = false; } let neighbor_encoding : neighbor Data_encoding.t = @@ -169,6 +171,7 @@ let encoding : t Data_encoding.t = version; service_name; service_namespace; + verbose; } -> ( ( data_dir, rpc_addr, @@ -180,7 +183,12 @@ let encoding : t Data_encoding.t = network_name, endpoint, metrics_addr ), - (history_mode, profile, version, service_name, service_namespace) )) + ( history_mode, + profile, + version, + service_name, + service_namespace, + verbose ) )) (fun ( ( data_dir, rpc_addr, listen_addr, @@ -191,7 +199,12 @@ let encoding : t Data_encoding.t = network_name, endpoint, metrics_addr ), - (history_mode, profile, version, service_name, service_namespace) ) -> + ( history_mode, + profile, + version, + service_name, + service_namespace, + verbose ) ) -> { data_dir; rpc_addr; @@ -208,6 +221,7 @@ let encoding : t Data_encoding.t = version; service_name; service_namespace; + verbose; }) (merge_objs (obj10 @@ -261,7 +275,7 @@ let encoding : t Data_encoding.t = ~description:"The point for the DAL node metrics server" (Encoding.option P2p_point.Id.encoding) None)) - (obj5 + (obj6 (dft "history_mode" ~description:"The history mode for the DAL node" @@ -282,7 +296,13 @@ let encoding : t Data_encoding.t = "service_namespace" ~description:"Namespace for the service" (Data_encoding.option Data_encoding.string) - None))) + None) + (dft + "verbose" + ~description: + "Whether to emit details about frequent logging events" + bool + default.verbose))) module V0 = struct type t = { @@ -435,6 +455,7 @@ let from_v0 v0 = version = current_version; service_name = None; service_namespace = None; + verbose = false; } type error += DAL_node_unable_to_write_configuration_file of string diff --git a/src/bin_dal_node/configuration_file.mli b/src/bin_dal_node/configuration_file.mli index 6f2d380918ed..12c77079e82a 100644 --- a/src/bin_dal_node/configuration_file.mli +++ b/src/bin_dal_node/configuration_file.mli @@ -61,6 +61,9 @@ type t = { service_name : string option; (** Name of the service provided by this node. *) service_namespace : string option; (** Namespace for the service *) + verbose : bool; + (** Whether to emit detailed events for frequently received control + messages from remote peers. *) } (** [default] is the default configuration. *) diff --git a/src/bin_dal_node/main.ml b/src/bin_dal_node/main.ml index 1d04bfe1005c..1108fb961590 100644 --- a/src/bin_dal_node/main.ml +++ b/src/bin_dal_node/main.ml @@ -38,6 +38,7 @@ let merge history_mode; service_name; service_namespace; + verbose; } configuration = let profile = match profile with @@ -67,6 +68,7 @@ let merge service_name = Option.either service_name configuration.service_name; service_namespace = Option.either service_namespace configuration.service_namespace; + verbose = configuration.verbose || verbose; } let wrap_with_error main_promise = -- GitLab From 4af4a5e583d547a486406f21cfb30887b4396b35 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 18 Feb 2025 16:04:21 +0100 Subject: [PATCH 2/6] DAL/Node: Gs_logging.event takes an argument verbose (not used yet) This prepares for the ability to reduce the verbosity of some GS messages received via P2P --- src/bin_dal_node/daemon.ml | 2 +- src/lib_dal_node/gossipsub/gossipsub.mli | 2 +- src/lib_dal_node/gossipsub/gs_logging.ml | 2 +- src/lib_dal_node/gossipsub/gs_logging.mli | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/bin_dal_node/daemon.ml b/src/bin_dal_node/daemon.ml index c0db53c5a4d5..40c90d96e4a3 100644 --- a/src/bin_dal_node/daemon.ml +++ b/src/bin_dal_node/daemon.ml @@ -1170,7 +1170,7 @@ let run ~data_dir ~configuration_override = Gossipsub.Worker.( make ~bootstrap_points:get_bootstrap_points - ~events_logging:Logging.event + ~events_logging:(Logging.event ~verbose:config.verbose) ~self rng limits diff --git a/src/lib_dal_node/gossipsub/gossipsub.mli b/src/lib_dal_node/gossipsub/gossipsub.mli index aff50c6c985e..750ae905ee5d 100644 --- a/src/lib_dal_node/gossipsub/gossipsub.mli +++ b/src/lib_dal_node/gossipsub/gossipsub.mli @@ -56,7 +56,7 @@ module Worker : sig and type Point.t = Types.Point.t module Logging : sig - val event : event -> unit Monad.t + val event : verbose:bool -> event -> unit Monad.t end (** A hook to set or update messages and messages IDs validation diff --git a/src/lib_dal_node/gossipsub/gs_logging.ml b/src/lib_dal_node/gossipsub/gs_logging.ml index 6625749fde75..d22eb3bb0cc8 100644 --- a/src/lib_dal_node/gossipsub/gs_logging.ml +++ b/src/lib_dal_node/gossipsub/gs_logging.ml @@ -193,7 +193,7 @@ module Events = struct ("message_ids", list Types.Message_id.encoding) end -let event = +let event ~verbose:_ = let open Events in function | Check_unknown_messages -> emit check_unknown_messages () diff --git a/src/lib_dal_node/gossipsub/gs_logging.mli b/src/lib_dal_node/gossipsub/gs_logging.mli index 1b8e61a76b0f..0bd320b30c0e 100644 --- a/src/lib_dal_node/gossipsub/gs_logging.mli +++ b/src/lib_dal_node/gossipsub/gs_logging.mli @@ -24,5 +24,7 @@ (* *) (*****************************************************************************) -(** [event e] logs the event [e] of the Gossipsub worker *) -val event : Gs_interface.Worker_instance.event -> unit Lwt.t +(** [event ~verbose e] logs the event [e] of the Gossipsub worker. When + [verbose] is unset, only a few messages of GS control messages are + logged. *) +val event : verbose:bool -> Gs_interface.Worker_instance.event -> unit Lwt.t -- GitLab From 7e94aed91db125c534ca47b615e1a6675cde515a Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 18 Feb 2025 16:07:56 +0100 Subject: [PATCH 3/6] DAL/Node: no Graft/Prune events when verbose is unset --- src/lib_dal_node/gossipsub/gs_logging.ml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/lib_dal_node/gossipsub/gs_logging.ml b/src/lib_dal_node/gossipsub/gs_logging.ml index d22eb3bb0cc8..279b39223bc6 100644 --- a/src/lib_dal_node/gossipsub/gs_logging.ml +++ b/src/lib_dal_node/gossipsub/gs_logging.ml @@ -193,7 +193,7 @@ module Events = struct ("message_ids", list Types.Message_id.encoding) end -let event ~verbose:_ = +let event ~verbose = let open Events in function | Check_unknown_messages -> emit check_unknown_messages () @@ -215,15 +215,19 @@ let event ~verbose:_ = emit message_with_header (from_peer.peer_id, topic, message_id) | Subscribe {topic} -> emit subscribe (from_peer.peer_id, topic) | Unsubscribe {topic} -> emit unsubscribe (from_peer.peer_id, topic) - | Graft {topic} -> emit graft (from_peer.peer_id, topic) + | Graft {topic} -> + if not verbose then Lwt.return_unit + else emit graft (from_peer.peer_id, topic) | Prune {topic; px; backoff} -> - emit - prune - ( from_peer.peer_id, - topic, - backoff, - List.of_seq px - |> List.map (fun Types.Peer.{peer_id; _} -> peer_id) ) + if not verbose then Lwt.return_unit + else + emit + prune + ( from_peer.peer_id, + topic, + backoff, + List.of_seq px + |> List.map (fun Types.Peer.{peer_id; _} -> peer_id) ) | IHave {topic; message_ids} -> emit ihave (from_peer.peer_id, topic, message_ids) | IWant {message_ids} -> emit iwant (from_peer.peer_id, message_ids))) -- GitLab From c174e6cad619daba827296694b2df1cbe4149fb0 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 19 Feb 2025 13:42:28 +0100 Subject: [PATCH 4/6] DAL/Node: prepare ability to reduce # of app messages notification events --- src/bin_dal_node/daemon.ml | 14 +++++++++++--- src/lib_dal_node/gossipsub/gossipsub.mli | 1 + .../gossipsub/gs_transport_connection.ml | 6 +++--- .../gossipsub/gs_transport_connection.mli | 7 +++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/bin_dal_node/daemon.ml b/src/bin_dal_node/daemon.ml index 40c90d96e4a3..fea1a5dd3212 100644 --- a/src/bin_dal_node/daemon.ml +++ b/src/bin_dal_node/daemon.ml @@ -728,7 +728,7 @@ let daemonize handlers = |> lwt_map_error (List.fold_left (fun acc errs -> errs @ acc) []) let connect_gossipsub_with_p2p gs_worker transport_layer node_store node_ctxt - amplificator = + amplificator ~verbose = let open Gossipsub in let shards_handler ({shards; _} : Store.t) = let save_and_notify = Store.Shards.write_all shards in @@ -758,7 +758,8 @@ let connect_gossipsub_with_p2p gs_worker transport_layer node_store node_ctxt Transport_layer_hooks.activate gs_worker transport_layer - ~app_messages_callback:(shards_handler node_store)) + ~app_messages_callback:(shards_handler node_store) + ~verbose) (fun exn -> "[dal_node] error in Daemon.connect_gossipsub_with_p2p: " ^ Printexc.to_string exn @@ -1337,7 +1338,14 @@ let run ~data_dir ~configuration_override = return crawler in (* Activate the p2p instance. *) - connect_gossipsub_with_p2p gs_worker transport_layer store ctxt amplificator ; + connect_gossipsub_with_p2p + gs_worker + transport_layer + store + ctxt + amplificator + ~verbose:config.verbose ; + let*! () = Gossipsub.Transport_layer.activate ~additional_points:points transport_layer in diff --git a/src/lib_dal_node/gossipsub/gossipsub.mli b/src/lib_dal_node/gossipsub/gossipsub.mli index 750ae905ee5d..e57488c61650 100644 --- a/src/lib_dal_node/gossipsub/gossipsub.mli +++ b/src/lib_dal_node/gossipsub/gossipsub.mli @@ -196,6 +196,7 @@ module Transport_layer_hooks : sig Transport_layer.t -> app_messages_callback: (Types.Message.t -> Types.Message_id.t -> unit tzresult Lwt.t) -> + verbose:bool -> unit Lwt.t end diff --git a/src/lib_dal_node/gossipsub/gs_transport_connection.ml b/src/lib_dal_node/gossipsub/gs_transport_connection.ml index 0846dfcf0af0..edbbf9a0d3ec 100644 --- a/src/lib_dal_node/gossipsub/gs_transport_connection.ml +++ b/src/lib_dal_node/gossipsub/gs_transport_connection.ml @@ -287,7 +287,7 @@ let transport_layer_inputs_handler gs_worker p2p_layer = (** This loop pops messages from application output stream and calls the given [app_messages_callback] on them. *) -let app_messages_handler gs_worker ~app_messages_callback = +let app_messages_handler gs_worker ~app_messages_callback ~verbose:_ = let open Lwt_syntax in let rec loop app_output_stream = let* Worker.{message; message_id; topic = _} = @@ -303,7 +303,7 @@ let app_messages_handler gs_worker ~app_messages_callback = in Worker.app_output_stream gs_worker |> loop -let activate gs_worker p2p_layer ~app_messages_callback = +let activate gs_worker p2p_layer ~app_messages_callback ~verbose = (* Register a handler to notify new P2P connections to GS. *) let () = new_connections_handler gs_worker p2p_layer @@ -315,5 +315,5 @@ let activate gs_worker p2p_layer ~app_messages_callback = [ gs_worker_p2p_output_handler gs_worker p2p_layer; transport_layer_inputs_handler gs_worker p2p_layer; - app_messages_handler gs_worker ~app_messages_callback; + app_messages_handler gs_worker ~app_messages_callback ~verbose; ] diff --git a/src/lib_dal_node/gossipsub/gs_transport_connection.mli b/src/lib_dal_node/gossipsub/gs_transport_connection.mli index e9f7c2bc8dea..e6d0eaf1eecb 100644 --- a/src/lib_dal_node/gossipsub/gs_transport_connection.mli +++ b/src/lib_dal_node/gossipsub/gs_transport_connection.mli @@ -24,7 +24,7 @@ (* *) (*****************************************************************************) -(** [activate gs_worker transport_layer ~app_messages_handler] connects the +(** [activate gs_worker transport_layer ~app_messages_handler ~verbose] connects the given [gs_worker] and [transport_layer]. (Dis)connections and messages of the transport layer are forwarded to the GS worker. P2P output messages and (dis)connection requests are forwarded from the GS worker to the transport @@ -32,7 +32,9 @@ The [app_messages_handler] is invoked when some application messages are put by the Gossipsub worker in the application output stream. -*) + + The [verbose] flag controls the amount of events produced for some frequent + GS messages like the notification of messages to the application layer. *) val activate : Gs_interface.Worker_instance.t -> ( Gs_interface.Worker_instance.p2p_message, @@ -41,4 +43,5 @@ val activate : P2p.t -> app_messages_callback: (Types.Message.t -> Types.Message_id.t -> unit tzresult Lwt.t) -> + verbose:bool -> unit Lwt.t -- GitLab From 6ab9b5e5c15127c9713842bcb41fe08f5cb276c5 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Tue, 18 Feb 2025 17:50:05 +0100 Subject: [PATCH 5/6] DAL/Node: no app msg notifs when verbose in unset --- src/lib_dal_node/gossipsub/gs_transport_connection.ml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib_dal_node/gossipsub/gs_transport_connection.ml b/src/lib_dal_node/gossipsub/gs_transport_connection.ml index edbbf9a0d3ec..8ba136b07cd8 100644 --- a/src/lib_dal_node/gossipsub/gs_transport_connection.ml +++ b/src/lib_dal_node/gossipsub/gs_transport_connection.ml @@ -287,7 +287,7 @@ let transport_layer_inputs_handler gs_worker p2p_layer = (** This loop pops messages from application output stream and calls the given [app_messages_callback] on them. *) -let app_messages_handler gs_worker ~app_messages_callback ~verbose:_ = +let app_messages_handler gs_worker ~app_messages_callback ~verbose = let open Lwt_syntax in let rec loop app_output_stream = let* Worker.{message; message_id; topic = _} = @@ -296,7 +296,9 @@ let app_messages_handler gs_worker ~app_messages_callback ~verbose:_ = let* res = app_messages_callback message message_id in let* () = match res with - | Ok () -> Events.(emit message_notified_to_app message_id) + | Ok () -> + if not verbose then return_unit + else Events.(emit message_notified_to_app message_id) | Error err -> Events.(emit app_message_callback_failed (message_id, err)) in loop app_output_stream -- GitLab From 435f49f9e73e959500969ad0006c2c8dea3ed1f5 Mon Sep 17 00:00:00 2001 From: "iguerNL@Functori" Date: Wed, 19 Feb 2025 08:04:44 +0100 Subject: [PATCH 6/6] DAL/Tezt: for tezt test, enable --verbose as we track detailed events --- tezt/lib_tezos/dal_node.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tezt/lib_tezos/dal_node.ml b/tezt/lib_tezos/dal_node.ml index 07e036142aca..a0e155c54cca 100644 --- a/tezt/lib_tezos/dal_node.ml +++ b/tezt/lib_tezos/dal_node.ml @@ -347,7 +347,7 @@ let run ?env ?event_level node = ?env ?event_level node - ["run"; "--data-dir"; node.persistent_state.data_dir] + ["run"; "--verbose"; "--data-dir"; node.persistent_state.data_dir] let run ?(wait_ready = true) ?env ?event_level node = let* () = run ?env ?event_level node in -- GitLab