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:
parent
c3db2df7eb
commit
ead0eb2754
|
@ -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,
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue