From 826b8e951c34155d17ee9065bc2822ba04e0a507 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Tue, 25 Nov 2025 11:05:15 +0100 Subject: [PATCH 1/6] Baker: emit event when block signature takes too long --- .../lib_delegate/baking_actions.ml | 89 ++++++++++++++----- src/proto_alpha/lib_delegate/baking_events.ml | 13 +++ 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/proto_alpha/lib_delegate/baking_actions.ml b/src/proto_alpha/lib_delegate/baking_actions.ml index d7077fec6d4f..63d60e213db2 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.ml +++ b/src/proto_alpha/lib_delegate/baking_actions.ml @@ -226,7 +226,8 @@ let sign ?timeout ?watermark ~signing_request cctxt secret_key_uri msg = Lwt.return (Error errs) | `Signature_result (Ok res) -> Lwt.return (Ok res) -let sign_block_header global_state proposer unsigned_block_header = +let sign_block_header round_duration global_state proposer unsigned_block_header + = let open Lwt_result_syntax in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in @@ -273,15 +274,23 @@ let sign_block_header global_state proposer unsigned_block_header = match result with | false -> tzfail (Block_previously_baked {level; round}) | true -> + let delay_between_stall_events = + (* round_duration /. 2 is arbitrary and conservative *) + round_duration /. 2. + in let* signature = - (sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request:`Block_header - cctxt - proposer.secret_key_uri - ~watermark:Block_header.(to_watermark (Block_header chain_id)) - unsigned_header - [@profiler.record_s {verbosity = Debug} "sign : block header"]) + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.(emit stalling_signature (`Block_header, level, round, sum))) + (sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request:`Block_header + cctxt + proposer.secret_key_uri + ~watermark:Block_header.(to_watermark (Block_header chain_id)) + unsigned_header + [@profiler.record_s {verbosity = Debug} "sign : block header"]) in return {Block_header.shell; protocol_data = {contents; signature}} @@ -416,6 +425,10 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) ~block:pred_block () [@profiler.record_s {verbosity = Info} "live blocks"]) in + let round_duration = + Round.round_duration global_state.round_durations round + |> Period.to_seconds |> Int64.to_float + in let* {unsigned_block_header; operations; manager_operations_infos} = (Block_forge.forge cctxt @@ -438,6 +451,7 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) in let* signed_block_header = (sign_block_header + round_duration global_state delegate.consensus_key unsigned_block_header @@ -653,7 +667,12 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : let open Lwt_result_syntax in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in - let {vote_kind; vote_consensus_content; delegate; dal_content} = + let { + vote_kind; + vote_consensus_content = {level; round; _} as vote_consensus_content; + delegate; + dal_content; + } = unsigned_consensus_vote in let shell = {Tezos_base.Operation.branch} in @@ -726,14 +745,29 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : | Attestation -> `Attestation in let sk_consensus_uri = delegate.consensus_key.secret_key_uri in + let delay_between_stall_events = + let round_duration = + Round.round_duration global_state.round_durations round + |> Period.to_seconds |> Int64.to_float + in + (* round_duration /. 3 is arbitrary and conservative *) + round_duration /. 3. + in let* consensus_sig = - sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request - cctxt - ~watermark - sk_consensus_uri - unsigned_operation_bytes + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.( + emit + stalling_signature + (signing_request, Raw_level.to_int32 level, round, sum))) + @@ sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request + cctxt + ~watermark + sk_consensus_uri + unsigned_operation_bytes in let* signature = match (dal_content, companion_key_opt) with @@ -748,13 +782,20 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : | Some {attestation = dal_attestation}, Some companion_key -> ( let sk_companion_uri = companion_key.secret_key_uri in let* companion_sig = - sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request - cctxt - ~watermark - sk_companion_uri - unsigned_operation_bytes + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.( + emit + stalling_signature + (signing_request, Raw_level.to_int32 level, round, sum))) + @@ sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request + cctxt + ~watermark + sk_companion_uri + unsigned_operation_bytes in match ( consensus_sig, diff --git a/src/proto_alpha/lib_delegate/baking_events.ml b/src/proto_alpha/lib_delegate/baking_events.ml index 82d34e3e3ff3..e9b15e42bd1a 100644 --- a/src/proto_alpha/lib_delegate/baking_events.ml +++ b/src/proto_alpha/lib_delegate/baking_events.ml @@ -1082,6 +1082,19 @@ module Actions = struct let unhealthy_dal_node = Commands.unhealthy_dal_node let unreachable_dal_node = Commands.unreachable_dal_node + + let stalling_signature = + declare_4 + ~section + ~name:"stalling_signature" + ~level:Warning + ~msg: + "Signature call of {kind} for level {level} at round {round} has not \ + resolved in the last {seconds} seconds" + ("kind", Baking_errors.signing_request_encoding) + ("level", Data_encoding.int32) + ("round", Round.encoding) + ("seconds", Data_encoding.float) end module VDF = struct -- GitLab From 2fb4ae84aca051035b9e81ff01f7d820ad4998be Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Mon, 1 Dec 2025 11:08:48 +0100 Subject: [PATCH 2/6] 023_PtSeouLo/Baker: emit event when block signature takes too long Porting to proto 023_PtSeouLo 826b8e951c34155d17ee9065bc2822ba04e0a507 - Baker: emit event when block signature takes too long --- .../lib_delegate/baking_actions.ml | 89 ++++++++++++++----- .../lib_delegate/baking_events.ml | 13 +++ 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml b/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml index 649cd27b3609..c1f16ba191ea 100644 --- a/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml +++ b/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml @@ -228,7 +228,8 @@ let sign ?timeout ?watermark ~signing_request cctxt secret_key_uri msg = Lwt.return (Error errs) | `Signature_result (Ok res) -> Lwt.return (Ok res) -let sign_block_header global_state proposer unsigned_block_header = +let sign_block_header round_duration global_state proposer unsigned_block_header + = let open Lwt_result_syntax in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in @@ -275,15 +276,23 @@ let sign_block_header global_state proposer unsigned_block_header = match result with | false -> tzfail (Block_previously_baked {level; round}) | true -> + let delay_between_stall_events = + (* round_duration /. 2 is arbitrary and conservative *) + round_duration /. 2. + in let* signature = - (sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request:`Block_header - cctxt - proposer.secret_key_uri - ~watermark:Block_header.(to_watermark (Block_header chain_id)) - unsigned_header - [@profiler.record_s {verbosity = Debug} "sign : block header"]) + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.(emit stalling_signature (`Block_header, level, round, sum))) + (sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request:`Block_header + cctxt + proposer.secret_key_uri + ~watermark:Block_header.(to_watermark (Block_header chain_id)) + unsigned_header + [@profiler.record_s {verbosity = Debug} "sign : block header"]) in return {Block_header.shell; protocol_data = {contents; signature}} @@ -423,6 +432,10 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) ~block:pred_block () [@profiler.record_s {verbosity = Info} "live blocks"]) in + let round_duration = + Round.round_duration global_state.round_durations round + |> Period.to_seconds |> Int64.to_float + in let* {unsigned_block_header; operations; manager_operations_infos} = (Block_forge.forge cctxt @@ -446,6 +459,7 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) in let* signed_block_header = (sign_block_header + round_duration global_state delegate.consensus_key unsigned_block_header @@ -681,7 +695,12 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : let open Lwt_result_syntax in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in - let {vote_kind; vote_consensus_content; delegate; dal_content} = + let { + vote_kind; + vote_consensus_content = {level; round; _} as vote_consensus_content; + delegate; + dal_content; + } = unsigned_consensus_vote in let shell = {Tezos_base.Operation.branch} in @@ -754,14 +773,29 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : | Attestation -> `Attestation in let sk_consensus_uri = delegate.consensus_key.secret_key_uri in + let delay_between_stall_events = + let round_duration = + Round.round_duration global_state.round_durations round + |> Period.to_seconds |> Int64.to_float + in + (* round_duration /. 3 is arbitrary and conservative *) + round_duration /. 3. + in let* consensus_sig = - sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request - cctxt - ~watermark - sk_consensus_uri - unsigned_operation_bytes + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.( + emit + stalling_signature + (signing_request, Raw_level.to_int32 level, round, sum))) + @@ sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request + cctxt + ~watermark + sk_consensus_uri + unsigned_operation_bytes in let* signature = match (dal_content, companion_key_opt) with @@ -776,13 +810,20 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : | Some {attestation = dal_attestation}, Some companion_key -> ( let sk_companion_uri = companion_key.secret_key_uri in let* companion_sig = - sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request - cctxt - ~watermark - sk_companion_uri - unsigned_operation_bytes + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.( + emit + stalling_signature + (signing_request, Raw_level.to_int32 level, round, sum))) + @@ sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request + cctxt + ~watermark + sk_companion_uri + unsigned_operation_bytes in match ( consensus_sig, diff --git a/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml b/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml index 330f069d4a3e..c5c469a34920 100644 --- a/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml +++ b/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml @@ -1113,6 +1113,19 @@ module Actions = struct let unhealthy_dal_node = Commands.unhealthy_dal_node let unreachable_dal_node = Commands.unreachable_dal_node + + let stalling_signature = + declare_4 + ~section + ~name:"stalling_signature" + ~level:Warning + ~msg: + "Signature call of {kind} for level {level} at round {round} has not \ + resolved in the last {seconds} seconds" + ("kind", Baking_errors.signing_request_encoding) + ("level", Data_encoding.int32) + ("round", Round.encoding) + ("seconds", Data_encoding.float) end module VDF = struct -- GitLab From 81afca0eab724328f3906ee87216d020457b7c41 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Mon, 1 Dec 2025 11:08:52 +0100 Subject: [PATCH 3/6] 024_PtTALLiN/Baker: emit event when block signature takes too long Porting to proto 024_PtTALLiN 826b8e951c34155d17ee9065bc2822ba04e0a507 - Baker: emit event when block signature takes too long --- .../lib_delegate/baking_actions.ml | 89 ++++++++++++++----- .../lib_delegate/baking_events.ml | 13 +++ 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml b/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml index 99a88a94e4cd..d856cb8d216c 100644 --- a/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml +++ b/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml @@ -228,7 +228,8 @@ let sign ?timeout ?watermark ~signing_request cctxt secret_key_uri msg = Lwt.return (Error errs) | `Signature_result (Ok res) -> Lwt.return (Ok res) -let sign_block_header global_state proposer unsigned_block_header = +let sign_block_header round_duration global_state proposer unsigned_block_header + = let open Lwt_result_syntax in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in @@ -275,15 +276,23 @@ let sign_block_header global_state proposer unsigned_block_header = match result with | false -> tzfail (Block_previously_baked {level; round}) | true -> + let delay_between_stall_events = + (* round_duration /. 2 is arbitrary and conservative *) + round_duration /. 2. + in let* signature = - (sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request:`Block_header - cctxt - proposer.secret_key_uri - ~watermark:Block_header.(to_watermark (Block_header chain_id)) - unsigned_header - [@profiler.record_s {verbosity = Debug} "sign : block header"]) + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.(emit stalling_signature (`Block_header, level, round, sum))) + (sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request:`Block_header + cctxt + proposer.secret_key_uri + ~watermark:Block_header.(to_watermark (Block_header chain_id)) + unsigned_header + [@profiler.record_s {verbosity = Debug} "sign : block header"]) in return {Block_header.shell; protocol_data = {contents; signature}} @@ -418,6 +427,10 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) ~block:pred_block () [@profiler.record_s {verbosity = Info} "live blocks"]) in + let round_duration = + Round.round_duration global_state.round_durations round + |> Period.to_seconds |> Int64.to_float + in let* {unsigned_block_header; operations; manager_operations_infos} = (Block_forge.forge cctxt @@ -440,6 +453,7 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) in let* signed_block_header = (sign_block_header + round_duration global_state delegate.consensus_key unsigned_block_header @@ -673,7 +687,12 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : let open Lwt_result_syntax in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in - let {vote_kind; vote_consensus_content; delegate; dal_content} = + let { + vote_kind; + vote_consensus_content = {level; round; _} as vote_consensus_content; + delegate; + dal_content; + } = unsigned_consensus_vote in let shell = {Tezos_base.Operation.branch} in @@ -746,14 +765,29 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : | Attestation -> `Attestation in let sk_consensus_uri = delegate.consensus_key.secret_key_uri in + let delay_between_stall_events = + let round_duration = + Round.round_duration global_state.round_durations round + |> Period.to_seconds |> Int64.to_float + in + (* round_duration /. 3 is arbitrary and conservative *) + round_duration /. 3. + in let* consensus_sig = - sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request - cctxt - ~watermark - sk_consensus_uri - unsigned_operation_bytes + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.( + emit + stalling_signature + (signing_request, Raw_level.to_int32 level, round, sum))) + @@ sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request + cctxt + ~watermark + sk_consensus_uri + unsigned_operation_bytes in let* signature = match (dal_content, companion_key_opt) with @@ -768,13 +802,20 @@ let forge_and_sign_consensus_vote global_state ~branch unsigned_consensus_vote : | Some {attestation = dal_attestation}, Some companion_key -> ( let sk_companion_uri = companion_key.secret_key_uri in let* companion_sig = - sign - ?timeout:global_state.config.remote_calls_timeout - ~signing_request - cctxt - ~watermark - sk_companion_uri - unsigned_operation_bytes + Utils.event_on_stalling_promise + ~initial_delay:delay_between_stall_events + ~event:(fun sum -> + Events.( + emit + stalling_signature + (signing_request, Raw_level.to_int32 level, round, sum))) + @@ sign + ?timeout:global_state.config.remote_calls_timeout + ~signing_request + cctxt + ~watermark + sk_companion_uri + unsigned_operation_bytes in match ( consensus_sig, diff --git a/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml b/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml index 1b917a6708e3..44682db218ca 100644 --- a/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml +++ b/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml @@ -1103,6 +1103,19 @@ module Actions = struct let unhealthy_dal_node = Commands.unhealthy_dal_node let unreachable_dal_node = Commands.unreachable_dal_node + + let stalling_signature = + declare_4 + ~section + ~name:"stalling_signature" + ~level:Warning + ~msg: + "Signature call of {kind} for level {level} at round {round} has not \ + resolved in the last {seconds} seconds" + ("kind", Baking_errors.signing_request_encoding) + ("level", Data_encoding.int32) + ("round", Round.encoding) + ("seconds", Data_encoding.float) end module VDF = struct -- GitLab From 48f584f79d01a2005826451dd9026b0fe1ccb2d1 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Tue, 25 Nov 2025 11:20:16 +0100 Subject: [PATCH 4/6] Baker: emit an event when block forge takes too long --- .../lib_delegate/baking_actions.ml | 52 +++++++++---------- src/proto_alpha/lib_delegate/baking_events.ml | 12 +++++ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/proto_alpha/lib_delegate/baking_actions.ml b/src/proto_alpha/lib_delegate/baking_actions.ml index 63d60e213db2..bc43c63edd7f 100644 --- a/src/proto_alpha/lib_delegate/baking_actions.ml +++ b/src/proto_alpha/lib_delegate/baking_actions.ml @@ -298,12 +298,8 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) = let open Lwt_result_syntax in let {predecessor; round; delegate; kind; force_apply} = block_to_bake in - let*! () = - Events.( - emit - prepare_forging_block - (Int32.succ predecessor.shell.level, round, delegate)) - in + let level = Int32.succ predecessor.shell.level in + let*! () = Events.(emit prepare_forging_block (level, round, delegate)) in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in let simulation_mode = global_state.validation_mode in @@ -341,10 +337,7 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) payload_round ) in let*! () = - Events.( - emit - forging_block - (Int32.succ predecessor.shell.level, round, delegate, force_apply)) + Events.(emit forging_block (level, round, delegate, force_apply)) in let* injection_level = Node_rpc.current_level @@ -430,24 +423,27 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) |> Period.to_seconds |> Int64.to_float in let* {unsigned_block_header; operations; manager_operations_infos} = - (Block_forge.forge - cctxt - ~chain_id - ~pred_info:predecessor - ~pred_live_blocks - ~pred_resulting_context_hash - ~timestamp - ~round - ~seed_nonce_hash - ~payload_round - ~liquidity_baking_toggle_vote:liquidity_baking_vote - ~user_activated_upgrades - ~force_apply - global_state.config.fees - simulation_mode - simulation_kind - global_state.constants.parametric - [@profiler.record_s {verbosity = Info} "forge block"]) + Utils.event_on_stalling_promise + ~initial_delay:(round_duration /. 2.) + ~event:(fun sum -> Events.(emit stalling_forge_block (level, round, sum))) + @@ (Block_forge.forge + cctxt + ~chain_id + ~pred_info:predecessor + ~pred_live_blocks + ~pred_resulting_context_hash + ~timestamp + ~round + ~seed_nonce_hash + ~payload_round + ~liquidity_baking_toggle_vote:liquidity_baking_vote + ~user_activated_upgrades + ~force_apply + global_state.config.fees + simulation_mode + simulation_kind + global_state.constants.parametric + [@profiler.record_s {verbosity = Info} "forge block"]) in let* signed_block_header = (sign_block_header diff --git a/src/proto_alpha/lib_delegate/baking_events.ml b/src/proto_alpha/lib_delegate/baking_events.ml index e9b15e42bd1a..07ac3e03063f 100644 --- a/src/proto_alpha/lib_delegate/baking_events.ml +++ b/src/proto_alpha/lib_delegate/baking_events.ml @@ -1095,6 +1095,18 @@ module Actions = struct ("level", Data_encoding.int32) ("round", Round.encoding) ("seconds", Data_encoding.float) + + let stalling_forge_block = + declare_3 + ~section + ~name:"stalling_forge_block" + ~level:Warning + ~msg: + "Forge block for level {level} at round {round} has not resolved in \ + the last {seconds} seconds" + ("level", Data_encoding.int32) + ("round", Round.encoding) + ("seconds", Data_encoding.float) end module VDF = struct -- GitLab From f12974ba298eb76e6ba89e18b5c35c0edfbcd48e Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Mon, 1 Dec 2025 11:12:47 +0100 Subject: [PATCH 5/6] 023_PtSeouLo/Baker: emit an event when block forge takes too long Porting to proto 023_PtSeouLo 48f584f79d01a2005826451dd9026b0fe1ccb2d1 - Baker: emit an event when block forge takes too long --- .../lib_delegate/baking_actions.ml | 13 +++---------- .../lib_delegate/baking_events.ml | 12 ++++++++++++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml b/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml index c1f16ba191ea..e7a7adb33796 100644 --- a/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml +++ b/src/proto_023_PtSeouLo/lib_delegate/baking_actions.ml @@ -300,12 +300,8 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) = let open Lwt_result_syntax in let {predecessor; round; delegate; kind; force_apply} = block_to_bake in - let*! () = - Events.( - emit - prepare_forging_block - (Int32.succ predecessor.shell.level, round, delegate)) - in + let level = Int32.succ predecessor.shell.level in + let*! () = Events.(emit prepare_forging_block (level, round, delegate)) in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in let simulation_mode = global_state.validation_mode in @@ -343,10 +339,7 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) payload_round ) in let*! () = - Events.( - emit - forging_block - (Int32.succ predecessor.shell.level, round, delegate, force_apply)) + Events.(emit forging_block (level, round, delegate, force_apply)) in let* injection_level = Node_rpc.current_level diff --git a/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml b/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml index c5c469a34920..0e481cff8e88 100644 --- a/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml +++ b/src/proto_023_PtSeouLo/lib_delegate/baking_events.ml @@ -1126,6 +1126,18 @@ module Actions = struct ("level", Data_encoding.int32) ("round", Round.encoding) ("seconds", Data_encoding.float) + + let stalling_forge_block = + declare_3 + ~section + ~name:"stalling_forge_block" + ~level:Warning + ~msg: + "Forge block for level {level} at round {round} has not resolved in \ + the last {seconds} seconds" + ("level", Data_encoding.int32) + ("round", Round.encoding) + ("seconds", Data_encoding.float) end module VDF = struct -- GitLab From 466cf500a947cc878546287f49cb05441cdf2d4d Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Mon, 1 Dec 2025 11:12:48 +0100 Subject: [PATCH 6/6] 024_PtTALLiN/Baker: emit an event when block forge takes too long Porting to proto 024_PtTALLiN 48f584f79d01a2005826451dd9026b0fe1ccb2d1 - Baker: emit an event when block forge takes too long --- .../lib_delegate/baking_actions.ml | 52 +++++++++---------- .../lib_delegate/baking_events.ml | 12 +++++ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml b/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml index d856cb8d216c..fe7ba3b81b91 100644 --- a/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml +++ b/src/proto_024_PtTALLiN/lib_delegate/baking_actions.ml @@ -300,12 +300,8 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) = let open Lwt_result_syntax in let {predecessor; round; delegate; kind; force_apply} = block_to_bake in - let*! () = - Events.( - emit - prepare_forging_block - (Int32.succ predecessor.shell.level, round, delegate)) - in + let level = Int32.succ predecessor.shell.level in + let*! () = Events.(emit prepare_forging_block (level, round, delegate)) in let cctxt = global_state.cctxt in let chain_id = global_state.chain_id in let simulation_mode = global_state.validation_mode in @@ -343,10 +339,7 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) payload_round ) in let*! () = - Events.( - emit - forging_block - (Int32.succ predecessor.shell.level, round, delegate, force_apply)) + Events.(emit forging_block (level, round, delegate, force_apply)) in let* injection_level = Node_rpc.current_level @@ -432,24 +425,27 @@ let prepare_block (global_state : global_state) (block_to_bake : block_to_bake) |> Period.to_seconds |> Int64.to_float in let* {unsigned_block_header; operations; manager_operations_infos} = - (Block_forge.forge - cctxt - ~chain_id - ~pred_info:predecessor - ~pred_live_blocks - ~pred_resulting_context_hash - ~timestamp - ~round - ~seed_nonce_hash - ~payload_round - ~liquidity_baking_toggle_vote:liquidity_baking_vote - ~user_activated_upgrades - ~force_apply - global_state.config.fees - simulation_mode - simulation_kind - global_state.constants.parametric - [@profiler.record_s {verbosity = Info} "forge block"]) + Utils.event_on_stalling_promise + ~initial_delay:(round_duration /. 2.) + ~event:(fun sum -> Events.(emit stalling_forge_block (level, round, sum))) + @@ (Block_forge.forge + cctxt + ~chain_id + ~pred_info:predecessor + ~pred_live_blocks + ~pred_resulting_context_hash + ~timestamp + ~round + ~seed_nonce_hash + ~payload_round + ~liquidity_baking_toggle_vote:liquidity_baking_vote + ~user_activated_upgrades + ~force_apply + global_state.config.fees + simulation_mode + simulation_kind + global_state.constants.parametric + [@profiler.record_s {verbosity = Info} "forge block"]) in let* signed_block_header = (sign_block_header diff --git a/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml b/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml index 44682db218ca..cf9c6ff1bb36 100644 --- a/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml +++ b/src/proto_024_PtTALLiN/lib_delegate/baking_events.ml @@ -1116,6 +1116,18 @@ module Actions = struct ("level", Data_encoding.int32) ("round", Round.encoding) ("seconds", Data_encoding.float) + + let stalling_forge_block = + declare_3 + ~section + ~name:"stalling_forge_block" + ~level:Warning + ~msg: + "Forge block for level {level} at round {round} has not resolved in \ + the last {seconds} seconds" + ("level", Data_encoding.int32) + ("round", Round.encoding) + ("seconds", Data_encoding.float) end module VDF = struct -- GitLab