solana/src/replicate_stage.rs

55 lines
1.6 KiB
Rust
Raw Normal View History

2018-05-22 14:26:28 -07:00
//! The `replicate_stage` replicates transactions broadcast by the leader.
2018-05-22 15:30:46 -07:00
use bank::Bank;
use ledger;
use result::Result;
use service::Service;
2018-05-22 15:18:07 -07:00
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::thread::{self, Builder, JoinHandle};
2018-05-22 15:30:46 -07:00
use std::time::Duration;
2018-06-27 11:33:56 -07:00
use streamer::BlobReceiver;
2018-05-22 14:26:28 -07:00
pub struct ReplicateStage {
thread_hdl: JoinHandle<()>,
2018-05-22 14:26:28 -07:00
}
impl ReplicateStage {
2018-06-15 14:27:06 -07:00
/// Process entry blobs, already in order
fn replicate_requests(bank: &Arc<Bank>, blob_receiver: &BlobReceiver) -> Result<()> {
2018-05-22 15:30:46 -07:00
let timer = Duration::new(1, 0);
2018-06-15 14:27:06 -07:00
let blobs = blob_receiver.recv_timeout(timer)?;
let blobs_len = blobs.len();
let entries = ledger::reconstruct_entries_from_blobs(blobs)?;
let res = bank.process_entries(entries);
2018-05-22 15:30:46 -07:00
if res.is_err() {
error!("process_entries {} {:?}", blobs_len, res);
2018-05-22 15:30:46 -07:00
}
res?;
Ok(())
}
pub fn new(bank: Arc<Bank>, exit: Arc<AtomicBool>, window_receiver: BlobReceiver) -> Self {
2018-05-30 13:38:15 -07:00
let thread_hdl = Builder::new()
.name("solana-replicate-stage".to_string())
.spawn(move || loop {
let e = Self::replicate_requests(&bank, &window_receiver);
2018-05-30 13:38:15 -07:00
if e.is_err() && exit.load(Ordering::Relaxed) {
break;
}
})
.unwrap();
2018-05-22 15:18:07 -07:00
ReplicateStage { thread_hdl }
2018-05-22 14:26:28 -07:00
}
}
impl Service for ReplicateStage {
fn thread_hdls(self) -> Vec<JoinHandle<()>> {
vec![self.thread_hdl]
}
fn join(self) -> thread::Result<()> {
self.thread_hdl.join()
}
}