mirror of
https://github.com/mimblewimble/grin.git
synced 2025-01-20 19:11:08 +03:00
* fix: try to fix issue #2585 by adding block cleanup from db directly. Signed-off-by: Mike Tang <daogangtang@gmail.com> * use another effective algorithm to do old block and short-lived block cleaup. Signed-off-by: Mike Tang <daogangtang@gmail.com> * 1. rename iter_lived_blocks to blocks_iter; 2. comments and iterator calling optimiztions. Signed-off-by: Mike Tang <daogangtang@gmail.com> * Fix locking bug when calling is_on_current_chain() in batch.blocks_iter just by removing it. Because "we want to delete block older (i.e. lower height) than tail.height". Signed-off-by: Mike Tang <daogangtang@gmail.com>
This commit is contained in:
parent
998824ecf3
commit
9ac4143bc9
2 changed files with 15 additions and 28 deletions
|
@ -1026,38 +1026,18 @@ impl Chain {
|
|||
}
|
||||
|
||||
let mut count = 0;
|
||||
|
||||
let tail_hash = txhashset.get_header_hash_by_height(head.height - horizon)?;
|
||||
let tail = batch.get_block_header(&tail_hash)?;
|
||||
|
||||
let current_hash = txhashset.get_header_hash_by_height(head.height - horizon - 1)?;
|
||||
let mut current = batch.get_block_header(¤t_hash)?;
|
||||
|
||||
loop {
|
||||
// Go to the store directly so we can handle NotFoundErr robustly.
|
||||
match self.store.get_block(¤t.hash()) {
|
||||
Ok(b) => {
|
||||
batch.delete_block(&b.hash())?;
|
||||
count += 1;
|
||||
}
|
||||
Err(NotFoundErr(_)) => {
|
||||
break;
|
||||
}
|
||||
Err(e) => {
|
||||
return Err(
|
||||
ErrorKind::StoreErr(e, "retrieving block to compact".to_owned()).into(),
|
||||
);
|
||||
}
|
||||
}
|
||||
if current.height <= 1 {
|
||||
break;
|
||||
}
|
||||
match batch.get_previous_header(¤t) {
|
||||
Ok(h) => current = h,
|
||||
Err(NotFoundErr(_)) => break,
|
||||
Err(e) => return Err(From::from(e)),
|
||||
// Remove old blocks (including short lived fork blocks) which height < tail.height
|
||||
// here b is a block
|
||||
for (_, b) in batch.blocks_iter()? {
|
||||
if b.header.height < tail.height {
|
||||
let _ = batch.delete_block(&b.hash());
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
|
||||
batch.save_body_tail(&Tip::from_header(&tail))?;
|
||||
|
||||
debug!(
|
||||
|
|
|
@ -22,7 +22,7 @@ use crate::types::Tip;
|
|||
use crate::util::secp::pedersen::Commitment;
|
||||
use croaring::Bitmap;
|
||||
use grin_store as store;
|
||||
use grin_store::{option_to_not_found, to_key, Error};
|
||||
use grin_store::{option_to_not_found, to_key, Error, SerIterator};
|
||||
use std::sync::Arc;
|
||||
|
||||
const STORE_SUBPATH: &'static str = "chain";
|
||||
|
@ -378,6 +378,13 @@ impl<'a> Batch<'a> {
|
|||
db: self.db.child()?,
|
||||
})
|
||||
}
|
||||
|
||||
/// An iterator to all block in db
|
||||
pub fn blocks_iter(&self) -> Result<SerIterator<Block>, Error> {
|
||||
let key = to_key(BLOCK_PREFIX, &mut "".to_string().into_bytes());
|
||||
self.db.iter(&key)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// An iterator on blocks, from latest to earliest, specialized to return
|
||||
|
|
Loading…
Reference in a new issue