move copy_ledger() back into ledger.rs

Don't recover() for copy(), as copy() is already tolerant of things
    recover() guards against.  Note: recover() is problematic if the ledger is
    "live", i.e. is currently being written to.
This commit is contained in:
Rob Walker 2018-08-06 00:03:53 -07:00
parent c3db2df7eb
commit ead0eb2754
3 changed files with 55 additions and 44 deletions

View File

@ -143,14 +143,14 @@ impl FullNode {
pub fn new_without_sigverify(
node: TestNode,
leader: bool,
ledger: &str,
ledger_path: &str,
keypair: KeyPair,
network_entry_for_validator: Option<SocketAddr>,
) -> FullNode {
FullNode::new_internal(
node,
leader,
ledger,
ledger_path,
keypair,
network_entry_for_validator,
true,

View File

@ -222,6 +222,9 @@ fn recover_ledger(ledger_path: &Path) -> io::Result<()> {
}
}
}
let num_entries = index.metadata()?.len() / SIZEOF_U64;
trace!("recover: done. {} entries", num_entries);
// flush everything to disk...
index.sync_all()?;
data.sync_all()
@ -258,24 +261,24 @@ impl LedgerWriter {
} else {
recover_ledger(ledger_path)?;
}
let mut index = OpenOptions::new()
let index = OpenOptions::new()
.create(create)
.append(true)
.open(ledger_path.join("index"))?;
if log_enabled!(Trace) {
let offset = index.seek(SeekFrom::Current(0))?;
trace!("LedgerWriter::new: index fp:{}", offset);
let len = index.metadata()?.len();
trace!("LedgerWriter::new: index fp:{}", len);
}
let mut data = OpenOptions::new()
let data = OpenOptions::new()
.create(create)
.append(true)
.open(ledger_path.join("data"))?;
if log_enabled!(Trace) {
let offset = data.seek(SeekFrom::Current(0))?;
trace!("LedgerWriter::new: data fp:{}", offset);
let len = data.metadata()?.len();
trace!("LedgerWriter::new: data fp:{}", len);
}
Ok(LedgerWriter { index, data })
@ -349,6 +352,22 @@ pub fn read_ledger(ledger_path: &str) -> io::Result<impl Iterator<Item = io::Res
Ok(LedgerReader { data })
}
/// copy ledger is doesn't fix up the "from" ledger
pub fn copy_ledger(from: &str, to: &str) -> io::Result<()> {
let mut to = LedgerWriter::new(to, true)?;
let from = Path::new(&from);
// for a copy, we read "readonly" from data
let data = File::open(from.join("data"))?;
for entry in (LedgerReader { data }) {
let entry = entry?;
to.write_entry(&entry)?;
}
Ok(())
}
// a Block is a slice of Entries
pub trait Block {
/// Verifies the hashes and counts of a slice of transactions are all consistent.
@ -764,4 +783,31 @@ mod tests {
let _ignored = remove_dir_all(&ledger_path);
}
#[test]
fn test_copy_ledger() {
use logger;
logger::setup();
let from = tmp_ledger_path("test_ledger_copy_from");
let entries = make_tiny_test_entries(10);
let mut writer = LedgerWriter::new(&from, true).unwrap();
writer.write_entries(entries.clone()).unwrap();
let to = tmp_ledger_path("test_ledger_copy_to");
copy_ledger(&from, &to).unwrap();
let mut read_entries = vec![];
for x in read_ledger(&to).unwrap() {
let entry = x.unwrap();
trace!("entry... {:?}", entry);
read_entries.push(entry);
}
assert_eq!(read_entries, entries);
std::fs::remove_dir_all(from).unwrap();
std::fs::remove_dir_all(to).unwrap();
}
}

View File

@ -6,7 +6,7 @@ extern crate solana;
use solana::crdt::{Crdt, NodeInfo, TestNode};
use solana::fullnode::FullNode;
use solana::ledger::{read_ledger, LedgerWriter};
use solana::ledger::{copy_ledger, LedgerWriter};
use solana::logger;
use solana::mint::Mint;
use solana::ncp::Ncp;
@ -18,7 +18,6 @@ use solana::timing::duration_as_s;
use std::cmp::max;
use std::env;
use std::fs::remove_dir_all;
use std::io;
use std::net::UdpSocket;
use std::sync::atomic::AtomicBool;
use std::sync::{Arc, RwLock};
@ -90,40 +89,6 @@ fn genesis(name: &str, num: i64) -> (Mint, String) {
(mint, path)
}
//#[test]
//fn test_copy_ledger() {
// let from = tmp_ledger_path("test_ledger_copy_from");
// let entries = make_tiny_test_entries(10);
//
// let mut writer = LedgerWriter::new(&from, true).unwrap();
// writer.write_entries(entries.clone()).unwrap();
//
// let to = tmp_ledger_path("test_ledger_copy_to");
//
// copy_ledger(&from, &to).unwrap();
//
// let mut read_entries = vec![];
// for x in read_ledger(&to).unwrap() {
// let entry = x.unwrap();
// trace!("entry... {:?}", entry);
// read_entries.push(entry);
// }
// assert_eq!(read_entries, entries);
//
// std::fs::remove_dir_all(from).unwrap();
// std::fs::remove_dir_all(to).unwrap();
//}
//
fn copy_ledger(from: &str, to: &str) -> io::Result<()> {
let mut to = LedgerWriter::new(to, true)?;
for entry in read_ledger(from)? {
let entry = entry?;
to.write_entry(&entry)?;
}
Ok(())
}
fn tmp_copy_ledger(from: &str, name: &str) -> String {
let to = tmp_ledger_path(name);
copy_ledger(from, &to).unwrap();