Return number of keys removed when calling storage_kill on child trie (#8166)

* Initial piping of returning amount of keys killed

* One more test for `None` limit

* forgot to update

* fix return value

* use version 3

* Update to return `KillOutcome`

* Update name to KillChildStorageResult
This commit is contained in:
Shawn Tabrizi
2021-02-22 11:24:12 -08:00
committed by GitHub
parent 74a1d69477
commit d25229bc89
10 changed files with 100 additions and 40 deletions
@@ -391,7 +391,7 @@ where
&mut self,
child_info: &ChildInfo,
limit: Option<u32>,
) -> bool {
) -> (bool, u32) {
trace!(target: "state", "{:04x}: KillChild({})",
self.id,
HexDisplay::from(&child_info.storage_key()),
@@ -399,9 +399,9 @@ where
let _guard = guard();
self.mark_dirty();
self.overlay.clear_child_storage(child_info);
let mut num_deleted: u32 = 0;
if let Some(limit) = limit {
let mut num_deleted: u32 = 0;
let mut all_deleted = true;
self.backend.apply_to_child_keys_while(child_info, |key| {
if num_deleted == limit {
@@ -417,13 +417,14 @@ where
self.overlay.set_child_storage(child_info, key.to_vec(), None);
true
});
all_deleted
(all_deleted, num_deleted)
} else {
self.backend.apply_to_child_keys_while(child_info, |key| {
num_deleted = num_deleted.saturating_add(1);
self.overlay.set_child_storage(child_info, key.to_vec(), None);
true
});
true
(true, num_deleted)
}
}