diff --git a/src/bin_dal_node/cli.ml b/src/bin_dal_node/cli.ml index f014a9cf598245a947ab7e064dd478fe656b98a1..95326ef75cfc33a2caf463deccccc7fcb07cdd52 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 e98817cdece5aa17cb36fabde69f44537da947db..118a52ff97f1933c3afbd00128566f4ef674cca4 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 a5d61e40e9948a81addb40bd6b1c4c6502f7f4e1..099f677064d51b399dffba60d7e0f706c223f675 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 6f2d380918ed305b6d3729fc8a57585c11b0b166..12c77079e82a3aa3e6e27727aa6d6bc25c073688 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/daemon.ml b/src/bin_dal_node/daemon.ml index c0db53c5a4d5eee3de61d8b6ef13a2b6dedfe2b0..fea1a5dd3212c249d77b013207bb72b3d441b746 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 @@ -1170,7 +1171,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 @@ -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/bin_dal_node/main.ml b/src/bin_dal_node/main.ml index 1d04bfe1005c7e8c1cc23740c0b698dbe2a44d18..1108fb961590c6f31db3819a845e7c6b1147f9e3 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 = diff --git a/src/lib_dal_node/gossipsub/gossipsub.mli b/src/lib_dal_node/gossipsub/gossipsub.mli index aff50c6c985e9edad9c25c17d5760ab8cc79b6db..e57488c616500552103963b555efe2c02d982373 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 @@ -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_logging.ml b/src/lib_dal_node/gossipsub/gs_logging.ml index 6625749fde752451538f916c953034ba2e5f8097..279b39223bc68c41a4d04999ad4a4c7055f9ee05 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 () @@ -215,15 +215,19 @@ let event = 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))) diff --git a/src/lib_dal_node/gossipsub/gs_logging.mli b/src/lib_dal_node/gossipsub/gs_logging.mli index 1b8e61a76b0fe7661a292240c6063c351586636c..0bd320b30c0edd2d66a5cd78d5eef14cd3f0e8e8 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 diff --git a/src/lib_dal_node/gossipsub/gs_transport_connection.ml b/src/lib_dal_node/gossipsub/gs_transport_connection.ml index 0846dfcf0af04409797c569503d1e2b85473be72..8ba136b07cd84180e2de417af793ea549218f8b9 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 = _} = @@ -296,14 +296,16 @@ let app_messages_handler gs_worker ~app_messages_callback = 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 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 +317,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 e9f7c2bc8deaf1e45cb87fc7264b6c9f932e57cf..e6d0eaf1eecb9e0eda3e81659f6042e76e06b75e 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 diff --git a/tezt/lib_tezos/dal_node.ml b/tezt/lib_tezos/dal_node.ml index 07e036142acaf8c39131af764c380bdb3e5d42ef..a0e155c54cca8ce47c72eb59681130bf2af2a79d 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