mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-30 16:37:57 +00:00
Safe and sane multi-item storage removal (#11490)
* Fix overlay prefix removal result * Second part of the overlay prefix removal fix. * Report only items deleted from storage in clear_prefix * Fix kill_prefix * Formatting * Remove unused code * Fixes * Fixes * Introduce clear_prefix host function v3 * Formatting * Use v2 for now * Fixes * Formatting * Docs * Child prefix removal should also hide v3 for now * Fixes * Fixes * Formatting * Fixes * apply_to_keys_whle takes start_at * apply_to_keys_whle takes start_at * apply_to_keys_whle takes start_at * Cursor API; force limits * Use unsafe deprecated functions * Formatting * Fixes * Grumbles * Fixes * Docs * Some nitpicks 🙈 * Update primitives/externalities/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Formatting * Fixes * cargo fmt * Fixes * Update primitives/io/src/lib.rs Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> * Formatting * Fixes Co-authored-by: Bastian Köcher <info@kchr.de> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Keith Yeung <kungfukeith11@gmail.com>
This commit is contained in:
@@ -1348,6 +1348,7 @@ mod execution {
|
||||
mod tests {
|
||||
use super::{ext::Ext, *};
|
||||
use crate::{execution::CallResult, in_memory_backend::new_in_mem_hash_key};
|
||||
use assert_matches::assert_matches;
|
||||
use codec::{Decode, Encode};
|
||||
use sp_core::{
|
||||
map,
|
||||
@@ -1572,7 +1573,7 @@ mod tests {
|
||||
{
|
||||
let mut cache = StorageTransactionCache::default();
|
||||
let mut ext = Ext::new(&mut overlay, &mut cache, backend, None);
|
||||
ext.clear_prefix(b"ab", None);
|
||||
let _ = ext.clear_prefix(b"ab", None, None);
|
||||
}
|
||||
overlay.commit_transaction().unwrap();
|
||||
|
||||
@@ -1596,7 +1597,10 @@ mod tests {
|
||||
{
|
||||
let mut cache = StorageTransactionCache::default();
|
||||
let mut ext = Ext::new(&mut overlay, &mut cache, backend, None);
|
||||
assert_eq!((false, 1), ext.clear_prefix(b"ab", Some(1)));
|
||||
assert_matches!(
|
||||
ext.clear_prefix(b"ab", Some(1), None).deconstruct(),
|
||||
(Some(_), 1, 3, 1)
|
||||
);
|
||||
}
|
||||
overlay.commit_transaction().unwrap();
|
||||
|
||||
@@ -1638,7 +1642,8 @@ mod tests {
|
||||
{
|
||||
let mut cache = StorageTransactionCache::default();
|
||||
let mut ext = Ext::new(&mut overlay, &mut cache, &backend, None);
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(2)), (false, 2));
|
||||
let r = ext.kill_child_storage(&child_info, Some(2), None);
|
||||
assert_matches!(r.deconstruct(), (Some(_), 2, 6, 2));
|
||||
}
|
||||
|
||||
assert_eq!(
|
||||
@@ -1673,14 +1678,37 @@ mod tests {
|
||||
let mut overlay = OverlayedChanges::default();
|
||||
let mut cache = StorageTransactionCache::default();
|
||||
let mut ext = Ext::new(&mut overlay, &mut cache, &backend, None);
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(0)), (false, 0));
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(1)), (false, 1));
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(2)), (false, 2));
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(3)), (false, 3));
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(4)), (true, 4));
|
||||
// Only 4 items to remove
|
||||
assert_eq!(ext.kill_child_storage(&child_info, Some(5)), (true, 4));
|
||||
assert_eq!(ext.kill_child_storage(&child_info, None), (true, 4));
|
||||
let r = ext.kill_child_storage(&child_info, Some(0), None).deconstruct();
|
||||
assert_matches!(r, (Some(_), 0, 0, 0));
|
||||
let r = ext
|
||||
.kill_child_storage(&child_info, Some(1), r.0.as_ref().map(|x| &x[..]))
|
||||
.deconstruct();
|
||||
assert_matches!(r, (Some(_), 1, 1, 1));
|
||||
let r = ext
|
||||
.kill_child_storage(&child_info, Some(4), r.0.as_ref().map(|x| &x[..]))
|
||||
.deconstruct();
|
||||
// Only 3 items remaining to remove
|
||||
assert_matches!(r, (None, 3, 3, 3));
|
||||
let r = ext.kill_child_storage(&child_info, Some(1), None).deconstruct();
|
||||
assert_matches!(r, (Some(_), 0, 0, 1));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn limited_child_kill_off_by_one_works_without_limit() {
|
||||
let child_info = ChildInfo::new_default(b"sub1");
|
||||
let initial: HashMap<_, BTreeMap<_, _>> = map![
|
||||
Some(child_info.clone()) => map![
|
||||
b"a".to_vec() => b"0".to_vec(),
|
||||
b"b".to_vec() => b"1".to_vec(),
|
||||
b"c".to_vec() => b"2".to_vec(),
|
||||
b"d".to_vec() => b"3".to_vec()
|
||||
],
|
||||
];
|
||||
let backend = InMemoryBackend::<BlakeTwo256>::from((initial, StateVersion::default()));
|
||||
let mut overlay = OverlayedChanges::default();
|
||||
let mut cache = StorageTransactionCache::default();
|
||||
let mut ext = Ext::new(&mut overlay, &mut cache, &backend, None);
|
||||
assert_eq!(ext.kill_child_storage(&child_info, None, None).deconstruct(), (None, 4, 4, 4));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -1695,7 +1723,7 @@ mod tests {
|
||||
|
||||
ext.set_child_storage(child_info, b"abc".to_vec(), b"def".to_vec());
|
||||
assert_eq!(ext.child_storage(child_info, b"abc"), Some(b"def".to_vec()));
|
||||
ext.kill_child_storage(child_info, None);
|
||||
let _ = ext.kill_child_storage(child_info, None, None);
|
||||
assert_eq!(ext.child_storage(child_info, b"abc"), None);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user