From ec82c47e5fd837ffef9bde7eca8465db6dffc731 Mon Sep 17 00:00:00 2001 From: Greg Fitzgerald Date: Tue, 3 Jul 2018 16:19:57 -0600 Subject: [PATCH 1/2] Clean up read_entries() and its usage --- src/bank.rs | 6 ++---- src/entry_writer.rs | 11 ++++------- src/fullnode.rs | 25 ++++++++----------------- 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/bank.rs b/src/bank.rs index 64370355e707d0..c3f0fec8aa164f 100644 --- a/src/bank.rs +++ b/src/bank.rs @@ -530,7 +530,7 @@ mod tests { use hash::hash; use ledger::next_entries; use signature::KeyPairUtil; - use std::io::{BufRead, BufReader, Cursor, Seek, SeekFrom}; + use std::io::{BufReader, Cursor, Seek, SeekFrom}; #[test] fn test_two_payments_to_one_party() { @@ -807,9 +807,7 @@ mod tests { file.seek(SeekFrom::Start(0)).unwrap(); let reader = BufReader::new(file); - reader - .lines() - .map(|line| entry_writer::read_entry(line.unwrap()).unwrap()) + entry_writer::read_entries(reader).map(|x| x.unwrap()) } #[test] diff --git a/src/entry_writer.rs b/src/entry_writer.rs index 3b8a862a8f42f6..2ded0bcebfd495 100644 --- a/src/entry_writer.rs +++ b/src/entry_writer.rs @@ -49,15 +49,12 @@ impl<'a, W: Write> EntryWriter<'a, W> { } } -pub fn read_entry(s: String) -> io::Result { - serde_json::from_str(&s).map_err(|e| Error::new(ErrorKind::Other, e.to_string())) +pub fn read_entry(s: &str) -> io::Result { + serde_json::from_str(s).map_err(|e| Error::new(ErrorKind::Other, e.to_string())) } -// TODO: How to implement this without attaching the input's lifetime to the output? -pub fn read_entries<'a, R: BufRead>( - reader: &'a mut R, -) -> impl Iterator> + 'a { - reader.lines().map(|s| read_entry(s?)) +pub fn read_entries(reader: R) -> impl Iterator> { + reader.lines().map(|s| read_entry(&s?)) } #[cfg(test)] diff --git a/src/fullnode.rs b/src/fullnode.rs index e7a79abde32388..41c4420ba69780 100644 --- a/src/fullnode.rs +++ b/src/fullnode.rs @@ -7,8 +7,8 @@ use ncp::Ncp; use packet::BlobRecycler; use rpu::Rpu; use std::fs::File; -use std::io::Write; use std::io::{sink, stdin, stdout, BufReader}; +use std::io::{Read, Write}; use std::net::SocketAddr; use std::sync::atomic::AtomicBool; use std::sync::{Arc, RwLock}; @@ -44,23 +44,14 @@ impl FullNode { ) -> FullNode { info!("creating bank..."); let bank = Bank::default(); - let entry_height = match infile { - InFile::Path(path) => { - let f = File::open(path).unwrap(); - let mut r = BufReader::new(f); - let entries = - entry_writer::read_entries(&mut r).map(|e| e.expect("failed to parse entry")); - info!("processing ledger..."); - bank.process_ledger(entries).expect("process_ledger") - } - InFile::StdIn => { - let mut r = BufReader::new(stdin()); - let entries = - entry_writer::read_entries(&mut r).map(|e| e.expect("failed to parse entry")); - info!("processing ledger..."); - bank.process_ledger(entries).expect("process_ledger") - } + let infile: Box = match infile { + InFile::Path(path) => Box::new(File::open(path).unwrap()), + InFile::StdIn => Box::new(stdin()), }; + let reader = BufReader::new(infile); + let entries = entry_writer::read_entries(reader).map(|e| e.expect("failed to parse entry")); + info!("processing ledger..."); + let entry_height = bank.process_ledger(entries).expect("process_ledger"); // entry_height is the network-wide agreed height of the ledger. // initialize it from the input ledger From 3131aac96be91de3e05de672760058d247e02a01 Mon Sep 17 00:00:00 2001 From: Greg Fitzgerald Date: Tue, 3 Jul 2018 16:24:55 -0600 Subject: [PATCH 2/2] Cleanup code duplication --- src/fullnode.rs | 46 ++++++++++++++-------------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/fullnode.rs b/src/fullnode.rs index 41c4420ba69780..46773e0d53a442 100644 --- a/src/fullnode.rs +++ b/src/fullnode.rs @@ -84,41 +84,23 @@ impl FullNode { server } else { node.data.current_leader_id = node.data.id.clone(); - let server = match outfile_for_leader { + let outfile_for_leader: Box = match outfile_for_leader { Some(OutFile::Path(file)) => { - FullNode::new_leader( - bank, - entry_height, - //Some(Duration::from_millis(1000)), - None, - node, - exit.clone(), - File::create(file).expect("opening ledger file"), - ) - } - Some(OutFile::StdOut) => { - FullNode::new_leader( - bank, - entry_height, - //Some(Duration::from_millis(1000)), - None, - node, - exit.clone(), - stdout(), - ) - } - None => { - FullNode::new_leader( - bank, - entry_height, - //Some(Duration::from_millis(1000)), - None, - node, - exit.clone(), - sink(), - ) + Box::new(File::create(file).expect("opening ledger file")) } + Some(OutFile::StdOut) => Box::new(stdout()), + None => Box::new(sink()), }; + + let server = FullNode::new_leader( + bank, + entry_height, + //Some(Duration::from_millis(1000)), + None, + node, + exit.clone(), + outfile_for_leader, + ); info!( "leader ready... local request address: {} (advertising {})", local_requests_addr, requests_addr