fix: try to fix issue #2585 by adding block cleanup from db directly. (#2815)

* 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:
Daogang Tang 2019-05-13 23:10:31 +08:00 committed by Antioch Peverell
parent 998824ecf3
commit 9ac4143bc9
2 changed files with 15 additions and 28 deletions

View file

@ -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(&current_hash)?;
loop {
// Go to the store directly so we can handle NotFoundErr robustly.
match self.store.get_block(&current.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(&current) {
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!(

View file

@ -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