Boot error piggybacking on BankError

This commit is contained in:
Greg Fitzgerald 2019-03-13 13:47:09 -06:00
parent 296415945a
commit 6fd0d4dcf5
2 changed files with 16 additions and 15 deletions

View File

@ -4,10 +4,11 @@ use crate::entry::{Entry, EntrySlice};
use crate::leader_schedule_utils; use crate::leader_schedule_utils;
use rayon::prelude::*; use rayon::prelude::*;
use solana_metrics::counter::Counter; use solana_metrics::counter::Counter;
use solana_runtime::bank::{Bank, BankError, Result}; use solana_runtime::bank::{Bank, Result};
use solana_sdk::genesis_block::GenesisBlock; use solana_sdk::genesis_block::GenesisBlock;
use solana_sdk::timing::duration_as_ms; use solana_sdk::timing::duration_as_ms;
use solana_sdk::timing::MAX_RECENT_BLOCKHASHES; use solana_sdk::timing::MAX_RECENT_BLOCKHASHES;
use std::result;
use std::sync::Arc; use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
@ -78,11 +79,16 @@ pub struct BankForksInfo {
pub entry_height: u64, pub entry_height: u64,
} }
#[derive(Debug)]
pub enum BlocktreeProcessorError {
LedgerVerificationFailed,
}
pub fn process_blocktree( pub fn process_blocktree(
genesis_block: &GenesisBlock, genesis_block: &GenesisBlock,
blocktree: &Blocktree, blocktree: &Blocktree,
account_paths: Option<String>, account_paths: Option<String>,
) -> Result<(BankForks, Vec<BankForksInfo>)> { ) -> result::Result<(BankForks, Vec<BankForksInfo>), BlocktreeProcessorError> {
let now = Instant::now(); let now = Instant::now();
info!("processing ledger..."); info!("processing ledger...");
@ -98,7 +104,7 @@ pub fn process_blocktree(
.meta(slot) .meta(slot)
.map_err(|err| { .map_err(|err| {
warn!("Failed to load meta for slot {}: {:?}", slot, err); warn!("Failed to load meta for slot {}: {:?}", slot, err);
BankError::LedgerVerificationFailed BlocktreeProcessorError::LedgerVerificationFailed
})? })?
.unwrap(); .unwrap();
@ -113,7 +119,7 @@ pub fn process_blocktree(
// Fetch all entries for this slot // Fetch all entries for this slot
let mut entries = blocktree.get_slot_entries(slot, 0, None).map_err(|err| { let mut entries = blocktree.get_slot_entries(slot, 0, None).map_err(|err| {
warn!("Failed to load entries for slot {}: {:?}", slot, err); warn!("Failed to load entries for slot {}: {:?}", slot, err);
BankError::LedgerVerificationFailed BlocktreeProcessorError::LedgerVerificationFailed
})?; })?;
if slot == 0 { if slot == 0 {
@ -122,12 +128,12 @@ pub fn process_blocktree(
// processed by the bank, skip over it. // processed by the bank, skip over it.
if entries.is_empty() { if entries.is_empty() {
warn!("entry0 not present"); warn!("entry0 not present");
return Err(BankError::LedgerVerificationFailed); return Err(BlocktreeProcessorError::LedgerVerificationFailed);
} }
let entry0 = &entries[0]; let entry0 = &entries[0];
if !(entry0.is_tick() && entry0.verify(&last_entry_hash)) { if !(entry0.is_tick() && entry0.verify(&last_entry_hash)) {
warn!("Ledger proof of history failed at entry0"); warn!("Ledger proof of history failed at entry0");
return Err(BankError::LedgerVerificationFailed); return Err(BlocktreeProcessorError::LedgerVerificationFailed);
} }
last_entry_hash = entry0.hash; last_entry_hash = entry0.hash;
entry_height += 1; entry_height += 1;
@ -140,12 +146,12 @@ pub fn process_blocktree(
"Ledger proof of history failed at slot: {}, entry: {}", "Ledger proof of history failed at slot: {}, entry: {}",
slot, entry_height slot, entry_height
); );
return Err(BankError::LedgerVerificationFailed); return Err(BlocktreeProcessorError::LedgerVerificationFailed);
} }
process_entries(&bank, &entries).map_err(|err| { process_entries(&bank, &entries).map_err(|err| {
warn!("Failed to process entries for slot {}: {:?}", slot, err); warn!("Failed to process entries for slot {}: {:?}", slot, err);
BankError::LedgerVerificationFailed BlocktreeProcessorError::LedgerVerificationFailed
})?; })?;
last_entry_hash = entries.last().unwrap().hash; last_entry_hash = entries.last().unwrap().hash;
@ -171,7 +177,7 @@ pub fn process_blocktree(
.meta(next_slot) .meta(next_slot)
.map_err(|err| { .map_err(|err| {
warn!("Failed to load meta for slot {}: {:?}", slot, err); warn!("Failed to load meta for slot {}: {:?}", slot, err);
BankError::LedgerVerificationFailed BlocktreeProcessorError::LedgerVerificationFailed
})? })?
.unwrap(); .unwrap();
@ -223,6 +229,7 @@ mod tests {
use crate::blocktree::create_new_tmp_ledger; use crate::blocktree::create_new_tmp_ledger;
use crate::blocktree::tests::entries_to_blobs; use crate::blocktree::tests::entries_to_blobs;
use crate::entry::{create_ticks, next_entry, Entry}; use crate::entry::{create_ticks, next_entry, Entry};
use solana_runtime::bank::BankError;
use solana_sdk::genesis_block::GenesisBlock; use solana_sdk::genesis_block::GenesisBlock;
use solana_sdk::hash::Hash; use solana_sdk::hash::Hash;
use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::signature::{Keypair, KeypairUtil};

View File

@ -129,15 +129,9 @@ pub enum BankError {
/// the `recent_blockhash` has been discarded. /// the `recent_blockhash` has been discarded.
BlockhashNotFound, BlockhashNotFound,
/// Proof of History verification failed.
LedgerVerificationFailed,
/// The program returned an error /// The program returned an error
InstructionError(u8, InstructionError), InstructionError(u8, InstructionError),
/// Recoding into PoH failed
RecordFailure,
/// Loader call chain too deep /// Loader call chain too deep
CallChainTooDeep, CallChainTooDeep,