Compare commits

...

8 Commits

7 changed files with 54 additions and 48 deletions

View File

@ -42,10 +42,6 @@ solana-gossip --entrypoint testnet.solana.com:8001 spy
If your machine has a GPU with CUDA installed \(Linux-only currently\), include
the `--cuda` argument to `solana-validator`.
```bash
export SOLANA_CUDA=1
```
When your validator is started look for the following log message to indicate
that CUDA is enabled: `"[<timestamp> solana::validator] CUDA is enabled"`

View File

@ -20,7 +20,7 @@ steps:
timeout_in_minutes: 30
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-stable.sh"
name: "stable"
timeout_in_minutes: 40
timeout_in_minutes: 60
artifact_paths: "log-*.txt"
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-move.sh"
name: "move"

View File

@ -446,7 +446,7 @@ pub fn process_show_block_production(
first_slot_in_epoch
};
let start_slot_index = (start_slot - first_slot_in_epoch) as usize;
let end_slot_index = (end_slot - start_slot) as usize;
let end_slot_index = (end_slot - first_slot_in_epoch) as usize;
let progress_bar = new_spinner_progress_bar();
progress_bar.set_message(&format!(
@ -458,9 +458,9 @@ pub fn process_show_block_production(
let total_slots = end_slot_index - start_slot_index + 1;
let total_blocks = confirmed_blocks.len();
assert!(total_blocks <= total_slots);
let total_slots_missed = total_slots - total_blocks;
let total_slots_skipped = total_slots - total_blocks;
let mut leader_slot_count = HashMap::new();
let mut leader_missed_slots = HashMap::new();
let mut leader_skipped_slots = HashMap::new();
progress_bar.set_message(&format!("Fetching leader schedule for epoch {}...", epoch));
let leader_schedule = rpc_client
@ -482,7 +482,7 @@ pub fn process_show_block_production(
progress_bar.set_message(&format!(
"Processing {} slots containing {} blocks and {} empty slots...",
total_slots, total_blocks, total_slots_missed
total_slots, total_blocks, total_slots_skipped
));
let mut confirmed_blocks_index = 0;
@ -491,7 +491,7 @@ pub fn process_show_block_production(
let slot = start_slot + slot_index as u64;
let slot_count = leader_slot_count.entry(leader).or_insert(0);
*slot_count += 1;
let missed_slots = leader_missed_slots.entry(leader).or_insert(0);
let skipped_slots = leader_skipped_slots.entry(leader).or_insert(0);
loop {
if !confirmed_blocks.is_empty() {
@ -506,9 +506,9 @@ pub fn process_show_block_production(
break;
}
}
*missed_slots += 1;
*skipped_slots += 1;
individual_slot_status.push(
style(format!(" {:<15} {:<44} MISSED", slot, leader))
style(format!(" {:<15} {:<44} SKIPPED", slot, leader))
.red()
.to_string(),
);
@ -524,23 +524,23 @@ pub fn process_show_block_production(
"Identity Pubkey",
"Leader Slots",
"Blocks Produced",
"Missed Slots",
"Missed Block Percentage",
"Skipped Slots",
"Skipped Slot Percentage",
))
.bold()
);
let mut table = vec![];
for (leader, leader_slots) in leader_slot_count.iter() {
let missed_slots = leader_missed_slots.get(leader).unwrap();
let blocks_produced = leader_slots - missed_slots;
let skipped_slots = leader_skipped_slots.get(leader).unwrap();
let blocks_produced = leader_slots - skipped_slots;
table.push(format!(
" {:<44} {:>15} {:>15} {:>15} {:>22.2}%",
leader,
leader_slots,
blocks_produced,
missed_slots,
*missed_slots as f64 / *leader_slots as f64 * 100.
skipped_slots,
*skipped_slots as f64 / *leader_slots as f64 * 100.
));
}
table.sort();
@ -551,8 +551,8 @@ pub fn process_show_block_production(
format!("Epoch {} total:", epoch),
total_slots,
total_blocks,
total_slots_missed,
total_slots_missed as f64 / total_slots as f64 * 100.
total_slots_skipped,
total_slots_skipped as f64 / total_slots as f64 * 100.
);
println!(
" (using data from {} slots: {} to {})",

View File

@ -58,8 +58,7 @@ pub const BATCH_FOUR_STAKER_INFOS: &[StakerInfo] = &[
},
StakerInfo {
name: "unbecoming silver",
// TODO: staker: "42yapY7Vrs5jqht9TCKsPoyb4vDFYcPfRkqAP85NSAQ", WrongSize
staker: "GS7RFm4nrxzYGcPTmu1otzHzZbURWDKuxo2L4AQDvTg2",
staker: "42yapY7Vrs5jqht9TCKZsPoyb4vDFYcPfRkqAP85NSAQ",
sol: 28_800.0,
},
StakerInfo {

View File

@ -560,7 +560,14 @@ fn main() {
)
.subcommand(
SubCommand::with_name("bounds")
.about("Print lowest and highest non-empty slots. Note: This ignores gaps in slots")
.about("Print lowest and highest non-empty slots. Note that there may be empty slots within the bounds")
.arg(
Arg::with_name("all")
.long("all")
.takes_value(false)
.required(false)
.help("Additionally print all the non-empty slots within the bounds"),
)
)
.subcommand(
SubCommand::with_name("json")
@ -845,30 +852,34 @@ fn main() {
}
});
}
("bounds", _) => match open_blocktree(&ledger_path).slot_meta_iterator(0) {
Ok(metas) => {
println!("Collecting Ledger information...");
let slots: Vec<_> = metas.map(|(slot, _)| slot).collect();
if slots.is_empty() {
println!("Ledger is empty. No slots found.");
} else {
let first = slots.first().unwrap();
let last = slots.last().unwrap_or_else(|| first);
if first != last {
println!(
"Ledger contains some data for slots {:?} to {:?}",
first, last
);
("bounds", Some(args_matches)) => {
match open_blocktree(&ledger_path).slot_meta_iterator(0) {
Ok(metas) => {
let all = args_matches.is_present("all");
println!("Collecting Ledger information...");
let slots: Vec<_> = metas.map(|(slot, _)| slot).collect();
if slots.is_empty() {
println!("Ledger is empty. No slots found.");
} else {
println!("Ledger only contains some data for slot {:?}", first);
let first = slots.first().unwrap();
let last = slots.last().unwrap_or_else(|| first);
if first != last {
println!("Ledger contains data from slots {:?} to {:?}", first, last);
if all {
println!("Non-empty slots: {:?}", slots);
}
} else {
println!("Ledger only contains some data for slot {:?}", first);
}
}
}
Err(err) => {
eprintln!("Unable to read the Ledger: {:?}", err);
exit(1);
}
}
Err(err) => {
eprintln!("Unable to read the Ledger: {:?}", err);
exit(1);
}
},
}
("analyze-storage", _) => match analyze_storage(&open_database(&ledger_path)) {
Ok(()) => {
println!("Ok.");

View File

@ -279,7 +279,7 @@ pub fn process_blocktree(
// Setup bank for slot 0
let bank0 = Arc::new(Bank::new_with_paths(&genesis_config, account_paths));
info!("processing ledger for bank 0...");
info!("processing ledger for slot 0...");
process_bank_0(&bank0, blocktree, &opts)?;
process_blocktree_from_root(genesis_config, blocktree, bank0, &opts)
}
@ -291,7 +291,7 @@ pub fn process_blocktree_from_root(
bank: Arc<Bank>,
opts: &ProcessOptions,
) -> result::Result<(BankForks, Vec<BankForksInfo>, LeaderScheduleCache), BlocktreeProcessorError> {
info!("processing ledger from root: {}...", bank.slot());
info!("processing ledger from root slot {}...", bank.slot());
// Starting slot must be a root, and thus has no parents
assert!(bank.parent().is_none());
let start_slot = bank.slot();
@ -304,7 +304,7 @@ pub fn process_blocktree_from_root(
blocktree
.set_roots(&[start_slot])
.expect("Couldn't set root on startup");
.expect("Couldn't set root slot on startup");
let meta = blocktree.meta(start_slot).unwrap();
@ -510,7 +510,7 @@ fn process_pending_slots(
let (slot, meta, bank, last_entry_hash) = pending_slots.pop().unwrap();
if last_status_report.elapsed() > Duration::from_secs(2) {
info!("processing ledger...block {}", slot);
info!("processing ledger...slot {}", slot);
last_status_report = Instant::now();
}

View File

@ -49,7 +49,7 @@ thiserror = "1.0"
ed25519-dalek = { version = "=1.0.0-pre.1", optional = true }
solana-crate-features = { path = "../crate-features", version = "0.22.0", optional = true }
solana-logger = { path = "../logger", version = "0.22.0", optional = true }
solana-sdk-macro = { path = "macro" }
solana-sdk-macro = { path = "macro", version = "0.22.0" }
[dev-dependencies]
tiny-bip39 = "0.6.2"