From 73550302364498ac68a49024901421653dd09090 Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Thu, 8 Aug 2024 16:27:51 +0200 Subject: [PATCH 1/8] Baker/Alpha: introduce dal-node-timeout-percentage argument and use it --- .../lib_delegate/baking_actions.ml | 19 +++++++++++++------ .../lib_delegate/baking_commands.ml | 17 ++++++++++++++++- .../lib_delegate/baking_configuration.ml | 18 ++++++++++++++---- .../lib_delegate/baking_configuration.mli | 2 ++ src/proto_alpha/lib_delegate/client_daemon.ml | 6 ++++-- .../lib_delegate/client_daemon.mli | 1 + 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/proto_alpha/lib_delegate/baking_actions.ml b/src/proto_alpha/lib_delegate/baking_actions.ml index 1835d3b8c5ae..390a70270d93 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.ml +++ b/src/proto_alpha/lib_delegate/baking_actions.ml @@ -419,21 +419,28 @@ let may_get_dal_content state consensus_vote = in let compute_dal_rpc_timeout state = (* We set the timeout to a certain percent of the remaining time till the - end of the round. *) - let default = 0.2 in + end of the round. In the corner case (for instance, not having an end of + round time), we pick some small default value. *) + let corner_case_default = 0.2 in match compute_next_round_time state with - | None -> (* corner case; we pick some small default value *) default + | None -> corner_case_default | Some (timestamp, _next_round) -> ( let ts = Time.System.of_protocol_opt timestamp in match ts with - | None -> default + | None -> corner_case_default | Some ts -> let now = Time.System.now () in let diff = Ptime.diff ts now |> Ptime.Span.to_float_s in if diff < 0. then (* We could output a warning, as this should not happen. *) - default - else diff *. 0.1) + corner_case_default + else + let factor = + float_of_int + state.global_state.config.dal_node_timeout_percentage + /. 100. + in + diff *. factor) in only_if_dal_feature_enabled state diff --git a/src/proto_alpha/lib_delegate/baking_commands.ml b/src/proto_alpha/lib_delegate/baking_commands.ml index c4ad01d017d5..93a46a1b7cfd 100644 --- a/src/proto_alpha/lib_delegate/baking_commands.ml +++ b/src/proto_alpha/lib_delegate/baking_commands.ml @@ -355,6 +355,18 @@ let endpoint_arg = ~doc:"endpoint of the DAL node, e.g. 'http://localhost:8933'" (Tezos_clic.parameter (fun _ s -> return @@ Uri.of_string s)) +let dal_node_timeout_percentage_arg = + Tezos_clic.arg + ~long:"dal-node-timeout-percentage" + ~placeholder:"percentage" + ~doc: + "percentage of the time until the end of round, which determines the \ + timeout to wait for the DAL node to provide shards' attestation status; \ + the default value is 10%; use with care: too small a value may mean not \ + being able to attest DAL slots, while too big a value may mean the \ + baker's consensus attestations may be injected late and not included" + @@ Client_proto_args.positive_int_parameter () + let block_count_arg = Tezos_clic.default_arg ~long:"count" @@ -664,7 +676,7 @@ let lookup_default_vote_file_path (cctxt : Protocol_client_context.full) = type baking_mode = Local of {local_data_dir_path : string} | Remote let baker_args = - Tezos_clic.args15 + Tezos_clic.args16 pidfile_arg node_version_check_bypass_arg node_version_allowed_arg @@ -678,6 +690,7 @@ let baker_args = per_block_vote_file_arg operations_arg endpoint_arg + dal_node_timeout_percentage_arg state_recorder_switch_arg pre_emptive_forge_time_arg @@ -695,6 +708,7 @@ let run_baker per_block_vote_file, extra_operations, dal_node_endpoint, + dal_node_timeout_percentage, state_recorder, pre_emptive_forge_time ) baking_mode sources cctxt = let open Lwt_result_syntax in @@ -733,6 +747,7 @@ let run_baker ~votes ?extra_operations ?dal_node_endpoint + ?dal_node_timeout_percentage ?pre_emptive_forge_time ~force_apply ~chain:cctxt#chain diff --git a/src/proto_alpha/lib_delegate/baking_configuration.ml b/src/proto_alpha/lib_delegate/baking_configuration.ml index 60f1570fb218..1b412886063a 100644 --- a/src/proto_alpha/lib_delegate/baking_configuration.ml +++ b/src/proto_alpha/lib_delegate/baking_configuration.ml @@ -94,6 +94,7 @@ type t = { state_recorder : state_recorder_config; extra_operations : Operations_source.t option; dal_node_endpoint : Uri.t option; + dal_node_timeout_percentage : int; pre_emptive_forge_time : Time.System.Span.t; } @@ -134,6 +135,8 @@ let default_extra_operations = None let default_pre_emptive_forge_time = Time.System.Span.of_seconds_exn 0. +let default_dal_node_timeout_percentage = 10 + let default_config = { fees = default_fees_config; @@ -147,6 +150,7 @@ let default_config = state_recorder = default_state_recorder_config; extra_operations = default_extra_operations; dal_node_endpoint = None; + dal_node_timeout_percentage = default_dal_node_timeout_percentage; pre_emptive_forge_time = default_pre_emptive_forge_time; } @@ -160,6 +164,7 @@ let make ?(minimal_fees = default_fees_config.minimal_fees) ?(votes = default_votes_config) ?(force_apply = default_force_apply) ?(force = default_force) ?(state_recorder = default_state_recorder_config) ?extra_operations ?dal_node_endpoint + ?(dal_node_timeout_percentage = default_dal_node_timeout_percentage) ?(pre_emptive_forge_time = default_pre_emptive_forge_time) () = let fees = {minimal_fees; minimal_nanotez_per_gas_unit; minimal_nanotez_per_byte} @@ -181,6 +186,7 @@ let make ?(minimal_fees = default_fees_config.minimal_fees) state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; } @@ -306,6 +312,7 @@ let encoding : t Data_encoding.t = state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; } -> ( ( fees, @@ -318,7 +325,7 @@ let encoding : t Data_encoding.t = force, state_recorder, pre_emptive_forge_time ), - (extra_operations, dal_node_endpoint) )) + (extra_operations, dal_node_endpoint, dal_node_timeout_percentage) )) (fun ( ( fees, validation, nonce, @@ -329,7 +336,8 @@ let encoding : t Data_encoding.t = force, state_recorder, pre_emptive_forge_time ), - (extra_operations, dal_node_endpoint) ) -> + (extra_operations, dal_node_endpoint, dal_node_timeout_percentage) + ) -> { fees; validation; @@ -342,6 +350,7 @@ let encoding : t Data_encoding.t = state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; }) (merge_objs @@ -358,9 +367,10 @@ let encoding : t Data_encoding.t = (req "force" force_config_encoding) (req "state_recorder" state_recorder_config_encoding) (req "pre_emptive_forge_time" Time.System.Span.encoding)) - (obj2 + (obj3 (opt "extra_operations" Operations_source.encoding) - (opt "dal_node_endpoint" Tezos_rpc.Encoding.uri_encoding))) + (opt "dal_node_endpoint" Tezos_rpc.Encoding.uri_encoding) + (req "dal_node_timeout_percentage" int16))) let pp fmt t = let json = Data_encoding.Json.construct encoding t in diff --git a/src/proto_alpha/lib_delegate/baking_configuration.mli b/src/proto_alpha/lib_delegate/baking_configuration.mli index d7345dacc9a2..1e51ebfb1aa7 100644 --- a/src/proto_alpha/lib_delegate/baking_configuration.mli +++ b/src/proto_alpha/lib_delegate/baking_configuration.mli @@ -69,6 +69,7 @@ type t = { state_recorder : state_recorder_config; extra_operations : Operations_source.t option; dal_node_endpoint : Uri.t option; + dal_node_timeout_percentage : int; pre_emptive_forge_time : Time.System.Span.t; } @@ -110,6 +111,7 @@ val make : ?state_recorder:state_recorder_config -> ?extra_operations:Operations_source.t -> ?dal_node_endpoint:Uri.t -> + ?dal_node_timeout_percentage:int -> ?pre_emptive_forge_time:Time.System.Span.t -> unit -> t diff --git a/src/proto_alpha/lib_delegate/client_daemon.ml b/src/proto_alpha/lib_delegate/client_daemon.ml index 55ad164a8213..a51235b8547b 100644 --- a/src/proto_alpha/lib_delegate/client_daemon.ml +++ b/src/proto_alpha/lib_delegate/client_daemon.ml @@ -59,8 +59,9 @@ let await_protocol_start (cctxt : #Protocol_client_context.full) ~chain = module Baker = struct let run (cctxt : Protocol_client_context.full) ?minimal_fees ?minimal_nanotez_per_gas_unit ?minimal_nanotez_per_byte ?votes - ?extra_operations ?dal_node_endpoint ?pre_emptive_forge_time ?force_apply - ?context_path ?state_recorder ~chain ~keep_alive delegates = + ?extra_operations ?dal_node_endpoint ?dal_node_timeout_percentage + ?pre_emptive_forge_time ?force_apply ?context_path ?state_recorder ~chain + ~keep_alive delegates = let open Lwt_result_syntax in let process () = let* user_activated_upgrades = @@ -109,6 +110,7 @@ module Baker = struct ?votes ?extra_operations ?dal_node_endpoint + ?dal_node_timeout_percentage ~pre_emptive_forge_time ?force_apply ?context_path diff --git a/src/proto_alpha/lib_delegate/client_daemon.mli b/src/proto_alpha/lib_delegate/client_daemon.mli index 26ffe9a04863..5fa115099b6a 100644 --- a/src/proto_alpha/lib_delegate/client_daemon.mli +++ b/src/proto_alpha/lib_delegate/client_daemon.mli @@ -35,6 +35,7 @@ module Baker : sig ?votes:Baking_configuration.per_block_votes_config -> ?extra_operations:Baking_configuration.Operations_source.t -> ?dal_node_endpoint:Uri.t -> + ?dal_node_timeout_percentage:int -> ?pre_emptive_forge_time:Q.t -> ?force_apply:bool -> ?context_path:string -> -- GitLab From ed06065346a5746fe6f5664f040a6f2fbfdd47c0 Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Thu, 8 Aug 2024 16:27:51 +0200 Subject: [PATCH 2/8] Baker/020_ParisC: introduce dal-node-timeout-percentage argument and use it --- .../lib_delegate/baking_actions.ml | 19 +++++++++++++------ .../lib_delegate/baking_commands.ml | 17 ++++++++++++++++- .../lib_delegate/baking_configuration.ml | 18 ++++++++++++++---- .../lib_delegate/baking_configuration.mli | 2 ++ .../lib_delegate/client_daemon.ml | 6 ++++-- .../lib_delegate/client_daemon.mli | 1 + 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/proto_020_PsParisC/lib_delegate/baking_actions.ml b/src/proto_020_PsParisC/lib_delegate/baking_actions.ml index 1835d3b8c5ae..390a70270d93 100644 --- a/src/proto_020_PsParisC/lib_delegate/baking_actions.ml +++ b/src/proto_020_PsParisC/lib_delegate/baking_actions.ml @@ -419,21 +419,28 @@ let may_get_dal_content state consensus_vote = in let compute_dal_rpc_timeout state = (* We set the timeout to a certain percent of the remaining time till the - end of the round. *) - let default = 0.2 in + end of the round. In the corner case (for instance, not having an end of + round time), we pick some small default value. *) + let corner_case_default = 0.2 in match compute_next_round_time state with - | None -> (* corner case; we pick some small default value *) default + | None -> corner_case_default | Some (timestamp, _next_round) -> ( let ts = Time.System.of_protocol_opt timestamp in match ts with - | None -> default + | None -> corner_case_default | Some ts -> let now = Time.System.now () in let diff = Ptime.diff ts now |> Ptime.Span.to_float_s in if diff < 0. then (* We could output a warning, as this should not happen. *) - default - else diff *. 0.1) + corner_case_default + else + let factor = + float_of_int + state.global_state.config.dal_node_timeout_percentage + /. 100. + in + diff *. factor) in only_if_dal_feature_enabled state diff --git a/src/proto_020_PsParisC/lib_delegate/baking_commands.ml b/src/proto_020_PsParisC/lib_delegate/baking_commands.ml index d0ec936ce267..43f06c6706be 100644 --- a/src/proto_020_PsParisC/lib_delegate/baking_commands.ml +++ b/src/proto_020_PsParisC/lib_delegate/baking_commands.ml @@ -355,6 +355,18 @@ let endpoint_arg = ~doc:"endpoint of the DAL node, e.g. 'http://localhost:8933'" (Tezos_clic.parameter (fun _ s -> return @@ Uri.of_string s)) +let dal_node_timeout_percentage_arg = + Tezos_clic.arg + ~long:"dal-node-timeout-percentage" + ~placeholder:"percentage" + ~doc: + "percentage of the time until the end of round, which determines the \ + timeout to wait for the DAL node to provide shards' attestation status; \ + the default value is 10%; use with care: too small a value may mean not \ + being able to attest DAL slots, while too big a value may mean the \ + baker's consensus attestations may be injected late and not included" + @@ Client_proto_args.positive_int_parameter () + let block_count_arg = Tezos_clic.default_arg ~long:"count" @@ -683,7 +695,7 @@ let lookup_default_vote_file_path (cctxt : Protocol_client_context.full) = type baking_mode = Local of {local_data_dir_path : string} | Remote let baker_args = - Tezos_clic.args15 + Tezos_clic.args16 pidfile_arg node_version_check_bypass_arg node_version_allowed_arg @@ -697,6 +709,7 @@ let baker_args = per_block_vote_file_arg operations_arg endpoint_arg + dal_node_timeout_percentage_arg state_recorder_switch_arg pre_emptive_forge_time_arg @@ -714,6 +727,7 @@ let run_baker per_block_vote_file, extra_operations, dal_node_endpoint, + dal_node_timeout_percentage, state_recorder, pre_emptive_forge_time ) baking_mode sources cctxt = let open Lwt_result_syntax in @@ -752,6 +766,7 @@ let run_baker ~votes ?extra_operations ?dal_node_endpoint + ?dal_node_timeout_percentage ?pre_emptive_forge_time ~force_apply ~chain:cctxt#chain diff --git a/src/proto_020_PsParisC/lib_delegate/baking_configuration.ml b/src/proto_020_PsParisC/lib_delegate/baking_configuration.ml index 60f1570fb218..1b412886063a 100644 --- a/src/proto_020_PsParisC/lib_delegate/baking_configuration.ml +++ b/src/proto_020_PsParisC/lib_delegate/baking_configuration.ml @@ -94,6 +94,7 @@ type t = { state_recorder : state_recorder_config; extra_operations : Operations_source.t option; dal_node_endpoint : Uri.t option; + dal_node_timeout_percentage : int; pre_emptive_forge_time : Time.System.Span.t; } @@ -134,6 +135,8 @@ let default_extra_operations = None let default_pre_emptive_forge_time = Time.System.Span.of_seconds_exn 0. +let default_dal_node_timeout_percentage = 10 + let default_config = { fees = default_fees_config; @@ -147,6 +150,7 @@ let default_config = state_recorder = default_state_recorder_config; extra_operations = default_extra_operations; dal_node_endpoint = None; + dal_node_timeout_percentage = default_dal_node_timeout_percentage; pre_emptive_forge_time = default_pre_emptive_forge_time; } @@ -160,6 +164,7 @@ let make ?(minimal_fees = default_fees_config.minimal_fees) ?(votes = default_votes_config) ?(force_apply = default_force_apply) ?(force = default_force) ?(state_recorder = default_state_recorder_config) ?extra_operations ?dal_node_endpoint + ?(dal_node_timeout_percentage = default_dal_node_timeout_percentage) ?(pre_emptive_forge_time = default_pre_emptive_forge_time) () = let fees = {minimal_fees; minimal_nanotez_per_gas_unit; minimal_nanotez_per_byte} @@ -181,6 +186,7 @@ let make ?(minimal_fees = default_fees_config.minimal_fees) state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; } @@ -306,6 +312,7 @@ let encoding : t Data_encoding.t = state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; } -> ( ( fees, @@ -318,7 +325,7 @@ let encoding : t Data_encoding.t = force, state_recorder, pre_emptive_forge_time ), - (extra_operations, dal_node_endpoint) )) + (extra_operations, dal_node_endpoint, dal_node_timeout_percentage) )) (fun ( ( fees, validation, nonce, @@ -329,7 +336,8 @@ let encoding : t Data_encoding.t = force, state_recorder, pre_emptive_forge_time ), - (extra_operations, dal_node_endpoint) ) -> + (extra_operations, dal_node_endpoint, dal_node_timeout_percentage) + ) -> { fees; validation; @@ -342,6 +350,7 @@ let encoding : t Data_encoding.t = state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; }) (merge_objs @@ -358,9 +367,10 @@ let encoding : t Data_encoding.t = (req "force" force_config_encoding) (req "state_recorder" state_recorder_config_encoding) (req "pre_emptive_forge_time" Time.System.Span.encoding)) - (obj2 + (obj3 (opt "extra_operations" Operations_source.encoding) - (opt "dal_node_endpoint" Tezos_rpc.Encoding.uri_encoding))) + (opt "dal_node_endpoint" Tezos_rpc.Encoding.uri_encoding) + (req "dal_node_timeout_percentage" int16))) let pp fmt t = let json = Data_encoding.Json.construct encoding t in diff --git a/src/proto_020_PsParisC/lib_delegate/baking_configuration.mli b/src/proto_020_PsParisC/lib_delegate/baking_configuration.mli index d7345dacc9a2..1e51ebfb1aa7 100644 --- a/src/proto_020_PsParisC/lib_delegate/baking_configuration.mli +++ b/src/proto_020_PsParisC/lib_delegate/baking_configuration.mli @@ -69,6 +69,7 @@ type t = { state_recorder : state_recorder_config; extra_operations : Operations_source.t option; dal_node_endpoint : Uri.t option; + dal_node_timeout_percentage : int; pre_emptive_forge_time : Time.System.Span.t; } @@ -110,6 +111,7 @@ val make : ?state_recorder:state_recorder_config -> ?extra_operations:Operations_source.t -> ?dal_node_endpoint:Uri.t -> + ?dal_node_timeout_percentage:int -> ?pre_emptive_forge_time:Time.System.Span.t -> unit -> t diff --git a/src/proto_020_PsParisC/lib_delegate/client_daemon.ml b/src/proto_020_PsParisC/lib_delegate/client_daemon.ml index 55ad164a8213..a51235b8547b 100644 --- a/src/proto_020_PsParisC/lib_delegate/client_daemon.ml +++ b/src/proto_020_PsParisC/lib_delegate/client_daemon.ml @@ -59,8 +59,9 @@ let await_protocol_start (cctxt : #Protocol_client_context.full) ~chain = module Baker = struct let run (cctxt : Protocol_client_context.full) ?minimal_fees ?minimal_nanotez_per_gas_unit ?minimal_nanotez_per_byte ?votes - ?extra_operations ?dal_node_endpoint ?pre_emptive_forge_time ?force_apply - ?context_path ?state_recorder ~chain ~keep_alive delegates = + ?extra_operations ?dal_node_endpoint ?dal_node_timeout_percentage + ?pre_emptive_forge_time ?force_apply ?context_path ?state_recorder ~chain + ~keep_alive delegates = let open Lwt_result_syntax in let process () = let* user_activated_upgrades = @@ -109,6 +110,7 @@ module Baker = struct ?votes ?extra_operations ?dal_node_endpoint + ?dal_node_timeout_percentage ~pre_emptive_forge_time ?force_apply ?context_path diff --git a/src/proto_020_PsParisC/lib_delegate/client_daemon.mli b/src/proto_020_PsParisC/lib_delegate/client_daemon.mli index 26ffe9a04863..5fa115099b6a 100644 --- a/src/proto_020_PsParisC/lib_delegate/client_daemon.mli +++ b/src/proto_020_PsParisC/lib_delegate/client_daemon.mli @@ -35,6 +35,7 @@ module Baker : sig ?votes:Baking_configuration.per_block_votes_config -> ?extra_operations:Baking_configuration.Operations_source.t -> ?dal_node_endpoint:Uri.t -> + ?dal_node_timeout_percentage:int -> ?pre_emptive_forge_time:Q.t -> ?force_apply:bool -> ?context_path:string -> -- GitLab From eecdfdcb937cb1dd8a0a56e30b62f039bc8d5d91 Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Thu, 8 Aug 2024 16:27:51 +0200 Subject: [PATCH 3/8] Baker/021_Quebec: introduce dal-node-timeout-percentage argument and use it --- src/proto_beta/lib_delegate/baking_actions.ml | 19 +++++++++++++------ .../lib_delegate/baking_commands.ml | 17 ++++++++++++++++- .../lib_delegate/baking_configuration.ml | 18 ++++++++++++++---- .../lib_delegate/baking_configuration.mli | 2 ++ src/proto_beta/lib_delegate/client_daemon.ml | 6 ++++-- src/proto_beta/lib_delegate/client_daemon.mli | 1 + 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/proto_beta/lib_delegate/baking_actions.ml b/src/proto_beta/lib_delegate/baking_actions.ml index 1835d3b8c5ae..390a70270d93 100644 --- a/src/proto_beta/lib_delegate/baking_actions.ml +++ b/src/proto_beta/lib_delegate/baking_actions.ml @@ -419,21 +419,28 @@ let may_get_dal_content state consensus_vote = in let compute_dal_rpc_timeout state = (* We set the timeout to a certain percent of the remaining time till the - end of the round. *) - let default = 0.2 in + end of the round. In the corner case (for instance, not having an end of + round time), we pick some small default value. *) + let corner_case_default = 0.2 in match compute_next_round_time state with - | None -> (* corner case; we pick some small default value *) default + | None -> corner_case_default | Some (timestamp, _next_round) -> ( let ts = Time.System.of_protocol_opt timestamp in match ts with - | None -> default + | None -> corner_case_default | Some ts -> let now = Time.System.now () in let diff = Ptime.diff ts now |> Ptime.Span.to_float_s in if diff < 0. then (* We could output a warning, as this should not happen. *) - default - else diff *. 0.1) + corner_case_default + else + let factor = + float_of_int + state.global_state.config.dal_node_timeout_percentage + /. 100. + in + diff *. factor) in only_if_dal_feature_enabled state diff --git a/src/proto_beta/lib_delegate/baking_commands.ml b/src/proto_beta/lib_delegate/baking_commands.ml index c4ad01d017d5..93a46a1b7cfd 100644 --- a/src/proto_beta/lib_delegate/baking_commands.ml +++ b/src/proto_beta/lib_delegate/baking_commands.ml @@ -355,6 +355,18 @@ let endpoint_arg = ~doc:"endpoint of the DAL node, e.g. 'http://localhost:8933'" (Tezos_clic.parameter (fun _ s -> return @@ Uri.of_string s)) +let dal_node_timeout_percentage_arg = + Tezos_clic.arg + ~long:"dal-node-timeout-percentage" + ~placeholder:"percentage" + ~doc: + "percentage of the time until the end of round, which determines the \ + timeout to wait for the DAL node to provide shards' attestation status; \ + the default value is 10%; use with care: too small a value may mean not \ + being able to attest DAL slots, while too big a value may mean the \ + baker's consensus attestations may be injected late and not included" + @@ Client_proto_args.positive_int_parameter () + let block_count_arg = Tezos_clic.default_arg ~long:"count" @@ -664,7 +676,7 @@ let lookup_default_vote_file_path (cctxt : Protocol_client_context.full) = type baking_mode = Local of {local_data_dir_path : string} | Remote let baker_args = - Tezos_clic.args15 + Tezos_clic.args16 pidfile_arg node_version_check_bypass_arg node_version_allowed_arg @@ -678,6 +690,7 @@ let baker_args = per_block_vote_file_arg operations_arg endpoint_arg + dal_node_timeout_percentage_arg state_recorder_switch_arg pre_emptive_forge_time_arg @@ -695,6 +708,7 @@ let run_baker per_block_vote_file, extra_operations, dal_node_endpoint, + dal_node_timeout_percentage, state_recorder, pre_emptive_forge_time ) baking_mode sources cctxt = let open Lwt_result_syntax in @@ -733,6 +747,7 @@ let run_baker ~votes ?extra_operations ?dal_node_endpoint + ?dal_node_timeout_percentage ?pre_emptive_forge_time ~force_apply ~chain:cctxt#chain diff --git a/src/proto_beta/lib_delegate/baking_configuration.ml b/src/proto_beta/lib_delegate/baking_configuration.ml index 60f1570fb218..1b412886063a 100644 --- a/src/proto_beta/lib_delegate/baking_configuration.ml +++ b/src/proto_beta/lib_delegate/baking_configuration.ml @@ -94,6 +94,7 @@ type t = { state_recorder : state_recorder_config; extra_operations : Operations_source.t option; dal_node_endpoint : Uri.t option; + dal_node_timeout_percentage : int; pre_emptive_forge_time : Time.System.Span.t; } @@ -134,6 +135,8 @@ let default_extra_operations = None let default_pre_emptive_forge_time = Time.System.Span.of_seconds_exn 0. +let default_dal_node_timeout_percentage = 10 + let default_config = { fees = default_fees_config; @@ -147,6 +150,7 @@ let default_config = state_recorder = default_state_recorder_config; extra_operations = default_extra_operations; dal_node_endpoint = None; + dal_node_timeout_percentage = default_dal_node_timeout_percentage; pre_emptive_forge_time = default_pre_emptive_forge_time; } @@ -160,6 +164,7 @@ let make ?(minimal_fees = default_fees_config.minimal_fees) ?(votes = default_votes_config) ?(force_apply = default_force_apply) ?(force = default_force) ?(state_recorder = default_state_recorder_config) ?extra_operations ?dal_node_endpoint + ?(dal_node_timeout_percentage = default_dal_node_timeout_percentage) ?(pre_emptive_forge_time = default_pre_emptive_forge_time) () = let fees = {minimal_fees; minimal_nanotez_per_gas_unit; minimal_nanotez_per_byte} @@ -181,6 +186,7 @@ let make ?(minimal_fees = default_fees_config.minimal_fees) state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; } @@ -306,6 +312,7 @@ let encoding : t Data_encoding.t = state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; } -> ( ( fees, @@ -318,7 +325,7 @@ let encoding : t Data_encoding.t = force, state_recorder, pre_emptive_forge_time ), - (extra_operations, dal_node_endpoint) )) + (extra_operations, dal_node_endpoint, dal_node_timeout_percentage) )) (fun ( ( fees, validation, nonce, @@ -329,7 +336,8 @@ let encoding : t Data_encoding.t = force, state_recorder, pre_emptive_forge_time ), - (extra_operations, dal_node_endpoint) ) -> + (extra_operations, dal_node_endpoint, dal_node_timeout_percentage) + ) -> { fees; validation; @@ -342,6 +350,7 @@ let encoding : t Data_encoding.t = state_recorder; extra_operations; dal_node_endpoint; + dal_node_timeout_percentage; pre_emptive_forge_time; }) (merge_objs @@ -358,9 +367,10 @@ let encoding : t Data_encoding.t = (req "force" force_config_encoding) (req "state_recorder" state_recorder_config_encoding) (req "pre_emptive_forge_time" Time.System.Span.encoding)) - (obj2 + (obj3 (opt "extra_operations" Operations_source.encoding) - (opt "dal_node_endpoint" Tezos_rpc.Encoding.uri_encoding))) + (opt "dal_node_endpoint" Tezos_rpc.Encoding.uri_encoding) + (req "dal_node_timeout_percentage" int16))) let pp fmt t = let json = Data_encoding.Json.construct encoding t in diff --git a/src/proto_beta/lib_delegate/baking_configuration.mli b/src/proto_beta/lib_delegate/baking_configuration.mli index d7345dacc9a2..1e51ebfb1aa7 100644 --- a/src/proto_beta/lib_delegate/baking_configuration.mli +++ b/src/proto_beta/lib_delegate/baking_configuration.mli @@ -69,6 +69,7 @@ type t = { state_recorder : state_recorder_config; extra_operations : Operations_source.t option; dal_node_endpoint : Uri.t option; + dal_node_timeout_percentage : int; pre_emptive_forge_time : Time.System.Span.t; } @@ -110,6 +111,7 @@ val make : ?state_recorder:state_recorder_config -> ?extra_operations:Operations_source.t -> ?dal_node_endpoint:Uri.t -> + ?dal_node_timeout_percentage:int -> ?pre_emptive_forge_time:Time.System.Span.t -> unit -> t diff --git a/src/proto_beta/lib_delegate/client_daemon.ml b/src/proto_beta/lib_delegate/client_daemon.ml index 55ad164a8213..a51235b8547b 100644 --- a/src/proto_beta/lib_delegate/client_daemon.ml +++ b/src/proto_beta/lib_delegate/client_daemon.ml @@ -59,8 +59,9 @@ let await_protocol_start (cctxt : #Protocol_client_context.full) ~chain = module Baker = struct let run (cctxt : Protocol_client_context.full) ?minimal_fees ?minimal_nanotez_per_gas_unit ?minimal_nanotez_per_byte ?votes - ?extra_operations ?dal_node_endpoint ?pre_emptive_forge_time ?force_apply - ?context_path ?state_recorder ~chain ~keep_alive delegates = + ?extra_operations ?dal_node_endpoint ?dal_node_timeout_percentage + ?pre_emptive_forge_time ?force_apply ?context_path ?state_recorder ~chain + ~keep_alive delegates = let open Lwt_result_syntax in let process () = let* user_activated_upgrades = @@ -109,6 +110,7 @@ module Baker = struct ?votes ?extra_operations ?dal_node_endpoint + ?dal_node_timeout_percentage ~pre_emptive_forge_time ?force_apply ?context_path diff --git a/src/proto_beta/lib_delegate/client_daemon.mli b/src/proto_beta/lib_delegate/client_daemon.mli index 26ffe9a04863..5fa115099b6a 100644 --- a/src/proto_beta/lib_delegate/client_daemon.mli +++ b/src/proto_beta/lib_delegate/client_daemon.mli @@ -35,6 +35,7 @@ module Baker : sig ?votes:Baking_configuration.per_block_votes_config -> ?extra_operations:Baking_configuration.Operations_source.t -> ?dal_node_endpoint:Uri.t -> + ?dal_node_timeout_percentage:int -> ?pre_emptive_forge_time:Q.t -> ?force_apply:bool -> ?context_path:string -> -- GitLab From c283889baecc2ec8bce72900f5c6ccaf3ae28b8a Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Mon, 12 Aug 2024 11:44:43 +0200 Subject: [PATCH 4/8] Baker: mention issue #7459 --- src/proto_alpha/lib_delegate/baking_actions.ml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/proto_alpha/lib_delegate/baking_actions.ml b/src/proto_alpha/lib_delegate/baking_actions.ml index 390a70270d93..69c37a79f241 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.ml +++ b/src/proto_alpha/lib_delegate/baking_actions.ml @@ -450,6 +450,8 @@ let may_get_dal_content state consensus_vote = let lag = state.global_state.constants.parametric.dal.attestation_lag in if Int32.sub attested_level (Int32.of_int lag) < 1l then return_none else + (* TODO: https://gitlab.com/tezos/tezos/-/issues/7459 + Rather then getting this now, do it at the start of the level. *) let timeout = compute_dal_rpc_timeout state in let*! result = Lwt.pick -- GitLab From 2f58159229d56c3e503f6420244f5cd3920a04e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Wed, 28 Aug 2024 16:17:50 +0200 Subject: [PATCH 5/8] Baker/DAL: Add an event if unexpected timeout is computed --- src/proto_alpha/lib_delegate/baking_actions.ml | 12 ++++++------ src/proto_alpha/lib_delegate/baking_events.ml | 10 ++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/proto_alpha/lib_delegate/baking_actions.ml b/src/proto_alpha/lib_delegate/baking_actions.ml index 69c37a79f241..ecb2dc9a5dbe 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.ml +++ b/src/proto_alpha/lib_delegate/baking_actions.ml @@ -423,24 +423,24 @@ let may_get_dal_content state consensus_vote = round time), we pick some small default value. *) let corner_case_default = 0.2 in match compute_next_round_time state with - | None -> corner_case_default + | None -> Lwt.return corner_case_default | Some (timestamp, _next_round) -> ( let ts = Time.System.of_protocol_opt timestamp in match ts with - | None -> corner_case_default + | None -> Lwt.return corner_case_default | Some ts -> let now = Time.System.now () in let diff = Ptime.diff ts now |> Ptime.Span.to_float_s in if diff < 0. then - (* We could output a warning, as this should not happen. *) - corner_case_default + let*! () = Events.(emit warning_dal_timeout_old_round) () in + Lwt.return corner_case_default else let factor = float_of_int state.global_state.config.dal_node_timeout_percentage /. 100. in - diff *. factor) + Lwt.return (diff *. factor)) in only_if_dal_feature_enabled state @@ -452,7 +452,7 @@ let may_get_dal_content state consensus_vote = else (* TODO: https://gitlab.com/tezos/tezos/-/issues/7459 Rather then getting this now, do it at the start of the level. *) - let timeout = compute_dal_rpc_timeout state in + let*! timeout = compute_dal_rpc_timeout state in let*! result = Lwt.pick [ diff --git a/src/proto_alpha/lib_delegate/baking_events.ml b/src/proto_alpha/lib_delegate/baking_events.ml index 5e1d79a2c0f8..b34c1a1ca411 100644 --- a/src/proto_alpha/lib_delegate/baking_events.ml +++ b/src/proto_alpha/lib_delegate/baking_events.ml @@ -882,6 +882,16 @@ module Actions = struct ("attestation_level", Data_encoding.int32) ("round", Round.encoding) + let warning_dal_timeout_old_round = + declare_0 + ~section + ~name:"warning_dal_timeout_old_round" + ~level:Warning + ~msg: + "The DAL timeout computed was for an old round. Please report this \ + issue." + () + let synchronizing_round = declare_1 ~section -- GitLab From 719aefd2928d937e3646221549b218da3e0260b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Fri, 30 Aug 2024 15:46:32 +0200 Subject: [PATCH 6/8] beta/Baker/DAL: Add an event if unexpected timeout is computed Porting to proto beta e18a4efa4206cca59541884f3163dedf1325dd86 - Baker/DAL: Add an event if unexpected timeout is computed --- src/proto_beta/lib_delegate/baking_actions.ml | 12 ++++++------ src/proto_beta/lib_delegate/baking_events.ml | 10 ++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/proto_beta/lib_delegate/baking_actions.ml b/src/proto_beta/lib_delegate/baking_actions.ml index 390a70270d93..3157d35a39d1 100644 --- a/src/proto_beta/lib_delegate/baking_actions.ml +++ b/src/proto_beta/lib_delegate/baking_actions.ml @@ -423,24 +423,24 @@ let may_get_dal_content state consensus_vote = round time), we pick some small default value. *) let corner_case_default = 0.2 in match compute_next_round_time state with - | None -> corner_case_default + | None -> Lwt.return corner_case_default | Some (timestamp, _next_round) -> ( let ts = Time.System.of_protocol_opt timestamp in match ts with - | None -> corner_case_default + | None -> Lwt.return corner_case_default | Some ts -> let now = Time.System.now () in let diff = Ptime.diff ts now |> Ptime.Span.to_float_s in if diff < 0. then - (* We could output a warning, as this should not happen. *) - corner_case_default + let*! () = Events.(emit warning_dal_timeout_old_round) () in + Lwt.return corner_case_default else let factor = float_of_int state.global_state.config.dal_node_timeout_percentage /. 100. in - diff *. factor) + Lwt.return (diff *. factor)) in only_if_dal_feature_enabled state @@ -450,7 +450,7 @@ let may_get_dal_content state consensus_vote = let lag = state.global_state.constants.parametric.dal.attestation_lag in if Int32.sub attested_level (Int32.of_int lag) < 1l then return_none else - let timeout = compute_dal_rpc_timeout state in + let*! timeout = compute_dal_rpc_timeout state in let*! result = Lwt.pick [ diff --git a/src/proto_beta/lib_delegate/baking_events.ml b/src/proto_beta/lib_delegate/baking_events.ml index 5e1d79a2c0f8..b34c1a1ca411 100644 --- a/src/proto_beta/lib_delegate/baking_events.ml +++ b/src/proto_beta/lib_delegate/baking_events.ml @@ -882,6 +882,16 @@ module Actions = struct ("attestation_level", Data_encoding.int32) ("round", Round.encoding) + let warning_dal_timeout_old_round = + declare_0 + ~section + ~name:"warning_dal_timeout_old_round" + ~level:Warning + ~msg: + "The DAL timeout computed was for an old round. Please report this \ + issue." + () + let synchronizing_round = declare_1 ~section -- GitLab From d08ce211b0462a04d35de2d681374070405c4452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Fri, 30 Aug 2024 15:47:12 +0200 Subject: [PATCH 7/8] 020_PsParisC/Baker/DAL: Add an event if unexpected timeout is computed Porting to proto 020_PsParisC e18a4efa4206cca59541884f3163dedf1325dd86 - Baker/DAL: Add an event if unexpected timeout is computed --- .../lib_delegate/baking_actions.ml | 12 ++++++------ src/proto_020_PsParisC/lib_delegate/baking_events.ml | 10 ++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/proto_020_PsParisC/lib_delegate/baking_actions.ml b/src/proto_020_PsParisC/lib_delegate/baking_actions.ml index 390a70270d93..3157d35a39d1 100644 --- a/src/proto_020_PsParisC/lib_delegate/baking_actions.ml +++ b/src/proto_020_PsParisC/lib_delegate/baking_actions.ml @@ -423,24 +423,24 @@ let may_get_dal_content state consensus_vote = round time), we pick some small default value. *) let corner_case_default = 0.2 in match compute_next_round_time state with - | None -> corner_case_default + | None -> Lwt.return corner_case_default | Some (timestamp, _next_round) -> ( let ts = Time.System.of_protocol_opt timestamp in match ts with - | None -> corner_case_default + | None -> Lwt.return corner_case_default | Some ts -> let now = Time.System.now () in let diff = Ptime.diff ts now |> Ptime.Span.to_float_s in if diff < 0. then - (* We could output a warning, as this should not happen. *) - corner_case_default + let*! () = Events.(emit warning_dal_timeout_old_round) () in + Lwt.return corner_case_default else let factor = float_of_int state.global_state.config.dal_node_timeout_percentage /. 100. in - diff *. factor) + Lwt.return (diff *. factor)) in only_if_dal_feature_enabled state @@ -450,7 +450,7 @@ let may_get_dal_content state consensus_vote = let lag = state.global_state.constants.parametric.dal.attestation_lag in if Int32.sub attested_level (Int32.of_int lag) < 1l then return_none else - let timeout = compute_dal_rpc_timeout state in + let*! timeout = compute_dal_rpc_timeout state in let*! result = Lwt.pick [ diff --git a/src/proto_020_PsParisC/lib_delegate/baking_events.ml b/src/proto_020_PsParisC/lib_delegate/baking_events.ml index 5e1d79a2c0f8..b34c1a1ca411 100644 --- a/src/proto_020_PsParisC/lib_delegate/baking_events.ml +++ b/src/proto_020_PsParisC/lib_delegate/baking_events.ml @@ -882,6 +882,16 @@ module Actions = struct ("attestation_level", Data_encoding.int32) ("round", Round.encoding) + let warning_dal_timeout_old_round = + declare_0 + ~section + ~name:"warning_dal_timeout_old_round" + ~level:Warning + ~msg: + "The DAL timeout computed was for an old round. Please report this \ + issue." + () + let synchronizing_round = declare_1 ~section -- GitLab From 0337bec11a1a49683444ae7f2fc6c610dee23a5b Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Mon, 12 Aug 2024 15:37:17 +0200 Subject: [PATCH 8/8] DAL/Tezt: add dal_node_timeout_percentage argument to Baker --- tezt/lib_tezos/baker.ml | 33 +++++++++++++++++++++++---------- tezt/lib_tezos/baker.mli | 5 ++++- tezt/tests/cloud/tezos.ml | 5 +++-- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/tezt/lib_tezos/baker.ml b/tezt/lib_tezos/baker.ml index 54b3ca644d0d..217ad787f16e 100644 --- a/tezt/lib_tezos/baker.ml +++ b/tezt/lib_tezos/baker.ml @@ -45,6 +45,7 @@ module Parameters = struct node_data_dir : string; node_rpc_endpoint : Endpoint.t; dal_node_rpc_endpoint : Endpoint.t option; + dal_node_timeout_percentage : int option; mutable pending_ready : unit option Lwt.u list; votefile : string option; liquidity_baking_toggle_vote : liquidity_baking_vote option; @@ -100,9 +101,10 @@ let create_from_uris ?runner ~protocol ?(path = Uses.path (Protocol.baker protocol)) ?name ?color ?event_pipe ?(delegates = []) ?votefile ?(liquidity_baking_toggle_vote = Some Pass) ?(force_apply = false) ?(remote_mode = false) ?operations_pool - ?dal_node_rpc_endpoint ?minimal_nanotez_per_gas_unit - ?(state_recorder = false) ?(node_version_check_bypass = false) - ?node_version_allowed ~base_dir ~node_data_dir ~node_rpc_endpoint () = + ?dal_node_rpc_endpoint ?dal_node_timeout_percentage + ?minimal_nanotez_per_gas_unit ?(state_recorder = false) + ?(node_version_check_bypass = false) ?node_version_allowed ~base_dir + ~node_data_dir ~node_rpc_endpoint () = let baker = create ~path @@ -124,6 +126,7 @@ let create_from_uris ?runner ~protocol force_apply; operations_pool; dal_node_rpc_endpoint; + dal_node_timeout_percentage; minimal_nanotez_per_gas_unit; state_recorder; node_version_check_bypass; @@ -136,8 +139,9 @@ let create_from_uris ?runner ~protocol let create ?runner ~protocol ?path ?name ?color ?event_pipe ?(delegates = []) ?votefile ?(liquidity_baking_toggle_vote = Some Pass) ?(force_apply = false) ?(remote_mode = false) ?operations_pool ?dal_node - ?minimal_nanotez_per_gas_unit ?(state_recorder = false) - ?(node_version_check_bypass = false) ?node_version_allowed node client = + ?dal_node_timeout_percentage ?minimal_nanotez_per_gas_unit + ?(state_recorder = false) ?(node_version_check_bypass = false) + ?node_version_allowed node client = let dal_node_rpc_endpoint = Option.map Dal_node.as_rpc_endpoint dal_node in create_from_uris ?runner @@ -154,6 +158,7 @@ let create ?runner ~protocol ?path ?name ?color ?event_pipe ?(delegates = []) ?operations_pool ?minimal_nanotez_per_gas_unit ?dal_node_rpc_endpoint + ?dal_node_timeout_percentage ~state_recorder ~node_version_check_bypass ?node_version_allowed @@ -195,6 +200,12 @@ let run ?event_level ?event_sections_levels (baker : t) = Endpoint.as_string baker.persistent_state.dal_node_rpc_endpoint in + let dal_node_timeout_percentage = + Cli_arg.optional_arg + "dal-node-timeout-percentage" + string_of_int + baker.persistent_state.dal_node_timeout_percentage + in let minimal_nanotez_per_gas_unit = Cli_arg.optional_arg "minimal-nanotez-per-gas-unit" @@ -222,9 +233,9 @@ let run ?event_level ?event_sections_levels (baker : t) = let arguments = ["--endpoint"; node_addr; "--base-dir"; base_dir; "run"] @ run_args @ liquidity_baking_toggle_vote @ votefile @ force_apply - @ operations_pool @ dal_node_endpoint @ delegates - @ minimal_nanotez_per_gas_unit @ state_recorder @ node_version_check_bypass - @ node_version_allowed + @ operations_pool @ dal_node_endpoint @ dal_node_timeout_percentage + @ delegates @ minimal_nanotez_per_gas_unit @ state_recorder + @ node_version_check_bypass @ node_version_allowed in let on_terminate _ = @@ -260,8 +271,9 @@ let wait_for_ready baker = let init ?runner ~protocol ?(path = Uses.path (Protocol.baker protocol)) ?name ?color ?event_level ?event_pipe ?event_sections_levels ?(delegates = []) ?votefile ?liquidity_baking_toggle_vote ?force_apply ?remote_mode - ?operations_pool ?dal_node ?minimal_nanotez_per_gas_unit ?state_recorder - ?node_version_check_bypass ?node_version_allowed node client = + ?operations_pool ?dal_node ?dal_node_timeout_percentage + ?minimal_nanotez_per_gas_unit ?state_recorder ?node_version_check_bypass + ?node_version_allowed node client = let* () = Node.wait_for_ready node in let baker = create @@ -277,6 +289,7 @@ let init ?runner ~protocol ?(path = Uses.path (Protocol.baker protocol)) ?name ?remote_mode ?operations_pool ?dal_node + ?dal_node_timeout_percentage ?minimal_nanotez_per_gas_unit ?state_recorder ?node_version_check_bypass diff --git a/tezt/lib_tezos/baker.mli b/tezt/lib_tezos/baker.mli index 49bdc6f2e7ff..ce17ca37310c 100644 --- a/tezt/lib_tezos/baker.mli +++ b/tezt/lib_tezos/baker.mli @@ -95,7 +95,7 @@ val liquidity_baking_votefile : ?path:string -> liquidity_baking_vote -> string This function just creates a value of type [t], it does not call {!val:run}. - [path] provides the path to the baker binary, the default being the one + [path] provides the path to the baker binary, the default being the one derived from the [protocol]. The standard output and standard error output of the baker will @@ -155,6 +155,7 @@ val create : ?remote_mode:bool -> ?operations_pool:string -> ?dal_node:Dal_node.t -> + ?dal_node_timeout_percentage:int -> ?minimal_nanotez_per_gas_unit:int -> ?state_recorder:bool -> ?node_version_check_bypass:bool -> @@ -195,6 +196,7 @@ val create_from_uris : ?remote_mode:bool -> ?operations_pool:string -> ?dal_node_rpc_endpoint:Endpoint.t -> + ?dal_node_timeout_percentage:int -> ?minimal_nanotez_per_gas_unit:int -> ?state_recorder:bool -> ?node_version_check_bypass:bool -> @@ -263,6 +265,7 @@ val init : ?remote_mode:bool -> ?operations_pool:string -> ?dal_node:Dal_node.t -> + ?dal_node_timeout_percentage:int -> ?minimal_nanotez_per_gas_unit:int -> ?state_recorder:bool -> ?node_version_check_bypass:bool -> diff --git a/tezt/tests/cloud/tezos.ml b/tezt/tests/cloud/tezos.ml index a65536822704..7acb3c1205a5 100644 --- a/tezt/tests/cloud/tezos.ml +++ b/tezt/tests/cloud/tezos.ml @@ -193,8 +193,8 @@ module Baker = struct module Agent = struct let init ?name ~delegate ~protocol - ?(path = Uses.path (Protocol.baker protocol)) ~client dal_node node - agent = + ?(path = Uses.path (Protocol.baker protocol)) ~client dal_node + ?dal_node_timeout_percentage node agent = let* path = Agent.copy agent ~source:path in let runner = Agent.runner agent in init @@ -205,6 +205,7 @@ module Baker = struct ~delegates:[delegate] ~protocol ~dal_node + ?dal_node_timeout_percentage node client end -- GitLab