Fetch confirmed blocks from BigTable if all epoch data is not in the local ledger
This commit is contained in:
@ -97,7 +97,6 @@ fn get_config() -> Config {
|
|||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.validator(is_url)
|
.validator(is_url)
|
||||||
.help("JSON RPC URL for the cluster")
|
.help("JSON RPC URL for the cluster")
|
||||||
.conflicts_with("cluster")
|
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("cluster")
|
Arg::with_name("cluster")
|
||||||
@ -205,11 +204,13 @@ fn get_config() -> Config {
|
|||||||
|
|
||||||
let (json_rpc_url, validator_list) = match cluster.as_str() {
|
let (json_rpc_url, validator_list) = match cluster.as_str() {
|
||||||
"mainnet-beta" => (
|
"mainnet-beta" => (
|
||||||
"http://api.mainnet-beta.solana.com".into(),
|
value_t!(matches, "json_rpc_url", String)
|
||||||
|
.unwrap_or_else(|_| "http://api.mainnet-beta.solana.com".into()),
|
||||||
validator_list::mainnet_beta_validators(),
|
validator_list::mainnet_beta_validators(),
|
||||||
),
|
),
|
||||||
"testnet" => (
|
"testnet" => (
|
||||||
"http://testnet.solana.com".into(),
|
value_t!(matches, "json_rpc_url", String)
|
||||||
|
.unwrap_or_else(|_| "http://testnet.solana.com".into()),
|
||||||
validator_list::testnet_validators(),
|
validator_list::testnet_validators(),
|
||||||
),
|
),
|
||||||
"unknown" => {
|
"unknown" => {
|
||||||
@ -304,23 +305,51 @@ fn classify_block_producers(
|
|||||||
let first_slot_in_epoch = epoch_schedule.get_first_slot_in_epoch(epoch);
|
let first_slot_in_epoch = epoch_schedule.get_first_slot_in_epoch(epoch);
|
||||||
let last_slot_in_epoch = epoch_schedule.get_last_slot_in_epoch(epoch);
|
let last_slot_in_epoch = epoch_schedule.get_last_slot_in_epoch(epoch);
|
||||||
|
|
||||||
|
let first_available_block = rpc_client.get_first_available_block()?;
|
||||||
let minimum_ledger_slot = rpc_client.minimum_ledger_slot()?;
|
let minimum_ledger_slot = rpc_client.minimum_ledger_slot()?;
|
||||||
if minimum_ledger_slot >= last_slot_in_epoch {
|
debug!(
|
||||||
|
"first_available_block: {}, minimum_ledger_slot: {}",
|
||||||
|
first_available_block, minimum_ledger_slot
|
||||||
|
);
|
||||||
|
|
||||||
|
if first_available_block >= last_slot_in_epoch {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
"Minimum ledger slot is newer than the last epoch: {} > {}",
|
"First available block is newer than the last epoch: {} > {}",
|
||||||
minimum_ledger_slot, last_slot_in_epoch
|
first_available_block, last_slot_in_epoch
|
||||||
)
|
)
|
||||||
.into());
|
.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let first_slot = if minimum_ledger_slot > first_slot_in_epoch {
|
let mut first_slot = if first_available_block > first_slot_in_epoch {
|
||||||
minimum_ledger_slot
|
first_available_block
|
||||||
} else {
|
} else {
|
||||||
first_slot_in_epoch
|
first_slot_in_epoch
|
||||||
};
|
};
|
||||||
|
|
||||||
let confirmed_blocks = rpc_client.get_confirmed_blocks(first_slot, Some(last_slot_in_epoch))?;
|
let mut confirmed_blocks = vec![];
|
||||||
let confirmed_blocks: HashSet<Slot> = confirmed_blocks.into_iter().collect();
|
// Fetching a large number of blocks from BigTable can cause timeouts, break up the requests
|
||||||
|
const LONGTERM_STORAGE_STEP: u64 = 5_000;
|
||||||
|
while first_slot <= last_slot_in_epoch {
|
||||||
|
let last_slot = if first_slot >= minimum_ledger_slot {
|
||||||
|
last_slot_in_epoch
|
||||||
|
} else {
|
||||||
|
last_slot_in_epoch.min(first_slot + LONGTERM_STORAGE_STEP)
|
||||||
|
};
|
||||||
|
let slots_remaining = last_slot_in_epoch - last_slot;
|
||||||
|
info!(
|
||||||
|
"Fetching confirmed blocks between {} - {}{}",
|
||||||
|
first_slot,
|
||||||
|
last_slot,
|
||||||
|
if slots_remaining > 0 {
|
||||||
|
format!(" ({} remaining)", slots_remaining)
|
||||||
|
} else {
|
||||||
|
"".to_string()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
confirmed_blocks.push(rpc_client.get_confirmed_blocks(first_slot, Some(last_slot))?);
|
||||||
|
first_slot += LONGTERM_STORAGE_STEP;
|
||||||
|
}
|
||||||
|
let confirmed_blocks: HashSet<Slot> = confirmed_blocks.into_iter().flatten().collect();
|
||||||
|
|
||||||
let mut poor_block_producers = HashSet::new();
|
let mut poor_block_producers = HashSet::new();
|
||||||
let mut quality_block_producers = HashSet::new();
|
let mut quality_block_producers = HashSet::new();
|
||||||
|
Reference in New Issue
Block a user