From b719d6a2ad1848e719e2d0b339c5953172374f44 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Sun, 6 Mar 2022 17:56:12 +0100 Subject: [PATCH] `solana-validator set-identity` no longer writes a tower file unnecessarily --- core/src/replay_stage.rs | 15 +++++++++----- validator/src/admin_rpc_service.rs | 32 +++--------------------------- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 98f910346d..293a163d4b 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -735,11 +735,16 @@ impl ReplayStage { restored_tower.adjust_lockouts_after_replay(root_bank.slot(), &slot_history) }). unwrap_or_else(|err| { - // It's a fatal error if the tower is not present. This is - // necessary to prevent the validator from violating - // lockouts for its new identity - error!("Failed to load tower for {}: {}", my_pubkey, err); - std::process::exit(1); + if err.is_file_missing() { + Tower::new_from_bankforks( + &bank_forks.read().unwrap(), + &my_pubkey, + &vote_account, + ) + } else { + error!("Failed to load tower for {}: {}", my_pubkey, err); + std::process::exit(1); + } }); // Ensure the validator can land votes with the new identity before diff --git a/validator/src/admin_rpc_service.rs b/validator/src/admin_rpc_service.rs index 21cb533a14..8c340dda00 100644 --- a/validator/src/admin_rpc_service.rs +++ b/validator/src/admin_rpc_service.rs @@ -257,40 +257,14 @@ impl AdminRpc for AdminRpcImpl { })?; meta.with_post_init(|post_init| { - // Ensure a Tower exists for the new identity and exit gracefully. - // ReplayStage will be less forgiving if it fails to load the new tower. - if let Err(err) = - Tower::restore(meta.tower_storage.as_ref(), &identity_keypair.pubkey()).map_err( - |err| { + if require_tower { + let _ = Tower::restore(meta.tower_storage.as_ref(), &identity_keypair.pubkey()) + .map_err(|err| { jsonrpc_core::error::Error::invalid_params(format!( "Unable to load tower file for identity {}: {}", identity_keypair.pubkey(), err )) - }, - ) - { - if require_tower { - return Err(err); - } - - let root_bank = post_init.bank_forks.read().unwrap().root_bank(); - let mut tower = Tower::new( - &identity_keypair.pubkey(), - &post_init.vote_account, - root_bank.slot(), - &root_bank, - ); - // Forge a single vote to pacify `Tower::adjust_lockouts_after_replay` when its called - // by replay_stage - tower.record_bank_vote(&root_bank, &post_init.vote_account); - tower - .save(meta.tower_storage.as_ref(), &identity_keypair) - .map_err(|err| { - jsonrpc_core::error::Error::invalid_params(format!( - "Unable to create default tower file for ephemeral identity: {}", - err - )) })?; }