Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/app/runtime_genesis_ledger/runtime_genesis_ledger.ml
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,18 @@ let generate_hash_json ~genesis_dir ledger staking_ledger next_ledger =
staking_ledger
in
let%map next =
generate_ledger_tarball ~ledger_name_prefix:"epoch_ledger" ~genesis_dir
next_ledger
(* If next ledger has the same merkle root as staking ledger, reuse the
same tar file to avoid generating it twice with different timestamps/hashes *)
let staking_hash = Mina_ledger.Ledger.merkle_root staking_ledger in
let next_hash = Mina_ledger.Ledger.merkle_root next_ledger in
if Mina_base.Ledger_hash.equal staking_hash next_hash then (
[%log info]
"Next epoch ledger has the same hash as staking ledger, reusing \
staking ledger tar" ;
Deferred.return staking )
else
generate_ledger_tarball ~ledger_name_prefix:"epoch_ledger" ~genesis_dir
next_ledger
in
{ Hash_json.ledger = ledger_hashes; epoch_data = { staking; next } }

Expand Down
43 changes: 32 additions & 11 deletions src/lib/genesis_ledger_helper/genesis_ledger_helper.ml
Original file line number Diff line number Diff line change
Expand Up @@ -624,17 +624,38 @@ module Epoch_data = struct
epoch ledger" ;
Deferred.Or_error.return (None, None)
| Some { ledger; seed } ->
let%map next_ledger, config'', ledger_file =
load_ledger ~genesis_backing_type ledger
in
[%log trace] "Loaded next epoch ledger from $ledger_file"
~metadata:[ ("ledger_file", `String ledger_file) ] ;
( Some
{ Consensus.Genesis_epoch_data.Data.ledger = next_ledger
; seed = Epoch_seed.of_base58_check_exn seed
}
, Some { Runtime_config.Epoch_data.Data.ledger = config''; seed }
)
(* Check if next ledger has the same hash as staking ledger to avoid
loading the same ledger twice, which causes RocksDB LOCK conflicts *)
let staking_hash = config.staking.ledger.hash in
let next_hash = ledger.hash in
if Option.equal String.equal staking_hash next_hash then (
[%log trace]
"Next epoch ledger has the same hash as staking ledger, \
reusing staking ledger" ;
Deferred.Or_error.return
( Some
{ Consensus.Genesis_epoch_data.Data.ledger =
staking.ledger
Copy link
Member

@glyh glyh Oct 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit concerned about this branch. We never assume ledgers to be shared between 2 "holders", AFAIK. Would there be some mutation/destroy of the ledgers on one end, causing the other end to panic?

; seed = Epoch_seed.of_base58_check_exn seed
}
, Some
{ Runtime_config.Epoch_data.Data.ledger =
staking_config.ledger
; seed
} ) )
else
let%map next_ledger, config'', ledger_file =
load_ledger ~genesis_backing_type ledger
in
[%log trace] "Loaded next epoch ledger from $ledger_file"
~metadata:[ ("ledger_file", `String ledger_file) ] ;
( Some
{ Consensus.Genesis_epoch_data.Data.ledger = next_ledger
; seed = Epoch_seed.of_base58_check_exn seed
}
, Some
{ Runtime_config.Epoch_data.Data.ledger = config''; seed }
)
in
(* the staking ledger and the next ledger, if it exists,
should have the genesis winner account as the first account, under
Expand Down