solana/src/replicate_stage.rs

44 lines
1.4 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;
2018-05-22 15:18:07 -07:00
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
2018-05-30 13:38:15 -07:00
use std::thread::{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 {
pub thread_hdl: JoinHandle<()>,
}
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
}
}