Fullnode now holds a BankForks instead of a Bank

This commit is contained in:
Michael Vines
2019-02-20 20:47:33 -08:00
parent 0dde79f42b
commit 59ee2b8892

View File

@ -100,7 +100,7 @@ pub struct Fullnode {
rpc_service: Option<JsonRpcService>, rpc_service: Option<JsonRpcService>,
rpc_pubsub_service: Option<PubSubService>, rpc_pubsub_service: Option<PubSubService>,
gossip_service: GossipService, gossip_service: GossipService,
bank: Arc<Bank>, bank_forks: BankForks,
sigverify_disabled: bool, sigverify_disabled: bool,
tpu_sockets: Vec<UdpSocket>, tpu_sockets: Vec<UdpSocket>,
broadcast_socket: UdpSocket, broadcast_socket: UdpSocket,
@ -283,7 +283,7 @@ impl Fullnode {
let mut fullnode = Self { let mut fullnode = Self {
id, id,
bank, bank_forks,
sigverify_disabled: config.sigverify_disabled, sigverify_disabled: config.sigverify_disabled,
gossip_service, gossip_service,
rpc_service: Some(rpc_service), rpc_service: Some(rpc_service),
@ -298,6 +298,7 @@ impl Fullnode {
}; };
fullnode.rotate( fullnode.rotate(
&bank,
scheduled_leader, scheduled_leader,
max_tick_height, max_tick_height,
blob_index, blob_index,
@ -307,9 +308,9 @@ impl Fullnode {
fullnode fullnode
} }
fn get_next_leader(&self, tick_height: u64) -> (Pubkey, u64) { fn get_next_leader(&self, bank: &Arc<Bank>, tick_height: u64) -> (Pubkey, u64) {
loop { loop {
let bank_tick_height = self.bank.tick_height(); let bank_tick_height = bank.tick_height();
if bank_tick_height >= tick_height { if bank_tick_height >= tick_height {
break; break;
} }
@ -329,7 +330,7 @@ impl Fullnode {
assert_eq!(leader_scheduler.num_ticks_left_in_slot(tick_height), 0); assert_eq!(leader_scheduler.num_ticks_left_in_slot(tick_height), 0);
let first_tick_of_next_slot = tick_height + 1; let first_tick_of_next_slot = tick_height + 1;
leader_scheduler.update_tick_height(first_tick_of_next_slot, &self.bank); leader_scheduler.update_tick_height(first_tick_of_next_slot, bank);
let slot = leader_scheduler.tick_height_to_slot(first_tick_of_next_slot); let slot = leader_scheduler.tick_height_to_slot(first_tick_of_next_slot);
( (
leader_scheduler.get_leader_for_slot(slot).unwrap(), leader_scheduler.get_leader_for_slot(slot).unwrap(),
@ -350,6 +351,7 @@ impl Fullnode {
fn rotate( fn rotate(
&mut self, &mut self,
bank: &Arc<Bank>,
next_leader: Pubkey, next_leader: Pubkey,
max_tick_height: u64, max_tick_height: u64,
blob_index: u64, blob_index: u64,
@ -368,7 +370,7 @@ impl Fullnode {
} }
None => FullnodeReturnType::LeaderToLeaderRotation, // value doesn't matter here... None => FullnodeReturnType::LeaderToLeaderRotation, // value doesn't matter here...
}; };
let tpu_bank = Arc::new(Bank::new_from_parent(&self.bank)); let tpu_bank = Arc::new(Bank::new_from_parent(bank));
self.node_services.tpu.switch_to_leader( self.node_services.tpu.switch_to_leader(
&tpu_bank, &tpu_bank,
PohServiceConfig::default(), PohServiceConfig::default(),
@ -420,9 +422,10 @@ impl Fullnode {
match self.rotation_receiver.recv_timeout(timeout) { match self.rotation_receiver.recv_timeout(timeout) {
Ok(tick_height) => { Ok(tick_height) => {
trace!("{:?}: rotate at tick_height={}", self.id, tick_height); trace!("{:?}: rotate at tick_height={}", self.id, tick_height);
let (next_leader, max_tick_height) = self.get_next_leader(tick_height); let bank = self.bank_forks.working_bank();
let (next_leader, max_tick_height) = self.get_next_leader(&bank, tick_height);
let transition = let transition =
self.rotate(next_leader, max_tick_height, 0, &self.bank.last_id()); self.rotate(&bank, next_leader, max_tick_height, 0, &bank.last_id());
debug!("role transition complete: {:?}", transition); debug!("role transition complete: {:?}", transition);
if let Some(ref rotation_notifier) = rotation_notifier { if let Some(ref rotation_notifier) = rotation_notifier {
rotation_notifier rotation_notifier