Add newly completed slots signal to Blocktree (#4225)

* Add channel to blocktree for communicating when slots are completed

* Refactor RepairService options into a RepairStrategy
This commit is contained in:
carllin
2019-05-09 14:10:04 -07:00
committed by GitHub
parent a031b09190
commit 575a0e318b
8 changed files with 289 additions and 71 deletions

View File

@ -7,7 +7,7 @@ use crate::cluster_info::ClusterInfo;
use crate::leader_schedule_cache::LeaderScheduleCache;
use crate::leader_schedule_utils::slot_leader_at;
use crate::packet::{Blob, SharedBlob, BLOB_HEADER_SIZE};
use crate::repair_service::{RepairService, RepairSlotRange};
use crate::repair_service::{RepairService, RepairStrategy};
use crate::result::{Error, Result};
use crate::service::Service;
use crate::streamer::{BlobReceiver, BlobSender};
@ -175,7 +175,6 @@ pub struct WindowService {
impl WindowService {
#[allow(clippy::too_many_arguments)]
pub fn new(
bank_forks: Option<Arc<RwLock<BankForks>>>,
leader_schedule_cache: Option<Arc<LeaderScheduleCache>>,
blocktree: Arc<Blocktree>,
cluster_info: Arc<RwLock<ClusterInfo>>,
@ -183,16 +182,21 @@ impl WindowService {
retransmit: BlobSender,
repair_socket: Arc<UdpSocket>,
exit: &Arc<AtomicBool>,
repair_slot_range: Option<RepairSlotRange>,
repair_strategy: RepairStrategy,
genesis_blockhash: &Hash,
) -> WindowService {
let bank_forks = match repair_strategy {
RepairStrategy::RepairRange(_) => None,
RepairStrategy::RepairAll { ref bank_forks, .. } => Some(bank_forks.clone()),
};
let repair_service = RepairService::new(
blocktree.clone(),
exit,
repair_socket,
cluster_info.clone(),
bank_forks.clone(),
repair_slot_range,
repair_strategy,
);
let exit = exit.clone();
let leader_schedule_cache = leader_schedule_cache.clone();
@ -207,6 +211,7 @@ impl WindowService {
if exit.load(Ordering::Relaxed) {
break;
}
if let Err(e) = recv_window(
bank_forks.as_ref(),
leader_schedule_cache.as_ref(),
@ -351,15 +356,18 @@ mod test {
let t_receiver = blob_receiver(Arc::new(leader_node.sockets.gossip), &exit, s_reader);
let (s_retransmit, r_retransmit) = channel();
let blocktree_path = get_tmp_ledger_path!();
let blocktree = Arc::new(
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
);
let (blocktree, _, completed_slots_receiver) = Blocktree::open_with_signal(&blocktree_path)
.expect("Expected to be able to open database ledger");
let blocktree = Arc::new(blocktree);
let bank = Bank::new(&create_genesis_block_with_leader(100, &me_id, 10).0);
let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank(&bank));
let bank_forks = Some(Arc::new(RwLock::new(BankForks::new(0, bank))));
let t_window = WindowService::new(
let bank_forks = Arc::new(RwLock::new(BankForks::new(0, bank)));
let repair_strategy = RepairStrategy::RepairAll {
bank_forks,
completed_slots_receiver,
};
let t_window = WindowService::new(
Some(leader_schedule_cache),
blocktree,
subs,
@ -367,7 +375,7 @@ mod test {
s_retransmit,
Arc::new(leader_node.sockets.repair),
&exit,
None,
repair_strategy,
&Hash::default(),
);
let t_responder = {
@ -430,14 +438,18 @@ mod test {
let t_receiver = blob_receiver(Arc::new(leader_node.sockets.gossip), &exit, s_reader);
let (s_retransmit, r_retransmit) = channel();
let blocktree_path = get_tmp_ledger_path!();
let blocktree = Arc::new(
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
);
let (blocktree, _, completed_slots_receiver) = Blocktree::open_with_signal(&blocktree_path)
.expect("Expected to be able to open database ledger");
let blocktree = Arc::new(blocktree);
let bank = Bank::new(&create_genesis_block_with_leader(100, &me_id, 10).0);
let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank(&bank));
let bank_forks = Some(Arc::new(RwLock::new(BankForks::new(0, bank))));
let t_window = WindowService::new(
let bank_forks = Arc::new(RwLock::new(BankForks::new(0, bank)));
let repair_strategy = RepairStrategy::RepairAll {
bank_forks,
completed_slots_receiver,
};
let t_window = WindowService::new(
Some(leader_schedule_cache),
blocktree,
subs.clone(),
@ -445,7 +457,7 @@ mod test {
s_retransmit,
Arc::new(leader_node.sockets.repair),
&exit,
None,
repair_strategy,
&Hash::default(),
);
let t_responder = {