statedb: allow longer state pruning history (#11980)

* introduce DbBackedQueue for the state pruning window

Signed-off-by: linning <linningde25@gmail.com>

* avoid cloning for next_hash

Signed-off-by: linning <linningde25@gmail.com>

* add tests

Signed-off-by: linning <linningde25@gmail.com>

* make clippy happy

Signed-off-by: linning <linningde25@gmail.com>

* impl have_block by checking block number

Signed-off-by: linning <linningde25@gmail.com>

* refactor

Signed-off-by: linning <linningde25@gmail.com>

* fix tests & add test for init db-backed queue

Signed-off-by: linning <linningde25@gmail.com>

* update comment

Signed-off-by: linning <linningde25@gmail.com>

* add check for have_state_at

Signed-off-by: linning <linningde25@gmail.com>

* address comment

Signed-off-by: linning <linningde25@gmail.com>

* renanme unload_blocks to uncached_blocks

Signed-off-by: linning <linningde25@gmail.com>

* address comment

Signed-off-by: linning <linningde25@gmail.com>

* fix syncs_state test

Signed-off-by: linning <linningde25@gmail.com>

* address comment

Signed-off-by: linning <linningde25@gmail.com>

* revert change to make_test_db to add test cases

Signed-off-by: linning <linningde25@gmail.com>

* do not prune unavailable block & add tests

Signed-off-by: linning <linningde25@gmail.com>

* Update client/state-db/src/lib.rs

Signed-off-by: linning <linningde25@gmail.com>

Co-authored-by: cheme <emericchevalier.pro@gmail.com>

* Update client/state-db/src/pruning.rs

Signed-off-by: linning <linningde25@gmail.com>

Co-authored-by: cheme <emericchevalier.pro@gmail.com>

* address comment

Signed-off-by: linning <linningde25@gmail.com>

Signed-off-by: linning <linningde25@gmail.com>
Co-authored-by: cheme <emericchevalier.pro@gmail.com>
This commit is contained in:
NingLin-P
2022-09-01 23:45:34 +08:00
committed by GitHub
parent 3e63e70b26
commit 6be21e0397
5 changed files with 1054 additions and 321 deletions
@@ -28,7 +28,7 @@ use log::trace;
use std::collections::{hash_map::Entry, HashMap, VecDeque};
const NON_CANONICAL_JOURNAL: &[u8] = b"noncanonical_journal";
const LAST_CANONICAL: &[u8] = b"last_canonical";
pub(crate) const LAST_CANONICAL: &[u8] = b"last_canonical";
const MAX_BLOCKS_PER_LEVEL: u64 = 32;
/// See module documentation.
@@ -376,12 +376,13 @@ impl<BlockHash: Hash, Key: Hash> NonCanonicalOverlay<BlockHash, Key> {
}
/// Select a top-level root and canonicalized it. Discards all sibling subtrees and the root.
/// Returns a set of changes that need to be added to the DB.
/// Add a set of changes of the canonicalized block to `CommitSet`
/// Return the block number of the canonicalized block
pub fn canonicalize(
&mut self,
hash: &BlockHash,
commit: &mut CommitSet<Key>,
) -> Result<(), StateDbError> {
) -> Result<u64, StateDbError> {
trace!(target: "state-db", "Canonicalizing {:?}", hash);
let level = self
.levels
@@ -431,7 +432,7 @@ impl<BlockHash: Hash, Key: Hash> NonCanonicalOverlay<BlockHash, Key> {
.push((to_meta_key(LAST_CANONICAL, &()), canonicalized.encode()));
trace!(target: "state-db", "Discarding {} records", commit.meta.deleted.len());
self.pending_canonicalizations.push(hash.clone());
Ok(())
Ok(canonicalized.1)
}
fn apply_canonicalizations(&mut self) {
@@ -755,7 +756,7 @@ mod tests {
.unwrap(),
);
db.commit(&overlay.insert(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap());
assert_eq!(db.meta.len(), 3);
assert_eq!(db.meta_len(), 3);
let overlay2 = NonCanonicalOverlay::<H256, H256>::new(&db).unwrap();
assert_eq!(overlay.levels, overlay2.levels);