Discard pre hard fork persisted tower if hard-forking (#13536)
* Discard pre hard fork persisted tower if hard-forking * Relax config.require_tower * Add cluster test * nits * Remove unnecessary check Co-authored-by: Ryo Onodera <ryoqun@gmail.com> Co-authored-by: Carl Lin <carl@solana.com>
This commit is contained in:
@ -1182,6 +1182,9 @@ pub enum TowerError {
|
||||
|
||||
#[error("The tower is fatally inconsistent with blockstore: {0}")]
|
||||
FatallyInconsistent(&'static str),
|
||||
|
||||
#[error("The tower is useless because of new hard fork: {0}")]
|
||||
HardFork(Slot),
|
||||
}
|
||||
|
||||
impl TowerError {
|
||||
|
@ -720,11 +720,38 @@ fn post_process_restored_tower(
|
||||
ledger_path: &Path,
|
||||
bank_forks: &BankForks,
|
||||
) -> Tower {
|
||||
let mut should_require_tower = config.require_tower;
|
||||
|
||||
restored_tower
|
||||
.and_then(|tower| {
|
||||
let root_bank = bank_forks.root_bank();
|
||||
let slot_history = root_bank.get_slot_history();
|
||||
tower.adjust_lockouts_after_replay(root_bank.slot(), &slot_history)
|
||||
let tower = tower.adjust_lockouts_after_replay(root_bank.slot(), &slot_history);
|
||||
|
||||
if let Some(wait_slot_for_supermajority) = config.wait_for_supermajority {
|
||||
if root_bank.slot() == wait_slot_for_supermajority {
|
||||
// intentionally fail to restore tower; we're supposedly in a new hard fork; past
|
||||
// out-of-chain vote state doesn't make sense at all
|
||||
// what if --wait-for-supermajority again if the validator restarted?
|
||||
let message = format!("Hardfork is detected; discarding tower restoration result: {:?}", tower);
|
||||
datapoint_error!(
|
||||
"tower_error",
|
||||
(
|
||||
"error",
|
||||
message,
|
||||
String
|
||||
),
|
||||
);
|
||||
error!("{}", message);
|
||||
|
||||
// unconditionally relax tower requirement so that we can always restore tower
|
||||
// from root bank.
|
||||
should_require_tower = false;
|
||||
return Err(crate::consensus::TowerError::HardFork(wait_slot_for_supermajority));
|
||||
}
|
||||
}
|
||||
|
||||
tower
|
||||
})
|
||||
.unwrap_or_else(|err| {
|
||||
let voting_has_been_active =
|
||||
@ -739,7 +766,7 @@ fn post_process_restored_tower(
|
||||
),
|
||||
);
|
||||
}
|
||||
if config.require_tower && voting_has_been_active {
|
||||
if should_require_tower && voting_has_been_active {
|
||||
error!("Requested mandatory tower restore failed: {}", err);
|
||||
error!(
|
||||
"And there is an existing vote_account containing actual votes. \
|
||||
|
Reference in New Issue
Block a user