Skip to content

Commit

Permalink
fix: try to fix issue #2585 by adding block cleanup from db directly. (
Browse files Browse the repository at this point in the history
…#2815)

* fix: try to fix issue #2585 by adding block cleanup from db directly.

Signed-off-by: Mike Tang <[email protected]>

* use another effective algorithm to do old block and short-lived block cleaup.

Signed-off-by: Mike Tang <[email protected]>

* 1. rename iter_lived_blocks to blocks_iter;
2. comments and iterator calling optimiztions.

Signed-off-by: Mike Tang <[email protected]>

* 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 <[email protected]>
  • Loading branch information
miketang84 authored and antiochp committed May 13, 2019
1 parent 998824e commit 9ac4143
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 28 deletions.
34 changes: 7 additions & 27 deletions chain/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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!(
Expand Down
9 changes: 8 additions & 1 deletion chain/src/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 9ac4143

Please sign in to comment.