From 714cf0eff24071abad85c24fb666eb5f3c29bfd2 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 9 Mar 2022 01:55:14 +0000 Subject: [PATCH] `solana-validator set-identity` no longer writes a tower file unnecessarily (#23542) (cherry picked from commit b719d6a2ad1848e719e2d0b339c5953172374f44) Co-authored-by: Michael Vines --- 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 9166100feb..6c3147f010 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -726,11 +726,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 653beb9b13..b1d18bcae9 100644 --- a/validator/src/admin_rpc_service.rs +++ b/validator/src/admin_rpc_service.rs @@ -182,40 +182,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 - )) })?; }