Revert "Replace storage access by atomics" (#11156)

This reverts commit a69b8eb4a28f365a4a4b2fc295a693ec4d3d3cd5.
This commit is contained in:
Alexander Theißen
2022-04-04 13:19:46 +02:00
committed by GitHub
parent 6531ed7430
commit b8dbe46b3e
+28 -26
View File
@@ -48,46 +48,48 @@ pub mod unhashed;
pub mod weak_bounded_vec; pub mod weak_bounded_vec;
mod transaction_level_tracker { mod transaction_level_tracker {
use core::sync::atomic::{AtomicU32, Ordering};
type Layer = u32; type Layer = u32;
static NUM_LEVELS: AtomicU32 = AtomicU32::new(0); const TRANSACTION_LEVEL_KEY: &'static [u8] = b":transaction_level:";
const TRANSACTIONAL_LIMIT: Layer = 255; const TRANSACTIONAL_LIMIT: Layer = 255;
pub fn get_transaction_level() -> Layer { pub fn get_transaction_level() -> Layer {
NUM_LEVELS.load(Ordering::SeqCst) crate::storage::unhashed::get_or_default::<Layer>(TRANSACTION_LEVEL_KEY)
}
fn set_transaction_level(level: &Layer) {
crate::storage::unhashed::put::<Layer>(TRANSACTION_LEVEL_KEY, level);
}
fn kill_transaction_level() {
crate::storage::unhashed::kill(TRANSACTION_LEVEL_KEY);
} }
/// Increments the transaction level. Returns an error if levels go past the limit. /// Increments the transaction level. Returns an error if levels go past the limit.
/// ///
/// Returns a guard that when dropped decrements the transaction level automatically. /// Returns a guard that when dropped decrements the transaction level automatically.
pub fn inc_transaction_level() -> Result<StorageLayerGuard, ()> { pub fn inc_transaction_level() -> Result<StorageLayerGuard, ()> {
NUM_LEVELS let existing_levels = get_transaction_level();
.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |existing_levels| { if existing_levels >= TRANSACTIONAL_LIMIT {
if existing_levels >= TRANSACTIONAL_LIMIT { return Err(())
return None }
} // Cannot overflow because of check above.
// Cannot overflow because of check above. set_transaction_level(&(existing_levels + 1));
Some(existing_levels + 1)
})
.map_err(|_| ())?;
Ok(StorageLayerGuard) Ok(StorageLayerGuard)
} }
fn dec_transaction_level() { fn dec_transaction_level() {
NUM_LEVELS let existing_levels = get_transaction_level();
.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |existing_levels| { if existing_levels == 0 {
if existing_levels == 0 { log::warn!(
log::warn!( "We are underflowing with calculating transactional levels. Not great, but let's not panic...",
"We are underflowing with calculating transactional levels. Not great, but let's not panic...", );
); } else if existing_levels == 1 {
None // Don't leave any trace of this storage item.
} else { kill_transaction_level();
// Cannot underflow because of checks above. } else {
Some(existing_levels - 1) // Cannot underflow because of checks above.
} set_transaction_level(&(existing_levels - 1));
}) }
.ok();
} }
pub fn is_transactional() -> bool { pub fn is_transactional() -> bool {