mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 17:01:09 +03:00
Rm log rewind on startup (#760)
* add rewind to block height to rm_log on startup * add rewind to block height to rm_log on startup * flush remove log
This commit is contained in:
parent
23ac36a834
commit
5cf780ab98
3 changed files with 32 additions and 8 deletions
|
@ -157,7 +157,15 @@ impl Chain {
|
||||||
// check if we have a head in store, otherwise the genesis block is it
|
// check if we have a head in store, otherwise the genesis block is it
|
||||||
let head = store.head();
|
let head = store.head();
|
||||||
let txhashset_md = match head {
|
let txhashset_md = match head {
|
||||||
Ok(h) => Some(store.get_block_pmmr_file_metadata(&h.last_block_h)?),
|
Ok(h) => {
|
||||||
|
// Add the height to the metadata for the use of the rewind log, as this isn't
|
||||||
|
// stored
|
||||||
|
let mut ts = store.get_block_pmmr_file_metadata(&h.last_block_h)?;
|
||||||
|
ts.output_file_md.block_height = h.height;
|
||||||
|
ts.rproof_file_md.block_height = h.height;
|
||||||
|
ts.kernel_file_md.block_height = h.height;
|
||||||
|
Some(ts)
|
||||||
|
}
|
||||||
Err(NotFoundErr) => None,
|
Err(NotFoundErr) => None,
|
||||||
Err(e) => return Err(Error::StoreErr(e, "chain init load head".to_owned())),
|
Err(e) => return Err(Error::StoreErr(e, "chain init load head".to_owned())),
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,6 +35,8 @@ pub const RM_LOG_MAX_NODES: usize = 10000;
|
||||||
/// stored
|
/// stored
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
||||||
pub struct PMMRFileMetadata {
|
pub struct PMMRFileMetadata {
|
||||||
|
/// The block height represented by these indices in the file
|
||||||
|
pub block_height: u64,
|
||||||
/// last written index of the hash file
|
/// last written index of the hash file
|
||||||
pub last_hash_file_pos: u64,
|
pub last_hash_file_pos: u64,
|
||||||
/// last written index of the data file
|
/// last written index of the data file
|
||||||
|
@ -43,6 +45,7 @@ pub struct PMMRFileMetadata {
|
||||||
|
|
||||||
impl Writeable for PMMRFileMetadata {
|
impl Writeable for PMMRFileMetadata {
|
||||||
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ser::Error> {
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ser::Error> {
|
||||||
|
writer.write_u64(self.block_height)?;
|
||||||
writer.write_u64(self.last_hash_file_pos)?;
|
writer.write_u64(self.last_hash_file_pos)?;
|
||||||
writer.write_u64(self.last_data_file_pos)?;
|
writer.write_u64(self.last_data_file_pos)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -52,6 +55,7 @@ impl Writeable for PMMRFileMetadata {
|
||||||
impl Readable for PMMRFileMetadata {
|
impl Readable for PMMRFileMetadata {
|
||||||
fn read(reader: &mut Reader) -> Result<PMMRFileMetadata, ser::Error> {
|
fn read(reader: &mut Reader) -> Result<PMMRFileMetadata, ser::Error> {
|
||||||
Ok(PMMRFileMetadata {
|
Ok(PMMRFileMetadata {
|
||||||
|
block_height: reader.read_u64()?,
|
||||||
last_hash_file_pos: reader.read_u64()?,
|
last_hash_file_pos: reader.read_u64()?,
|
||||||
last_data_file_pos: reader.read_u64()?,
|
last_data_file_pos: reader.read_u64()?,
|
||||||
})
|
})
|
||||||
|
@ -62,6 +66,7 @@ impl PMMRFileMetadata {
|
||||||
/// Return fields with all positions = 0
|
/// Return fields with all positions = 0
|
||||||
pub fn empty() -> PMMRFileMetadata {
|
pub fn empty() -> PMMRFileMetadata {
|
||||||
PMMRFileMetadata {
|
PMMRFileMetadata {
|
||||||
|
block_height: 0,
|
||||||
last_hash_file_pos: 0,
|
last_hash_file_pos: 0,
|
||||||
last_data_file_pos: 0,
|
last_data_file_pos: 0,
|
||||||
}
|
}
|
||||||
|
@ -211,13 +216,17 @@ where
|
||||||
/// Instantiates a new PMMR backend that will use the provided directly to
|
/// Instantiates a new PMMR backend that will use the provided directly to
|
||||||
/// store its files.
|
/// store its files.
|
||||||
pub fn new(data_dir: String, file_md: Option<PMMRFileMetadata>) -> io::Result<PMMRBackend<T>> {
|
pub fn new(data_dir: String, file_md: Option<PMMRFileMetadata>) -> io::Result<PMMRBackend<T>> {
|
||||||
let (hash_to_pos, data_to_pos) = match file_md {
|
let (height, hash_to_pos, data_to_pos) = match file_md {
|
||||||
Some(m) => (m.last_hash_file_pos, m.last_data_file_pos),
|
Some(m) => (
|
||||||
None => (0, 0),
|
m.block_height as u32,
|
||||||
|
m.last_hash_file_pos,
|
||||||
|
m.last_data_file_pos,
|
||||||
|
),
|
||||||
|
None => (0, 0, 0),
|
||||||
};
|
};
|
||||||
let hash_file =
|
let hash_file =
|
||||||
AppendOnlyFile::open(format!("{}/{}", data_dir, PMMR_HASH_FILE), hash_to_pos)?;
|
AppendOnlyFile::open(format!("{}/{}", data_dir, PMMR_HASH_FILE), hash_to_pos)?;
|
||||||
let rm_log = RemoveLog::open(format!("{}/{}", data_dir, PMMR_RM_LOG_FILE))?;
|
let rm_log = RemoveLog::open(format!("{}/{}", data_dir, PMMR_RM_LOG_FILE), height)?;
|
||||||
let prune_list = read_ordered_vec(format!("{}/{}", data_dir, PMMR_PRUNED_FILE), 8)?;
|
let prune_list = read_ordered_vec(format!("{}/{}", data_dir, PMMR_PRUNED_FILE), 8)?;
|
||||||
let data_file =
|
let data_file =
|
||||||
AppendOnlyFile::open(format!("{}/{}", data_dir, PMMR_DATA_FILE), data_to_pos)?;
|
AppendOnlyFile::open(format!("{}/{}", data_dir, PMMR_DATA_FILE), data_to_pos)?;
|
||||||
|
@ -290,6 +299,7 @@ where
|
||||||
/// Return last written buffer positions for the hash file and the data file
|
/// Return last written buffer positions for the hash file and the data file
|
||||||
pub fn last_file_positions(&self) -> PMMRFileMetadata {
|
pub fn last_file_positions(&self) -> PMMRFileMetadata {
|
||||||
PMMRFileMetadata {
|
PMMRFileMetadata {
|
||||||
|
block_height: 0,
|
||||||
last_hash_file_pos: self.hash_file.last_buffer_pos() as u64,
|
last_hash_file_pos: self.hash_file.last_buffer_pos() as u64,
|
||||||
last_data_file_pos: self.data_file.last_buffer_pos() as u64,
|
last_data_file_pos: self.data_file.last_buffer_pos() as u64,
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ use libc::{ftruncate as ftruncate64, off_t as off64_t};
|
||||||
|
|
||||||
use core::ser;
|
use core::ser;
|
||||||
|
|
||||||
|
/// Noop
|
||||||
pub fn prune_noop(_pruned_data: &[u8]) {}
|
pub fn prune_noop(_pruned_data: &[u8]) {}
|
||||||
|
|
||||||
/// Wrapper for a file that can be read at any position (random read) but for
|
/// Wrapper for a file that can be read at any position (random read) but for
|
||||||
|
@ -229,14 +230,19 @@ pub struct RemoveLog {
|
||||||
impl RemoveLog {
|
impl RemoveLog {
|
||||||
/// Open the remove log file. The content of the file will be read in memory
|
/// Open the remove log file. The content of the file will be read in memory
|
||||||
/// for fast checking.
|
/// for fast checking.
|
||||||
pub fn open(path: String) -> io::Result<RemoveLog> {
|
pub fn open(path: String, rewind_to_index: u32) -> io::Result<RemoveLog> {
|
||||||
let removed = read_ordered_vec(path.clone(), 12)?;
|
let removed = read_ordered_vec(path.clone(), 12)?;
|
||||||
Ok(RemoveLog {
|
let mut rl = RemoveLog {
|
||||||
path: path,
|
path: path,
|
||||||
removed: removed,
|
removed: removed,
|
||||||
removed_tmp: vec![],
|
removed_tmp: vec![],
|
||||||
removed_bak: vec![],
|
removed_bak: vec![],
|
||||||
})
|
};
|
||||||
|
if rewind_to_index > 0 {
|
||||||
|
rl.rewind(rewind_to_index)?;
|
||||||
|
rl.flush()?;
|
||||||
|
}
|
||||||
|
Ok(rl)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Truncate and empties the remove log.
|
/// Truncate and empties the remove log.
|
||||||
|
|
Loading…
Reference in a new issue