Cleanup TVU code to look like its block diagram (#1737)
* Reorg TVU code to look like TVU diagram And move channel creation into LedgerWriteStage so that it can be used in the same was as all the other stages. * Delete commented out code
This commit is contained in:
		| @@ -8,7 +8,7 @@ use log::Level; | |||||||
| use result::{Error, Result}; | use result::{Error, Result}; | ||||||
| use service::Service; | use service::Service; | ||||||
| use std::sync::atomic::AtomicUsize; | use std::sync::atomic::AtomicUsize; | ||||||
| use std::sync::mpsc::RecvTimeoutError; | use std::sync::mpsc::{channel, RecvTimeoutError}; | ||||||
| use std::thread::{self, Builder, JoinHandle}; | use std::thread::{self, Builder, JoinHandle}; | ||||||
| use std::time::{Duration, Instant}; | use std::time::{Duration, Instant}; | ||||||
| use timing::duration_as_ms; | use timing::duration_as_ms; | ||||||
| @@ -21,7 +21,7 @@ impl LedgerWriteStage { | |||||||
|     pub fn write( |     pub fn write( | ||||||
|         ledger_writer: Option<&mut LedgerWriter>, |         ledger_writer: Option<&mut LedgerWriter>, | ||||||
|         entry_receiver: &EntryReceiver, |         entry_receiver: &EntryReceiver, | ||||||
|         forwarder: &Option<EntrySender>, |         entry_sender: &EntrySender, | ||||||
|     ) -> Result<()> { |     ) -> Result<()> { | ||||||
|         let mut ventries = Vec::new(); |         let mut ventries = Vec::new(); | ||||||
|         let mut received_entries = entry_receiver.recv_timeout(Duration::new(1, 0))?; |         let mut received_entries = entry_receiver.recv_timeout(Duration::new(1, 0))?; | ||||||
| @@ -44,10 +44,8 @@ impl LedgerWriteStage { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         inc_new_counter_info!("ledger_writer_stage-entries_received", num_new_entries); |         inc_new_counter_info!("ledger_writer_stage-entries_received", num_new_entries); | ||||||
|         if let Some(forwarder) = forwarder { |         for entries in ventries { | ||||||
|             for entries in ventries { |             entry_sender.send(entries)?; | ||||||
|                 forwarder.send(entries)?; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         inc_new_counter_info!( |         inc_new_counter_info!( | ||||||
|             "ledger_writer_stage-time_ms", |             "ledger_writer_stage-time_ms", | ||||||
| @@ -56,17 +54,15 @@ impl LedgerWriteStage { | |||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new( |     pub fn new(ledger_path: Option<&str>, entry_receiver: EntryReceiver) -> (Self, EntryReceiver) { | ||||||
|         ledger_path: Option<&str>, |  | ||||||
|         entry_receiver: EntryReceiver, |  | ||||||
|         forwarder: Option<EntrySender>, |  | ||||||
|     ) -> Self { |  | ||||||
|         let mut ledger_writer = ledger_path.map(|p| LedgerWriter::open(p, false).unwrap()); |         let mut ledger_writer = ledger_path.map(|p| LedgerWriter::open(p, false).unwrap()); | ||||||
|  |  | ||||||
|  |         let (entry_sender, entry_forwarder) = channel(); | ||||||
|         let write_thread = Builder::new() |         let write_thread = Builder::new() | ||||||
|             .name("solana-ledger-writer".to_string()) |             .name("solana-ledger-writer".to_string()) | ||||||
|             .spawn(move || loop { |             .spawn(move || loop { | ||||||
|                 if let Err(e) = Self::write(ledger_writer.as_mut(), &entry_receiver, &forwarder) { |                 if let Err(e) = Self::write(ledger_writer.as_mut(), &entry_receiver, &entry_sender) | ||||||
|  |                 { | ||||||
|                     match e { |                     match e { | ||||||
|                         Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => { |                         Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => { | ||||||
|                             break; |                             break; | ||||||
| @@ -83,7 +79,7 @@ impl LedgerWriteStage { | |||||||
|                 }; |                 }; | ||||||
|             }).unwrap(); |             }).unwrap(); | ||||||
|  |  | ||||||
|         LedgerWriteStage { write_thread } |         (LedgerWriteStage { write_thread }, entry_forwarder) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,7 +12,6 @@ use service::Service; | |||||||
| use sigverify_stage::SigVerifyStage; | use sigverify_stage::SigVerifyStage; | ||||||
| use std::net::UdpSocket; | use std::net::UdpSocket; | ||||||
| use std::sync::atomic::{AtomicBool, Ordering}; | use std::sync::atomic::{AtomicBool, Ordering}; | ||||||
| use std::sync::mpsc::channel; |  | ||||||
| use std::sync::mpsc::Receiver; | use std::sync::mpsc::Receiver; | ||||||
| use std::sync::Arc; | use std::sync::Arc; | ||||||
| use std::thread; | use std::thread; | ||||||
| @@ -54,9 +53,8 @@ impl Tpu { | |||||||
|             max_tick_height, |             max_tick_height, | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         let (ledger_entry_sender, entry_forwarder) = channel(); |         let (ledger_write_stage, entry_forwarder) = | ||||||
|         let ledger_write_stage = |             LedgerWriteStage::new(Some(ledger_path), entry_receiver); | ||||||
|             LedgerWriteStage::new(Some(ledger_path), entry_receiver, Some(ledger_entry_sender)); |  | ||||||
|  |  | ||||||
|         let tpu = Tpu { |         let tpu = Tpu { | ||||||
|             fetch_stage, |             fetch_stage, | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								src/tvu.rs
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								src/tvu.rs
									
									
									
									
									
								
							| @@ -21,7 +21,6 @@ use service::Service; | |||||||
| use signature::Keypair; | use signature::Keypair; | ||||||
| use std::net::UdpSocket; | use std::net::UdpSocket; | ||||||
| use std::sync::atomic::{AtomicBool, Ordering}; | use std::sync::atomic::{AtomicBool, Ordering}; | ||||||
| use std::sync::mpsc::channel; |  | ||||||
| use std::sync::{Arc, RwLock}; | use std::sync::{Arc, RwLock}; | ||||||
| use std::thread; | use std::thread; | ||||||
| use storage_stage::{StorageStage, StorageState}; | use storage_stage::{StorageStage, StorageState}; | ||||||
| @@ -90,19 +89,8 @@ impl Tvu { | |||||||
|             bank.leader_scheduler.clone(), |             bank.leader_scheduler.clone(), | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         let (storage_entry_sender, storage_entry_receiver) = channel(); |  | ||||||
|         let storage_state = StorageState::new(); |  | ||||||
|         let storage_stage = StorageStage::new( |  | ||||||
|             &storage_state, |  | ||||||
|             storage_entry_receiver, |  | ||||||
|             ledger_path, |  | ||||||
|             keypair.clone(), |  | ||||||
|             exit.clone(), |  | ||||||
|             entry_height, |  | ||||||
|         ); |  | ||||||
|  |  | ||||||
|         let (replicate_stage, ledger_entry_receiver) = ReplicateStage::new( |         let (replicate_stage, ledger_entry_receiver) = ReplicateStage::new( | ||||||
|             keypair, |             keypair.clone(), | ||||||
|             vote_account_keypair, |             vote_account_keypair, | ||||||
|             bank.clone(), |             bank.clone(), | ||||||
|             cluster_info, |             cluster_info, | ||||||
| @@ -111,10 +99,17 @@ impl Tvu { | |||||||
|             entry_height, |             entry_height, | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         let ledger_write_stage = LedgerWriteStage::new( |         let (ledger_write_stage, storage_entry_receiver) = | ||||||
|  |             LedgerWriteStage::new(ledger_path, ledger_entry_receiver); | ||||||
|  |  | ||||||
|  |         let storage_state = StorageState::new(); | ||||||
|  |         let storage_stage = StorageStage::new( | ||||||
|  |             &storage_state, | ||||||
|  |             storage_entry_receiver, | ||||||
|             ledger_path, |             ledger_path, | ||||||
|             ledger_entry_receiver, |             keypair, | ||||||
|             Some(storage_entry_sender), |             exit.clone(), | ||||||
|  |             entry_height, | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         Tvu { |         Tvu { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user