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( pub fn new_without_sigverify(
node: TestNode, node: TestNode,
leader: bool, leader: bool,
ledger: &str, ledger_path: &str,
keypair: KeyPair, keypair: KeyPair,
network_entry_for_validator: Option<SocketAddr>, network_entry_for_validator: Option<SocketAddr>,
) -> FullNode { ) -> FullNode {
FullNode::new_internal( FullNode::new_internal(
node, node,
leader, leader,
ledger, ledger_path,
keypair, keypair,
network_entry_for_validator, network_entry_for_validator,
true, 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... // flush everything to disk...
index.sync_all()?; index.sync_all()?;
data.sync_all() data.sync_all()
@ -258,24 +261,24 @@ impl LedgerWriter {
} else { } else {
recover_ledger(ledger_path)?; recover_ledger(ledger_path)?;
} }
let mut index = OpenOptions::new() let index = OpenOptions::new()
.create(create) .create(create)
.append(true) .append(true)
.open(ledger_path.join("index"))?; .open(ledger_path.join("index"))?;
if log_enabled!(Trace) { if log_enabled!(Trace) {
let offset = index.seek(SeekFrom::Current(0))?; let len = index.metadata()?.len();
trace!("LedgerWriter::new: index fp:{}", offset); trace!("LedgerWriter::new: index fp:{}", len);
} }
let mut data = OpenOptions::new() let data = OpenOptions::new()
.create(create) .create(create)
.append(true) .append(true)
.open(ledger_path.join("data"))?; .open(ledger_path.join("data"))?;
if log_enabled!(Trace) { if log_enabled!(Trace) {
let offset = data.seek(SeekFrom::Current(0))?; let len = data.metadata()?.len();
trace!("LedgerWriter::new: data fp:{}", offset); trace!("LedgerWriter::new: data fp:{}", len);
} }
Ok(LedgerWriter { index, data }) 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 }) 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 // a Block is a slice of Entries
pub trait Block { pub trait Block {
/// Verifies the hashes and counts of a slice of transactions are all consistent. /// 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); 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::crdt::{Crdt, NodeInfo, TestNode};
use solana::fullnode::FullNode; use solana::fullnode::FullNode;
use solana::ledger::{read_ledger, LedgerWriter}; use solana::ledger::{copy_ledger, LedgerWriter};
use solana::logger; use solana::logger;
use solana::mint::Mint; use solana::mint::Mint;
use solana::ncp::Ncp; use solana::ncp::Ncp;
@ -18,7 +18,6 @@ use solana::timing::duration_as_s;
use std::cmp::max; use std::cmp::max;
use std::env; use std::env;
use std::fs::remove_dir_all; use std::fs::remove_dir_all;
use std::io;
use std::net::UdpSocket; use std::net::UdpSocket;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
@ -90,40 +89,6 @@ fn genesis(name: &str, num: i64) -> (Mint, String) {
(mint, path) (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 { fn tmp_copy_ledger(from: &str, name: &str) -> String {
let to = tmp_ledger_path(name); let to = tmp_ledger_path(name);
copy_ledger(from, &to).unwrap(); copy_ledger(from, &to).unwrap();