mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-15 16:11:05 +00:00
Revert "Replace storage access by atomics" (#11156)
This reverts commit a69b8eb4a28f365a4a4b2fc295a693ec4d3d3cd5.
This commit is contained in:
committed by
GitHub
parent
6531ed7430
commit
b8dbe46b3e
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user