fix a bug in the reserved amount of data in large keys

This commit is contained in:
bunnie 2021-12-26 16:29:35 +08:00
parent 0bd110c163
commit 809dbbdbc2
4 changed files with 20 additions and 12 deletions

View file

@ -1116,17 +1116,21 @@ impl BasisCacheEntry {
pub(crate) fn dict_delete(&mut self, hw: &mut PddbOs, name: &str, paranoid: bool) -> Result<()> {
if self.ensure_dict_in_cache(hw, name) {
let dcache = self.dicts.get_mut(name).expect("entry was ensured, but somehow missing");
//log::info!("dcache {} index {}, key_count {}", name, dcache.index, dcache.key_count);
log::trace!("dcache {} index {}, key_count {}", name, dcache.index, dcache.key_count);
// ensure all the keys are in RAM
dcache.fill(hw, &self.v2p_map, &self.cipher);
//log::info!("dcache filled");
// allocate a copy of the key list, to avoid interior mutability problems with the next remove step
let mut key_list = Vec::<String>::new();
for key in dcache.keys.keys() {
key_list.push(key.to_string());
let mut key_sanity_check = 0;
for (key, entry) in dcache.keys.iter() {
if entry.flags.valid() {
key_list.push(key.to_string());
key_sanity_check += 1;
}
}
for key in key_list {
//log::info!("removing {}:{}", name, key);
log::debug!("removing {}:{}", name, key);
// this will wipe any large pools if paranoid is set
dcache.key_remove(hw, &mut self.v2p_map, &self.cipher, &key, paranoid);
}

View file

@ -384,9 +384,9 @@ impl DictCacheEntry {
panic!("Updated file size is greater than the large file size limit.");
}
assert!((kcache.start + kcache.reserved) % VPAGE_SIZE as u64 == 0, "large space allocation rules were violated");
let new_reservation = PageAlignedVa::from(kcache.start + offset as u64 + data.len() as u64).as_u64();
let new_reservation_abs_addr = PageAlignedVa::from(kcache.start + offset as u64 + data.len() as u64).as_u64();
for vpage_addr in (
(kcache.start + kcache.reserved)..new_reservation
(kcache.start + kcache.reserved)..new_reservation_abs_addr
).step_by(VPAGE_SIZE) {
// ensures that a physical page entry exists for every new virtual address required by the extended key
v2p_map.entry(VirtAddr::new(vpage_addr).unwrap()).or_insert_with(|| {
@ -395,7 +395,7 @@ impl DictCacheEntry {
ap
});
}
kcache.reserved = new_reservation;
kcache.reserved = new_reservation_abs_addr - kcache.start; // convert absolute address to an actual length
kcache.clean = false;
// now retry the call, with the new physical page reservations in place
return self.key_update(hw, v2p_map, cipher, name, data, offset, alloc_hint, truncate, large_alloc_ptr);
@ -727,6 +727,8 @@ impl DictCacheEntry {
// - in-memory representation will return an entry, but with its valid flag set to false.
// - disk still contains a key entry that claims we have a valid key
// a call to sync is necessary to completely flush things, but, we don't sync every time we remove because it's inefficient.
} else {
log::debug!("key_remove() key does not exist: {}", name_str);
}
// if there's no key....we're done!
}

View file

@ -437,10 +437,11 @@ fn xmain() -> ! {
const EXTRA_BASIS_PW: &'static str = "some password blah blah";
log::set_max_level(log::LevelFilter::Info);
log::info!("Seed for this run: {}", xous::TESTING_RNG_SEED);
pddb_os.test_reset();
log::info!("Creating `basecase1e`");
log::set_max_level(log::LevelFilter::Debug);
log::set_max_level(log::LevelFilter::Info);
let mut basis_cache = BasisCache::new();
create_basis_testcase(&mut pddb_os, &mut basis_cache, None,
None, None, Some(32));
@ -469,11 +470,9 @@ fn xmain() -> ! {
patch_test(&mut pddb_os, &mut basis_cache, None, None, true);
pddb_os.dbg_dump(Some("patche".to_string()), None);
log::set_max_level(log::LevelFilter::Debug);
log::info!("Doing delete pattern test");
delete_pattern(&mut pddb_os, &mut basis_cache, None, None, None, None);
pddb_os.dbg_dump(Some("patterne".to_string()), None);
log::set_max_level(log::LevelFilter::Info);
// extended tests.
// allocation space curtailed to force resource exhaustion faster.
@ -486,11 +485,14 @@ fn xmain() -> ! {
delete_pattern(&mut pddb_os, &mut basis_cache, None, None, None, None);
pddb_os.dbg_dump(Some("patterne2".to_string()), None);
log::set_max_level(log::LevelFilter::Debug);
// dict2|key6|len794
log::info!("Doing delete/add consistency with data extension 2");
delete_add_dict_consistency(&mut pddb_os, &mut basis_cache, Some(3),
Some(50), None, None, None);
log::info!("Saving `dachecke2` to local host");
pddb_os.dbg_dump(Some("dachecke2".to_string()), None);
log::set_max_level(log::LevelFilter::Info);
log::info!("Doing delete/add consistency with data extension 3");
delete_add_dict_consistency(&mut pddb_os, &mut basis_cache, Some(3),

View file

@ -40,7 +40,7 @@ pub const PDDB_LOC: u32 = 0x0100_0000; // PDDB start
pub const PDDB_LEN: u32 = EC_REGION_LOC - PDDB_LOC;
#[cfg(all(any(windows, unix), not(feature = "processes-as-threads")))]
pub const TESTING_RNG_SEED: u64 = 0; // 2 "works"
pub const TESTING_RNG_SEED: u64 = 8; // 0, 1, 2, 3, 4, 7, 8 "works"; 5 "oom"; 6 "key space oom"
pub mod exceptions;
pub use exceptions::*;