From 945d22ad9fe01ce07982c2966bfa676031852a88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20El=20Siba=C3=AFe?= Date: Wed, 5 Jul 2023 11:33:58 +0200 Subject: [PATCH 1/2] RPC process: handles version rpc - factorize computation of node_version before sending to the process --- docs/doc_gen/rpc_doc.ml | 4 +- manifest/main.ml | 1 + opam/octez-rpc-process.opam | 1 + src/bin_node/node_run_command.ml | 53 ++++++++++++---------- src/lib_rpc_process/directory.ml | 9 ++++ src/lib_rpc_process/directory.mli | 12 +++++ src/lib_rpc_process/dune | 2 + src/lib_rpc_process/main.ml | 2 +- src/lib_rpc_process/parameters.ml | 14 +++--- src/lib_rpc_process/parameters.mli | 1 + src/lib_rpc_process/rpc_process_worker.ml | 4 +- src/lib_rpc_process/rpc_process_worker.mli | 19 +++++--- src/lib_shell/node.ml | 17 ++++++- src/lib_shell/node.mli | 4 +- src/lib_shell/version_directory.ml | 8 +--- 15 files changed, 100 insertions(+), 51 deletions(-) create mode 100644 src/lib_rpc_process/directory.ml create mode 100644 src/lib_rpc_process/directory.mli diff --git a/docs/doc_gen/rpc_doc.ml b/docs/doc_gen/rpc_doc.ml index e354f25604d7..c859b191fa74 100644 --- a/docs/doc_gen/rpc_doc.ml +++ b/docs/doc_gen/rpc_doc.ml @@ -353,7 +353,6 @@ let pp_document ppf _name intro prefix rpc_dir version = let make_index_shell ?introduction_path node = let open Lwt_syntax in let* shell_dir = - let version = Tezos_version_value.Current_git_info.version in let commit_info = ({ commit_hash = Tezos_version_value.Current_git_info.commit_hash; @@ -361,7 +360,8 @@ let make_index_shell ?introduction_path node = } : Tezos_version.Node_version.commit_info) in - let shell_dir = Node.build_rpc_directory ~version ~commit_info node in + let node_version = Node.get_version node in + let shell_dir = Node.build_rpc_directory ~node_version ~commit_info node in let shell_dir = Tezos_rpc.Directory.register0 shell_dir diff --git a/manifest/main.ml b/manifest/main.ml index 614035a5777a..e56ac0c24d51 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -4393,6 +4393,7 @@ let octez_rpc_process = ~deps: [ octez_base |> open_ ~m:"TzPervasives" |> open_; + octez_shell |> open_; octez_base_unix |> open_; octez_node_config |> open_; octez_rpc_http |> open_; diff --git a/opam/octez-rpc-process.opam b/opam/octez-rpc-process.opam index 79395fd64d9c..71d8a1648b10 100644 --- a/opam/octez-rpc-process.opam +++ b/opam/octez-rpc-process.opam @@ -11,6 +11,7 @@ depends: [ "dune" { >= "3.0" & < "3.11" } "ocaml" { >= "4.14" } "octez-libs" + "octez-shell-libs" "octez-node-config" "lwt" { >= "5.7.0" } "lwt-exit" diff --git a/src/bin_node/node_run_command.ml b/src/bin_node/node_run_command.ml index 9714a96b6cb4..660c16b54c0e 100644 --- a/src/bin_node/node_run_command.ml +++ b/src/bin_node/node_run_command.ml @@ -377,27 +377,12 @@ module Metrics_server = Prometheus_app.Cohttp (Cohttp_lwt_unix.Server) (* Launches an RPC server depending on the given [mode] (which is usually TCP, TLS or unix sockets). *) -let launch_rpc_server ~mode (config : Config_file.t) node (addr, port) = +let launch_rpc_server ~mode (config : Config_file.t) dir (addr, port) = let open Lwt_result_syntax in let rpc_config = config.rpc in let media_types = rpc_config.media_type in let*! acl_policy = RPC_server.Acl.resolve_domain_names rpc_config.acl in let host = Ipaddr.V6.to_string addr in - let version = Tezos_version_value.Current_git_info.version in - let commit_info = - ({ - commit_hash = Tezos_version_value.Current_git_info.commit_hash; - commit_date = Tezos_version_value.Current_git_info.committer_date; - } - : Tezos_version.Node_version.commit_info) - in - let dir = Node.build_rpc_directory ~version ~commit_info node in - let dir = Node_directory.build_node_directory config dir in - let dir = - Tezos_rpc.Directory.register_describe_directory_service - dir - Tezos_rpc.Service.description_service - in let acl = let open RPC_server.Acl in find_policy acl_policy (Ipaddr.V6.to_string addr, Some port) @@ -467,7 +452,7 @@ type rpc_server_kind = | No_server (* Initializes an RPC server handled by the node main process. *) -let init_local_rpc_server (config : Config_file.t) node = +let init_local_rpc_server (config : Config_file.t) dir = let open Lwt_result_syntax in let* servers = List.concat_map_es @@ -489,7 +474,7 @@ let init_local_rpc_server (config : Config_file.t) node = `No_password, `Port port ) in - launch_rpc_server ~mode config node addr) + launch_rpc_server ~mode config dir addr) addrs) config.rpc.local_listen_addrs in @@ -502,7 +487,7 @@ let rpc_socket_path ~socket_dir ~id ~pid = (* Initializes an RPC server handled by the node process. It will be used by an external RPC process, identified by [id], to forward RPCs to the node through a Unix socket. *) -let init_local_rpc_server_for_external_process id (config : Config_file.t) node +let init_local_rpc_server_for_external_process id (config : Config_file.t) dir addr = let open Lwt_result_syntax in let socket_dir = Tezos_base_unix.Socket.get_temporary_socket_dir () in @@ -517,10 +502,10 @@ let init_local_rpc_server_for_external_process id (config : Config_file.t) node Lwt_exit.register_clean_up_callback ~loc:__LOC__ (fun _ -> Lwt_unix.unlink comm_socket_path) in - let* rpc_server = launch_rpc_server ~mode config node addr in + let* rpc_server = launch_rpc_server ~mode config dir addr in return (rpc_server, comm_socket_path) -let init_external_rpc_server config node internal_events = +let init_external_rpc_server config node_version dir internal_events = let open Lwt_result_syntax in (* Start one rpc_process for each rpc endpoint. *) let id = ref 0 in @@ -542,7 +527,7 @@ let init_external_rpc_server config node internal_events = init_local_rpc_server_for_external_process id config - node + dir p2p_point in let addr = P2p_point.Id.to_string p2p_point in @@ -556,6 +541,7 @@ let init_external_rpc_server config node internal_events = Octez_rpc_process.Rpc_process_worker.create ~comm_socket_path config + node_version internal_events in let* () = @@ -604,13 +590,30 @@ let init_zcash () = "Failed to initialize Zcash parameters: %s" (Printexc.to_string exn)) -let init_rpc (config : Config_file.t) node internal_events = +let init_rpc (config : Config_file.t) (node : Node.t) internal_events = let open Lwt_result_syntax in (* Start local RPC server (handled by the node main process) only when at least one local listen addr is given. *) + let commit_info = + ({ + commit_hash = Tezos_version_value.Current_git_info.commit_hash; + commit_date = Tezos_version_value.Current_git_info.committer_date; + } + : Tezos_version.Node_version.commit_info) + in + let node_version = Node.get_version node in + + let dir = Node.build_rpc_directory ~node_version ~commit_info node in + let dir = Node_directory.build_node_directory config dir in + let dir = + Tezos_rpc.Directory.register_describe_directory_service + dir + Tezos_rpc.Service.description_service + in + let* local_rpc_server = if config.rpc.local_listen_addrs = [] then return No_server - else init_local_rpc_server config node + else init_local_rpc_server config dir in (* Start RPC process only when at least one listen addr is given. *) let* rpc_server = @@ -619,7 +622,7 @@ let init_rpc (config : Config_file.t) node internal_events = (* Starts the node's local RPC server that aims to handle the RPCs forwarded by the rpc_process, if they cannot be processed by the rpc_process itself. *) - init_external_rpc_server config node internal_events + init_external_rpc_server config node_version dir internal_events in return (local_rpc_server :: [rpc_server]) diff --git a/src/lib_rpc_process/directory.ml b/src/lib_rpc_process/directory.ml new file mode 100644 index 000000000000..204d51d062e3 --- /dev/null +++ b/src/lib_rpc_process/directory.ml @@ -0,0 +1,9 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2023 Nomadic Labs. *) +(* *) +(*****************************************************************************) + +let build_rpc_directory node_version = + Tezos_shell.Version_directory.rpc_directory node_version diff --git a/src/lib_rpc_process/directory.mli b/src/lib_rpc_process/directory.mli new file mode 100644 index 000000000000..6d11b76ba429 --- /dev/null +++ b/src/lib_rpc_process/directory.mli @@ -0,0 +1,12 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2023 Nomadic Labs. *) +(* *) +(*****************************************************************************) + +(** [build_rpc_directory ~node_version] builds the Tezos RPC directory for the + rpc process. RPCs handled here are not forwarded to the node. +*) +val build_rpc_directory : + Tezos_version.Node_version.t -> unit Tezos_rpc.Directory.t diff --git a/src/lib_rpc_process/dune b/src/lib_rpc_process/dune index 76eebe9e388d..7cf83b04e725 100644 --- a/src/lib_rpc_process/dune +++ b/src/lib_rpc_process/dune @@ -7,6 +7,7 @@ (instrumentation (backend bisect_ppx)) (libraries octez-libs.base + octez-shell-libs.shell octez-libs.base.unix octez-node-config octez-libs.rpc-http @@ -18,6 +19,7 @@ (:standard) -open Tezos_base.TzPervasives -open Tezos_base + -open Tezos_shell -open Tezos_base_unix -open Octez_node_config -open Tezos_rpc_http diff --git a/src/lib_rpc_process/main.ml b/src/lib_rpc_process/main.ml index acc982adef5f..7623911c2f8c 100644 --- a/src/lib_rpc_process/main.ml +++ b/src/lib_rpc_process/main.ml @@ -96,7 +96,7 @@ let launch_rpc_server (config : Parameters.t) (addr, port) = allowed_headers = cors_headers; } in - let dir = Tezos_rpc.Directory.empty in + let dir = Directory.build_rpc_directory config.node_version in let server = RPC_server.init_server ~cors diff --git a/src/lib_rpc_process/parameters.ml b/src/lib_rpc_process/parameters.ml index 32ab4ac82f4d..fe24e9eaf28f 100644 --- a/src/lib_rpc_process/parameters.ml +++ b/src/lib_rpc_process/parameters.ml @@ -27,16 +27,18 @@ type t = { rpc : Config_file.rpc; rpc_comm_socket_path : string; internal_events : Tezos_base.Internal_event_config.t; + node_version : Tezos_version.Node_version.t; } let parameters_encoding = let open Data_encoding in conv - (fun {rpc; rpc_comm_socket_path; internal_events} -> - (rpc, rpc_comm_socket_path, internal_events)) - (fun (rpc, rpc_comm_socket_path, internal_events) -> - {rpc; rpc_comm_socket_path; internal_events}) - (obj3 + (fun {rpc; rpc_comm_socket_path; internal_events; node_version} -> + (rpc, rpc_comm_socket_path, internal_events, node_version)) + (fun (rpc, rpc_comm_socket_path, internal_events, node_version) -> + {rpc; rpc_comm_socket_path; internal_events; node_version}) + (obj4 (req "rpc" Config_file.rpc_encoding) (req "rpc_comm_socket_path" Data_encoding.string) - (req "internal_events" Tezos_base.Internal_event_config.encoding)) + (req "internal_events" Tezos_base.Internal_event_config.encoding) + (req "node_version" Tezos_version.Node_version.encoding)) diff --git a/src/lib_rpc_process/parameters.mli b/src/lib_rpc_process/parameters.mli index a4b44c802c12..4c57506544c3 100644 --- a/src/lib_rpc_process/parameters.mli +++ b/src/lib_rpc_process/parameters.mli @@ -28,6 +28,7 @@ type t = { rpc : Config_file.rpc; rpc_comm_socket_path : string; internal_events : Tezos_base.Internal_event_config.t; + node_version : Tezos_version.Node_version.t; } (** Encoding for parameters type {!t} *) diff --git a/src/lib_rpc_process/rpc_process_worker.ml b/src/lib_rpc_process/rpc_process_worker.ml index 37c4745f30f8..83088174100f 100644 --- a/src/lib_rpc_process/rpc_process_worker.ml +++ b/src/lib_rpc_process/rpc_process_worker.ml @@ -117,7 +117,8 @@ type t = { external_process_parameters : Parameters.t; } -let create ~comm_socket_path (config : Config_file.t) events_config = +let create ~comm_socket_path (config : Config_file.t) node_version events_config + = let stop, stopper = Lwt.wait () in { server = None; @@ -128,6 +129,7 @@ let create ~comm_socket_path (config : Config_file.t) events_config = internal_events = events_config; rpc = config.rpc; rpc_comm_socket_path = comm_socket_path; + node_version; }; } diff --git a/src/lib_rpc_process/rpc_process_worker.mli b/src/lib_rpc_process/rpc_process_worker.mli index 4f8159f8cf70..8b3249334f22 100644 --- a/src/lib_rpc_process/rpc_process_worker.mli +++ b/src/lib_rpc_process/rpc_process_worker.mli @@ -32,14 +32,19 @@ (** Type of the RPC process worker*) type t -(** [create ~comm_socket_path config internal_event_config] creates the - worker initial state. [comm_socket_path] is a socket path that - will be used to communicate with the node (note that the socket is - created automatically, but the cleaning of it is not - handled). [config] contains all the RPC server configuration (such - as ACLs, cors_headers, …). *) +(** [create ~comm_socket_path config node_version internal_event_config] creates + the worker initial state. [comm_socket_path] is a socket path that will be + used to communicate with the node (note that the socket is created + automatically, but the cleaning of it is not handled). [config] contains all + the RPC server configuration (such as ACLs, cors_headers, …). [node_version] + contains informations regarding version of the node to show when answering + related rpcs. *) val create : - comm_socket_path:string -> Config_file.t -> Internal_event_config.t -> t + comm_socket_path:string -> + Config_file.t -> + Tezos_version.Node_version.t -> + Internal_event_config.t -> + t (** Starts the external RPC process using fork+exec calls. It implements a watch dog that is responsible of restarting the diff --git a/src/lib_shell/node.ml b/src/lib_shell/node.ml index e624d3807940..c28747d6edca 100644 --- a/src/lib_shell/node.ml +++ b/src/lib_shell/node.ml @@ -74,6 +74,19 @@ type t = { shutdown : unit -> unit Lwt.t; } +let get_version node = + let commit_info = + ({ + commit_hash = Tezos_version_value.Current_git_info.commit_hash; + commit_date = Tezos_version_value.Current_git_info.committer_date; + } + : Tezos_version.Node_version.commit_info) + in + let version = Tezos_version_value.Current_git_info.version in + let network_version = P2p.announced_version node.p2p in + Tezos_version.Node_version. + {version; commit_info = Some commit_info; network_version} + let peer_metadata_cfg : _ P2p_params.peer_meta_config = { peer_meta_encoding = Peer_metadata.encoding; @@ -351,7 +364,7 @@ let create ?(sandboxed = false) ?sandbox_parameters ~singleprocess ~version let shutdown node = node.shutdown () -let build_rpc_directory ~version ~commit_info node = +let build_rpc_directory ~node_version ~commit_info node = let dir : unit Tezos_rpc.Directory.t ref = ref Tezos_rpc.Directory.empty in let merge d = dir := Tezos_rpc.Directory.merge !dir d in let register0 s f = @@ -378,7 +391,7 @@ let build_rpc_directory ~version ~commit_info node = ~dal_config:node.dal_config ~mainchain_validator:node.mainchain_validator node.store) ; - merge (Version_directory.rpc_directory ~version ~commit_info node.p2p) ; + merge (Version_directory.rpc_directory node_version) ; register0 Tezos_rpc.Service.error_service (fun () () -> Lwt.return_ok (Data_encoding.Json.schema Error_monad.error_encoding)) ; !dir diff --git a/src/lib_shell/node.mli b/src/lib_shell/node.mli index 9f154100514b..e274f2061bf3 100644 --- a/src/lib_shell/node.mli +++ b/src/lib_shell/node.mli @@ -26,6 +26,8 @@ type t +val get_version : t -> Tezos_version.Node_version.t + type config = { genesis : Genesis.t; chain_name : Distributed_db_version.Name.t; @@ -68,7 +70,7 @@ val create : val shutdown : t -> unit Lwt.t val build_rpc_directory : - version:Tezos_version_parser.t -> + node_version:Tezos_version.Node_version.t -> commit_info:Node_version.commit_info -> t -> unit Tezos_rpc.Directory.t diff --git a/src/lib_shell/version_directory.ml b/src/lib_shell/version_directory.ml index e7ffe38d93f9..12598b4bb02d 100644 --- a/src/lib_shell/version_directory.ml +++ b/src/lib_shell/version_directory.ml @@ -22,13 +22,9 @@ (* *) (*****************************************************************************) -let rpc_directory ~version ~(commit_info : Node_version.commit_info) net = +let rpc_directory (node_version : Node_version.t) = let dir = Tezos_rpc.Directory.empty in - let network_version = P2p.announced_version net in Tezos_rpc.Directory.gen_register dir Version_services.S.version - (fun () () () -> - Tezos_rpc.Answer.return - @@ ({version; network_version; commit_info = Some commit_info} - : Node_version.t)) + (fun () () () -> Tezos_rpc.Answer.return @@ (node_version : Node_version.t)) -- GitLab From 85523e34435810103b57b316387bfcbbf2a60dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20El=20Siba=C3=AFe?= Date: Thu, 13 Jul 2023 11:50:07 +0200 Subject: [PATCH 2/2] lib_shell: add doc to node build_rpc_directory --- src/lib_shell/node.mli | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib_shell/node.mli b/src/lib_shell/node.mli index e274f2061bf3..0bb0a889c6ba 100644 --- a/src/lib_shell/node.mli +++ b/src/lib_shell/node.mli @@ -69,6 +69,10 @@ val create : val shutdown : t -> unit Lwt.t +(** [build_rpc_directory ~node_version ~commit_info node] builds a Tezos RPC + directory for the node by gathering all the subdirectories. [node_version], + [commit_info] and [node] contain all informations required to build such a + directory. *) val build_rpc_directory : node_version:Tezos_version.Node_version.t -> commit_info:Node_version.commit_info -> -- GitLab