Skip to content

Commit

Permalink
fixing triedbmut lookup, added some testing in test. (paritytech#198)
Browse files Browse the repository at this point in the history
  • Loading branch information
cheme authored and arkpar committed Aug 13, 2023
1 parent 00b4fa9 commit 719aa79
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 5 deletions.
9 changes: 5 additions & 4 deletions trie-db/src/triedbmut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -975,6 +975,7 @@ where
handle: &NodeHandle<TrieHash<L>, L::Location>,
) -> Result<Option<DBValue>, TrieHash<L>, CError<L>> {
let mut handle = handle;
// prefix only use for value node access, so this is always correct.
let prefix = (full_key, None);
loop {
let (mid, child) = match handle {
Expand All @@ -994,8 +995,8 @@ where
},
NodeHandle::InMemory(handle) => match &self.storage[handle] {
Node::Empty => return Ok(None),
Node::Leaf(key, value) =>
if NibbleSlice::from_stored(key) == partial {
Node::Leaf(slice, value) =>
if NibbleSlice::from_stored(slice) == partial {
return Ok(value.in_memory_fetched_value(
prefix,
self.db,
Expand Down Expand Up @@ -1046,7 +1047,7 @@ where
None
})
} else if partial.starts_with(&slice) {
let idx = partial.at(0);
let idx = partial.at(slice.len());
match children[idx as usize].as_ref() {
Some(child) => (1 + slice.len(), child),
None => return Ok(None),
Expand Down Expand Up @@ -2016,7 +2017,7 @@ where

/// Cache the given `encoded` node.
fn cache_node(&mut self, hash: TrieHash<L>) {
// If we have a cache, cache our node directly.
// Mark the node as new so that it is removed from the shared cache.
if let Some(cache) = self.cache.as_mut() {
cache.insert_new_node(&hash);
}
Expand Down
53 changes: 52 additions & 1 deletion trie-db/test/src/triedbmut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,15 @@ fn playpen_internal<T: TrieLayout>() {
let real = reference_trie_root::<T, _, _, _>(x.clone());
let mut memdb = PrefixedMemoryDB::<T>::default();
let memtrie = populate_trie::<T>(&memdb, &x);
let root = memtrie.commit().apply_to(&mut memdb);
// avoid duplicate
let value_set: std::collections::BTreeMap<&[u8], &[u8]> =
x.iter().map(|(k, v)| (k.as_slice(), v.as_slice())).collect();
for (k, v) in value_set {
assert_eq!(memtrie.get(k).unwrap().unwrap(), v);
}
let commit = memtrie.commit();
let root = commit.apply_to(&mut memdb);

if root != real {
println!("TRIE MISMATCH");
println!();
Expand Down Expand Up @@ -804,3 +812,46 @@ fn test_insert_remove_data_with_cache_internal<T: TrieLayout>() {
assert!(matches!(cache.lookup_value_for_key(key).unwrap(), CachedValue::NonExisting));
}
}

#[test]
fn test_two_assets_memory_db() {
test_two_assets_memory_db_inner_1::<HashedValueNoExtThreshold<1>>();
test_two_assets_memory_db_inner_2::<HashedValueNoExtThreshold<1>>();
}
fn test_two_assets_memory_db_inner_1<T: TrieLayout>() {
let memdb = PrefixedMemoryDB::<T>::new(&[0u8]);
let mut state = TrieDBMutBuilder::<T>::new(&memdb).build();

let key1 = [1u8; 3];
let data1 = [1u8; 2];
state.insert(key1.as_ref(), &data1).unwrap();
assert_eq!(state.get(key1.as_ref()).unwrap().unwrap(), data1); //PASSING
let key2 = [2u8; 3];
let data2 = [2u8; 2];
state.insert(key2.as_ref(), &data2).unwrap();
assert_eq!(state.get(key1.as_ref()).unwrap().unwrap(), data1);

state.commit();
}

fn test_two_assets_memory_db_inner_2<T: TrieLayout>() {
let memdb = PrefixedMemoryDB::<T>::new(&[0u8]);
let mut state = TrieDBMutBuilder::<T>::new(&memdb).build();

let key1 = [1u8];
let data1 = [1u8; 2];
state.insert(key1.as_ref(), &data1).unwrap();
assert_eq!(state.get(key1.as_ref()).unwrap().unwrap(), data1);
let key2 = [1u8, 2];
let data2 = [2u8; 2];
state.insert(key2.as_ref(), &data2).unwrap();
assert_eq!(state.get(key1.as_ref()).unwrap().unwrap(), data1);
assert_eq!(state.get(key2.as_ref()).unwrap().unwrap(), data2);

let key3 = [1u8, 3];
let data3 = [3u8; 2];
state.insert(key3.as_ref(), &data3).unwrap();
assert_eq!(state.get(key1.as_ref()).unwrap().unwrap(), data1);
assert_eq!(state.get(key2.as_ref()).unwrap().unwrap(), data2);
assert_eq!(state.get(key3.as_ref()).unwrap().unwrap(), data3);
}

0 comments on commit 719aa79

Please sign in to comment.