Add max retransmit and shred insert slot (#15475) (#15498)

(cherry picked from commit 1b59b163dd)

Co-authored-by: sakridge <sakridge@gmail.com>
This commit is contained in:
mergify[bot]
2021-02-23 22:57:45 +00:00
committed by GitHub
parent e255c85bef
commit b231fb2c18
10 changed files with 146 additions and 1 deletions

View File

@ -6,6 +6,7 @@ extern crate test;
use log::*; use log::*;
use solana_core::cluster_info::{ClusterInfo, Node}; use solana_core::cluster_info::{ClusterInfo, Node};
use solana_core::contact_info::ContactInfo; use solana_core::contact_info::ContactInfo;
use solana_core::max_slots::MaxSlots;
use solana_core::retransmit_stage::retransmitter; use solana_core::retransmit_stage::retransmitter;
use solana_ledger::entry::Entry; use solana_ledger::entry::Entry;
use solana_ledger::genesis_utils::{create_genesis_config, GenesisConfigInfo}; use solana_ledger::genesis_utils::{create_genesis_config, GenesisConfigInfo};
@ -92,6 +93,7 @@ fn bench_retransmitter(bencher: &mut Bencher) {
&leader_schedule_cache, &leader_schedule_cache,
cluster_info, cluster_info,
packet_receiver, packet_receiver,
&Arc::new(MaxSlots::default()),
); );
let mut index = 0; let mut index = 0;

View File

@ -1,4 +1,4 @@
use crate::rpc_subscriptions::RpcSubscriptions; use crate::{max_slots::MaxSlots, rpc_subscriptions::RpcSubscriptions};
use crossbeam_channel::{Receiver, RecvTimeoutError, Sender}; use crossbeam_channel::{Receiver, RecvTimeoutError, Sender};
use solana_ledger::blockstore::{Blockstore, CompletedDataSetInfo}; use solana_ledger::blockstore::{Blockstore, CompletedDataSetInfo};
use solana_ledger::entry::Entry; use solana_ledger::entry::Entry;
@ -25,6 +25,7 @@ impl CompletedDataSetsService {
blockstore: Arc<Blockstore>, blockstore: Arc<Blockstore>,
rpc_subscriptions: Arc<RpcSubscriptions>, rpc_subscriptions: Arc<RpcSubscriptions>,
exit: &Arc<AtomicBool>, exit: &Arc<AtomicBool>,
max_slots: Arc<MaxSlots>,
) -> Self { ) -> Self {
let exit = exit.clone(); let exit = exit.clone();
let thread_hdl = Builder::new() let thread_hdl = Builder::new()
@ -37,6 +38,7 @@ impl CompletedDataSetsService {
&completed_sets_receiver, &completed_sets_receiver,
&blockstore, &blockstore,
&rpc_subscriptions, &rpc_subscriptions,
&max_slots,
) { ) {
break; break;
} }
@ -49,8 +51,10 @@ impl CompletedDataSetsService {
completed_sets_receiver: &CompletedDataSetsReceiver, completed_sets_receiver: &CompletedDataSetsReceiver,
blockstore: &Blockstore, blockstore: &Blockstore,
rpc_subscriptions: &RpcSubscriptions, rpc_subscriptions: &RpcSubscriptions,
max_slots: &Arc<MaxSlots>,
) -> Result<(), RecvTimeoutError> { ) -> Result<(), RecvTimeoutError> {
let completed_data_sets = completed_sets_receiver.recv_timeout(Duration::from_secs(1))?; let completed_data_sets = completed_sets_receiver.recv_timeout(Duration::from_secs(1))?;
let mut max_slot = 0;
for completed_set_info in std::iter::once(completed_data_sets) for completed_set_info in std::iter::once(completed_data_sets)
.chain(completed_sets_receiver.try_iter()) .chain(completed_sets_receiver.try_iter())
.flatten() .flatten()
@ -60,6 +64,7 @@ impl CompletedDataSetsService {
start_index, start_index,
end_index, end_index,
} = completed_set_info; } = completed_set_info;
max_slot = max_slot.max(slot);
match blockstore.get_entries_in_data_block(slot, start_index, end_index, None) { match blockstore.get_entries_in_data_block(slot, start_index, end_index, None) {
Ok(entries) => { Ok(entries) => {
let transactions = Self::get_transaction_signatures(entries); let transactions = Self::get_transaction_signatures(entries);
@ -70,6 +75,9 @@ impl CompletedDataSetsService {
Err(e) => warn!("completed-data-set-service deserialize error: {:?}", e), Err(e) => warn!("completed-data-set-service deserialize error: {:?}", e),
} }
} }
max_slots
.shred_insert
.fetch_max(max_slot, Ordering::Relaxed);
Ok(()) Ok(())
} }

View File

@ -16,6 +16,7 @@ pub mod cluster_info_vote_listener;
pub mod commitment_service; pub mod commitment_service;
pub mod completed_data_sets_service; pub mod completed_data_sets_service;
mod deprecated; mod deprecated;
pub mod max_slots;
pub mod sample_performance_service; pub mod sample_performance_service;
pub mod shred_fetch_stage; pub mod shred_fetch_stage;
#[macro_use] #[macro_use]

7
core/src/max_slots.rs Normal file
View File

@ -0,0 +1,7 @@
use std::sync::atomic::AtomicU64;
#[derive(Default)]
pub struct MaxSlots {
pub retransmit: AtomicU64,
pub shred_insert: AtomicU64,
}

View File

@ -8,6 +8,7 @@ use crate::{
cluster_slots_service::ClusterSlotsService, cluster_slots_service::ClusterSlotsService,
completed_data_sets_service::CompletedDataSetsSender, completed_data_sets_service::CompletedDataSetsSender,
contact_info::ContactInfo, contact_info::ContactInfo,
max_slots::MaxSlots,
repair_service::DuplicateSlotsResetSender, repair_service::DuplicateSlotsResetSender,
repair_service::RepairInfo, repair_service::RepairInfo,
result::{Error, Result}, result::{Error, Result},
@ -264,6 +265,7 @@ fn retransmit(
epoch_stakes_cache: &RwLock<EpochStakesCache>, epoch_stakes_cache: &RwLock<EpochStakesCache>,
last_peer_update: &AtomicU64, last_peer_update: &AtomicU64,
shreds_received: &Mutex<ShredFilterAndHasher>, shreds_received: &Mutex<ShredFilterAndHasher>,
max_slots: &MaxSlots,
) -> Result<()> { ) -> Result<()> {
let timer = Duration::new(1, 0); let timer = Duration::new(1, 0);
let r_lock = r.lock().unwrap(); let r_lock = r.lock().unwrap();
@ -320,6 +322,7 @@ fn retransmit(
let mut compute_turbine_peers_total = 0; let mut compute_turbine_peers_total = 0;
let mut packets_by_slot: HashMap<Slot, usize> = HashMap::new(); let mut packets_by_slot: HashMap<Slot, usize> = HashMap::new();
let mut packets_by_source: HashMap<String, usize> = HashMap::new(); let mut packets_by_source: HashMap<String, usize> = HashMap::new();
let mut max_slot = 0;
for mut packets in packet_v { for mut packets in packet_v {
for packet in packets.packets.iter_mut() { for packet in packets.packets.iter_mut() {
// skip discarded packets and repair packets // skip discarded packets and repair packets
@ -337,6 +340,7 @@ fn retransmit(
Some(slot) => slot, Some(slot) => slot,
None => continue, None => continue,
}; };
max_slot = max_slot.max(shred_slot);
let mut compute_turbine_peers = Measure::start("turbine_start"); let mut compute_turbine_peers = Measure::start("turbine_start");
let (my_index, mut shuffled_stakes_and_index) = ClusterInfo::shuffle_peers_and_index( let (my_index, mut shuffled_stakes_and_index) = ClusterInfo::shuffle_peers_and_index(
&my_id, &my_id,
@ -393,6 +397,7 @@ fn retransmit(
retransmit_total += retransmit_time.as_us(); retransmit_total += retransmit_time.as_us();
} }
} }
max_slots.retransmit.fetch_max(max_slot, Ordering::Relaxed);
timer_start.stop(); timer_start.stop();
debug!( debug!(
"retransmitted {} packets in {}ms retransmit_time: {}ms id: {}", "retransmitted {} packets in {}ms retransmit_time: {}ms id: {}",
@ -433,6 +438,7 @@ pub fn retransmitter(
leader_schedule_cache: &Arc<LeaderScheduleCache>, leader_schedule_cache: &Arc<LeaderScheduleCache>,
cluster_info: Arc<ClusterInfo>, cluster_info: Arc<ClusterInfo>,
r: Arc<Mutex<PacketReceiver>>, r: Arc<Mutex<PacketReceiver>>,
max_slots: &Arc<MaxSlots>,
) -> Vec<JoinHandle<()>> { ) -> Vec<JoinHandle<()>> {
let stats = Arc::new(RetransmitStats::default()); let stats = Arc::new(RetransmitStats::default());
let shreds_received = Arc::new(Mutex::new(( let shreds_received = Arc::new(Mutex::new((
@ -450,6 +456,7 @@ pub fn retransmitter(
let epoch_stakes_cache = Arc::new(RwLock::new(EpochStakesCache::default())); let epoch_stakes_cache = Arc::new(RwLock::new(EpochStakesCache::default()));
let last_peer_update = Arc::new(AtomicU64::new(0)); let last_peer_update = Arc::new(AtomicU64::new(0));
let shreds_received = shreds_received.clone(); let shreds_received = shreds_received.clone();
let max_slots = max_slots.clone();
Builder::new() Builder::new()
.name("solana-retransmitter".to_string()) .name("solana-retransmitter".to_string())
@ -467,6 +474,7 @@ pub fn retransmitter(
&epoch_stakes_cache, &epoch_stakes_cache,
&last_peer_update, &last_peer_update,
&shreds_received, &shreds_received,
&max_slots,
) { ) {
match e { match e {
Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => break, Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => break,
@ -511,6 +519,7 @@ impl RetransmitStage {
verified_vote_receiver: VerifiedVoteReceiver, verified_vote_receiver: VerifiedVoteReceiver,
repair_validators: Option<HashSet<Pubkey>>, repair_validators: Option<HashSet<Pubkey>>,
completed_data_sets_sender: CompletedDataSetsSender, completed_data_sets_sender: CompletedDataSetsSender,
max_slots: &Arc<MaxSlots>,
) -> Self { ) -> Self {
let (retransmit_sender, retransmit_receiver) = channel(); let (retransmit_sender, retransmit_receiver) = channel();
@ -521,6 +530,7 @@ impl RetransmitStage {
leader_schedule_cache, leader_schedule_cache,
cluster_info.clone(), cluster_info.clone(),
retransmit_receiver, retransmit_receiver,
max_slots,
); );
let leader_schedule_cache_clone = leader_schedule_cache.clone(); let leader_schedule_cache_clone = leader_schedule_cache.clone();
@ -638,6 +648,7 @@ mod tests {
&leader_schedule_cache, &leader_schedule_cache,
cluster_info, cluster_info,
Arc::new(Mutex::new(retransmit_receiver)), Arc::new(Mutex::new(retransmit_receiver)),
&Arc::new(MaxSlots::default()),
); );
let _thread_hdls = vec![t_retransmit]; let _thread_hdls = vec![t_retransmit];

View File

@ -3,6 +3,7 @@
use crate::{ use crate::{
cluster_info::ClusterInfo, cluster_info::ClusterInfo,
contact_info::ContactInfo, contact_info::ContactInfo,
max_slots::MaxSlots,
non_circulating_supply::calculate_non_circulating_supply, non_circulating_supply::calculate_non_circulating_supply,
optimistically_confirmed_bank_tracker::OptimisticallyConfirmedBank, optimistically_confirmed_bank_tracker::OptimisticallyConfirmedBank,
rpc_health::*, rpc_health::*,
@ -138,6 +139,7 @@ pub struct JsonRpcRequestProcessor {
bigtable_ledger_storage: Option<solana_storage_bigtable::LedgerStorage>, bigtable_ledger_storage: Option<solana_storage_bigtable::LedgerStorage>,
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>, optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
largest_accounts_cache: Arc<RwLock<LargestAccountsCache>>, largest_accounts_cache: Arc<RwLock<LargestAccountsCache>>,
max_slots: Arc<MaxSlots>,
} }
impl Metadata for JsonRpcRequestProcessor {} impl Metadata for JsonRpcRequestProcessor {}
@ -221,6 +223,7 @@ impl JsonRpcRequestProcessor {
bigtable_ledger_storage: Option<solana_storage_bigtable::LedgerStorage>, bigtable_ledger_storage: Option<solana_storage_bigtable::LedgerStorage>,
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>, optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
largest_accounts_cache: Arc<RwLock<LargestAccountsCache>>, largest_accounts_cache: Arc<RwLock<LargestAccountsCache>>,
max_slots: Arc<MaxSlots>,
) -> (Self, Receiver<TransactionInfo>) { ) -> (Self, Receiver<TransactionInfo>) {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
( (
@ -239,6 +242,7 @@ impl JsonRpcRequestProcessor {
bigtable_ledger_storage, bigtable_ledger_storage,
optimistically_confirmed_bank, optimistically_confirmed_bank,
largest_accounts_cache, largest_accounts_cache,
max_slots,
}, },
receiver, receiver,
) )
@ -279,6 +283,7 @@ impl JsonRpcRequestProcessor {
bank: bank.clone(), bank: bank.clone(),
})), })),
largest_accounts_cache: Arc::new(RwLock::new(LargestAccountsCache::new(30))), largest_accounts_cache: Arc::new(RwLock::new(LargestAccountsCache::new(30))),
max_slots: Arc::new(MaxSlots::default()),
} }
} }
@ -485,6 +490,14 @@ impl JsonRpcRequestProcessor {
self.bank(commitment).slot() self.bank(commitment).slot()
} }
fn get_max_retransmit_slot(&self) -> Slot {
self.max_slots.retransmit.load(Ordering::Relaxed)
}
fn get_max_shred_insert_slot(&self) -> Slot {
self.max_slots.shred_insert.load(Ordering::Relaxed)
}
fn get_slot_leader(&self, commitment: Option<CommitmentConfig>) -> String { fn get_slot_leader(&self, commitment: Option<CommitmentConfig>) -> String {
self.bank(commitment).collector_id().to_string() self.bank(commitment).collector_id().to_string()
} }
@ -1915,6 +1928,12 @@ pub trait RpcSol {
#[rpc(meta, name = "getSlot")] #[rpc(meta, name = "getSlot")]
fn get_slot(&self, meta: Self::Metadata, commitment: Option<CommitmentConfig>) -> Result<Slot>; fn get_slot(&self, meta: Self::Metadata, commitment: Option<CommitmentConfig>) -> Result<Slot>;
#[rpc(meta, name = "getMaxRetransmitSlot")]
fn get_max_retransmit_slot(&self, meta: Self::Metadata) -> Result<Slot>;
#[rpc(meta, name = "getMaxShredInsertSlot")]
fn get_max_shred_insert_slot(&self, meta: Self::Metadata) -> Result<Slot>;
#[rpc(meta, name = "getTransactionCount")] #[rpc(meta, name = "getTransactionCount")]
fn get_transaction_count( fn get_transaction_count(
&self, &self,
@ -2505,6 +2524,16 @@ impl RpcSol for RpcSolImpl {
Ok(meta.get_slot(commitment)) Ok(meta.get_slot(commitment))
} }
fn get_max_retransmit_slot(&self, meta: Self::Metadata) -> Result<Slot> {
debug!("get_max_retransmit_slot rpc request received");
Ok(meta.get_max_retransmit_slot())
}
fn get_max_shred_insert_slot(&self, meta: Self::Metadata) -> Result<Slot> {
debug!("get_max_shred_insert_slot rpc request received");
Ok(meta.get_max_shred_insert_slot())
}
fn get_transaction_count( fn get_transaction_count(
&self, &self,
meta: Self::Metadata, meta: Self::Metadata,
@ -3208,6 +3237,10 @@ pub mod tests {
.write_perf_sample(0, &sample1) .write_perf_sample(0, &sample1)
.expect("write to blockstore"); .expect("write to blockstore");
let max_slots = Arc::new(MaxSlots::default());
max_slots.retransmit.store(42, Ordering::Relaxed);
max_slots.shred_insert.store(43, Ordering::Relaxed);
let (meta, receiver) = JsonRpcRequestProcessor::new( let (meta, receiver) = JsonRpcRequestProcessor::new(
JsonRpcConfig { JsonRpcConfig {
enable_rpc_transaction_history: true, enable_rpc_transaction_history: true,
@ -3226,6 +3259,7 @@ pub mod tests {
None, None,
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks),
Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(RwLock::new(LargestAccountsCache::new(30))),
max_slots,
); );
SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1); SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1);
@ -4628,6 +4662,7 @@ pub mod tests {
None, None,
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks),
Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(RwLock::new(LargestAccountsCache::new(30))),
Arc::new(MaxSlots::default()),
); );
SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1); SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1);
@ -4825,6 +4860,7 @@ pub mod tests {
None, None,
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks),
Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(RwLock::new(LargestAccountsCache::new(30))),
Arc::new(MaxSlots::default()),
); );
SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1); SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1);
assert_eq!(request_processor.validator_exit(), false); assert_eq!(request_processor.validator_exit(), false);
@ -4859,6 +4895,7 @@ pub mod tests {
None, None,
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks),
Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(RwLock::new(LargestAccountsCache::new(30))),
Arc::new(MaxSlots::default()),
); );
SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1); SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1);
assert_eq!(request_processor.validator_exit(), true); assert_eq!(request_processor.validator_exit(), true);
@ -4886,6 +4923,24 @@ pub mod tests {
assert_eq!(expected, result); assert_eq!(expected, result);
} }
fn test_basic_slot(method: &str, expected: Slot) {
let bob_pubkey = solana_sdk::pubkey::new_rand();
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!("{{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"{}\"}}", method);
let res = io.handle_request_sync(&req, meta);
let json: Value = serde_json::from_str(&res.unwrap()).unwrap();
let slot: Slot = serde_json::from_value(json["result"].clone()).unwrap();
assert_eq!(slot, expected);
}
#[test]
fn test_rpc_get_max_slots() {
test_basic_slot("getMaxRetransmitSlot", 42);
test_basic_slot("getMaxShredInsertSlot", 43);
}
#[test] #[test]
fn test_rpc_get_version() { fn test_rpc_get_version() {
let bob_pubkey = solana_sdk::pubkey::new_rand(); let bob_pubkey = solana_sdk::pubkey::new_rand();
@ -4952,6 +5007,7 @@ pub mod tests {
None, None,
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks), OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks),
Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(RwLock::new(LargestAccountsCache::new(30))),
Arc::new(MaxSlots::default()),
); );
SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1); SendTransactionService::new(tpu_address, &bank_forks, None, receiver, 1000, 1);
assert_eq!( assert_eq!(
@ -6182,6 +6238,7 @@ pub mod tests {
None, None,
optimistically_confirmed_bank.clone(), optimistically_confirmed_bank.clone(),
Arc::new(RwLock::new(LargestAccountsCache::new(30))), Arc::new(RwLock::new(LargestAccountsCache::new(30))),
Arc::new(MaxSlots::default()),
); );
let mut io = MetaIoHandler::default(); let mut io = MetaIoHandler::default();

View File

@ -3,6 +3,7 @@
use crate::{ use crate::{
bigtable_upload_service::BigTableUploadService, bigtable_upload_service::BigTableUploadService,
cluster_info::ClusterInfo, cluster_info::ClusterInfo,
max_slots::MaxSlots,
optimistically_confirmed_bank_tracker::OptimisticallyConfirmedBank, optimistically_confirmed_bank_tracker::OptimisticallyConfirmedBank,
poh_recorder::PohRecorder, poh_recorder::PohRecorder,
rpc::*, rpc::*,
@ -273,6 +274,7 @@ impl JsonRpcService {
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>, optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
send_transaction_retry_ms: u64, send_transaction_retry_ms: u64,
send_transaction_leader_forward_count: u64, send_transaction_leader_forward_count: u64,
max_slots: Arc<MaxSlots>,
) -> Self { ) -> Self {
info!("rpc bound to {:?}", rpc_addr); info!("rpc bound to {:?}", rpc_addr);
info!("rpc configuration: {:?}", config); info!("rpc configuration: {:?}", config);
@ -349,6 +351,7 @@ impl JsonRpcService {
bigtable_ledger_storage, bigtable_ledger_storage,
optimistically_confirmed_bank, optimistically_confirmed_bank,
largest_accounts_cache, largest_accounts_cache,
max_slots,
); );
let leader_info = let leader_info =
@ -508,6 +511,7 @@ mod tests {
optimistically_confirmed_bank, optimistically_confirmed_bank,
1000, 1000,
1, 1,
Arc::new(MaxSlots::default()),
); );
let thread = rpc_service.thread_hdl.thread(); let thread = rpc_service.thread_hdl.thread();
assert_eq!(thread.name().unwrap(), "solana-jsonrpc"); assert_eq!(thread.name().unwrap(), "solana-jsonrpc");

View File

@ -11,6 +11,7 @@ use crate::{
completed_data_sets_service::CompletedDataSetsSender, completed_data_sets_service::CompletedDataSetsSender,
consensus::Tower, consensus::Tower,
ledger_cleanup_service::LedgerCleanupService, ledger_cleanup_service::LedgerCleanupService,
max_slots::MaxSlots,
optimistically_confirmed_bank_tracker::BankNotificationSender, optimistically_confirmed_bank_tracker::BankNotificationSender,
poh_recorder::PohRecorder, poh_recorder::PohRecorder,
replay_stage::{ReplayStage, ReplayStageConfig}, replay_stage::{ReplayStage, ReplayStageConfig},
@ -120,6 +121,7 @@ impl Tvu {
completed_data_sets_sender: CompletedDataSetsSender, completed_data_sets_sender: CompletedDataSetsSender,
bank_notification_sender: Option<BankNotificationSender>, bank_notification_sender: Option<BankNotificationSender>,
tvu_config: TvuConfig, tvu_config: TvuConfig,
max_slots: &Arc<MaxSlots>,
) -> Self { ) -> Self {
let keypair: Arc<Keypair> = cluster_info.keypair.clone(); let keypair: Arc<Keypair> = cluster_info.keypair.clone();
@ -174,6 +176,7 @@ impl Tvu {
verified_vote_receiver, verified_vote_receiver,
tvu_config.repair_validators, tvu_config.repair_validators,
completed_data_sets_sender, completed_data_sets_sender,
max_slots,
); );
let (ledger_cleanup_slot_sender, ledger_cleanup_slot_receiver) = channel(); let (ledger_cleanup_slot_sender, ledger_cleanup_slot_receiver) = channel();
@ -407,6 +410,7 @@ pub mod tests {
completed_data_sets_sender, completed_data_sets_sender,
None, None,
TvuConfig::default(), TvuConfig::default(),
&Arc::new(MaxSlots::default()),
); );
exit.store(true, Ordering::Relaxed); exit.store(true, Ordering::Relaxed);
tvu.join().unwrap(); tvu.join().unwrap();

View File

@ -12,6 +12,7 @@ use crate::{
consensus::{reconcile_blockstore_roots_with_tower, Tower}, consensus::{reconcile_blockstore_roots_with_tower, Tower},
contact_info::ContactInfo, contact_info::ContactInfo,
gossip_service::GossipService, gossip_service::GossipService,
max_slots::MaxSlots,
optimistically_confirmed_bank_tracker::{ optimistically_confirmed_bank_tracker::{
OptimisticallyConfirmedBank, OptimisticallyConfirmedBankTracker, OptimisticallyConfirmedBank, OptimisticallyConfirmedBankTracker,
}, },
@ -414,6 +415,7 @@ impl Validator {
config.pubsub_config.enable_vote_subscription, config.pubsub_config.enable_vote_subscription,
)); ));
let max_slots = Arc::new(MaxSlots::default());
let (completed_data_sets_sender, completed_data_sets_receiver) = let (completed_data_sets_sender, completed_data_sets_receiver) =
bounded(MAX_COMPLETED_DATA_SETS_IN_CHANNEL); bounded(MAX_COMPLETED_DATA_SETS_IN_CHANNEL);
let completed_data_sets_service = CompletedDataSetsService::new( let completed_data_sets_service = CompletedDataSetsService::new(
@ -421,6 +423,7 @@ impl Validator {
blockstore.clone(), blockstore.clone(),
subscriptions.clone(), subscriptions.clone(),
&exit, &exit,
max_slots.clone(),
); );
info!( info!(
@ -485,6 +488,7 @@ impl Validator {
optimistically_confirmed_bank.clone(), optimistically_confirmed_bank.clone(),
config.send_transaction_retry_ms, config.send_transaction_retry_ms,
config.send_transaction_leader_forward_count, config.send_transaction_leader_forward_count,
max_slots.clone(),
), ),
pubsub_service: PubSubService::new( pubsub_service: PubSubService::new(
config.pubsub_config.clone(), config.pubsub_config.clone(),
@ -654,6 +658,7 @@ impl Validator {
rocksdb_compaction_interval: config.rocksdb_compaction_interval, rocksdb_compaction_interval: config.rocksdb_compaction_interval,
rocksdb_max_compaction_jitter: config.rocksdb_compaction_interval, rocksdb_max_compaction_jitter: config.rocksdb_compaction_interval,
}, },
&max_slots,
); );
let tpu = Tpu::new( let tpu = Tpu::new(

View File

@ -42,6 +42,8 @@ gives a convenient interface for the RPC methods.
- [getInflationRate](jsonrpc-api.md#getinflationrate) - [getInflationRate](jsonrpc-api.md#getinflationrate)
- [getLargestAccounts](jsonrpc-api.md#getlargestaccounts) - [getLargestAccounts](jsonrpc-api.md#getlargestaccounts)
- [getLeaderSchedule](jsonrpc-api.md#getleaderschedule) - [getLeaderSchedule](jsonrpc-api.md#getleaderschedule)
- [getMaxRetransmitSlot](jsonrpc-api.md#getmaxretransmitslot)
- [getMaxShredInsertSlot](jsonrpc-api.md#getmaxshredinsertslot)
- [getMinimumBalanceForRentExemption](jsonrpc-api.md#getminimumbalanceforrentexemption) - [getMinimumBalanceForRentExemption](jsonrpc-api.md#getminimumbalanceforrentexemption)
- [getMultipleAccounts](jsonrpc-api.md#getmultipleaccounts) - [getMultipleAccounts](jsonrpc-api.md#getmultipleaccounts)
- [getProgramAccounts](jsonrpc-api.md#getprogramaccounts) - [getProgramAccounts](jsonrpc-api.md#getprogramaccounts)
@ -1612,6 +1614,50 @@ Result:
} }
``` ```
### getMaxRetransmitSlot
Get the max slot seen from retransmit stage.
#### Results:
- `<u64>` - Slot
#### Example:
Request:
```bash
curl http://localhost:8899 -X POST -H "Content-Type: application/json" -d '
{"jsonrpc":"2.0","id":1, "method":"getMaxRetransmitSlot"}
'
```
Result:
```json
{"jsonrpc":"2.0","result":1234,"id":1}
```
### getMaxShredInsertSlot
Get the max slot seen from after shred insert.
#### Results:
- `<u64>` - Slot
#### Example:
Request:
```bash
curl http://localhost:8899 -X POST -H "Content-Type: application/json" -d '
{"jsonrpc":"2.0","id":1, "method":"getMaxShredInsertSlot"}
'
```
Result:
```json
{"jsonrpc":"2.0","result":1234,"id":1}
```
### getMinimumBalanceForRentExemption ### getMinimumBalanceForRentExemption
Returns minimum balance required to make account rent exempt. Returns minimum balance required to make account rent exempt.