Alter usage collection a bit (#4863)

* alter usage collection a bit

* replace with mutex
This commit is contained in:
Nikolay Volf
2020-02-09 15:11:22 +03:00
committed by GitHub
parent cb567d6b8b
commit 147155359f
2 changed files with 11 additions and 11 deletions
+10 -10
View File
@@ -699,7 +699,7 @@ impl<Block: BlockT> sp_state_machine::Storage<HasherFor<Block>> for DbGenesisSto
/// Used as inner structure under lock in `FrozenForDuration`. /// Used as inner structure under lock in `FrozenForDuration`.
struct Frozen<T: Clone> { struct Frozen<T: Clone> {
at: std::time::Instant, at: std::time::Instant,
value: T, value: Option<T>,
} }
/// Some value frozen for period of time. /// Some value frozen for period of time.
@@ -709,26 +709,26 @@ struct Frozen<T: Clone> {
/// a new value which will be again frozen for `duration`. /// a new value which will be again frozen for `duration`.
pub(crate) struct FrozenForDuration<T: Clone> { pub(crate) struct FrozenForDuration<T: Clone> {
duration: std::time::Duration, duration: std::time::Duration,
value: RwLock<Frozen<T>>, value: parking_lot::Mutex<Frozen<T>>,
} }
impl<T: Clone> FrozenForDuration<T> { impl<T: Clone> FrozenForDuration<T> {
fn new(duration: std::time::Duration, initial: T) -> Self { fn new(duration: std::time::Duration) -> Self {
Self { Self {
duration, duration,
value: Frozen { at: std::time::Instant::now(), value: initial }.into(), value: Frozen { at: std::time::Instant::now(), value: None }.into(),
} }
} }
fn take_or_else<F>(&self, f: F) -> T where F: FnOnce() -> T { fn take_or_else<F>(&self, f: F) -> T where F: FnOnce() -> T {
if self.value.read().at.elapsed() > self.duration { let mut lock = self.value.lock();
let mut write_lock = self.value.write(); if lock.at.elapsed() > self.duration || lock.value.is_none() {
let new_value = f(); let new_value = f();
write_lock.at = std::time::Instant::now(); lock.at = std::time::Instant::now();
write_lock.value = new_value.clone(); lock.value = Some(new_value.clone());
new_value new_value
} else { } else {
self.value.read().value.clone() lock.value.as_ref().expect("checked with lock above").clone()
} }
} }
} }
@@ -818,7 +818,7 @@ impl<Block: BlockT> Backend<Block> {
), ),
import_lock: Default::default(), import_lock: Default::default(),
is_archive: is_archive_pruning, is_archive: is_archive_pruning,
io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), (kvdb::IoStats::empty(), StateUsageInfo::empty())), io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1)),
state_usage: StateUsageStats::new(), state_usage: StateUsageStats::new(),
}) })
} }
+1 -1
View File
@@ -102,7 +102,7 @@ impl<Block: BlockT> LightStorage<Block> {
cache: Arc::new(DbCacheSync(RwLock::new(cache))), cache: Arc::new(DbCacheSync(RwLock::new(cache))),
header_metadata_cache: HeaderMetadataCache::default(), header_metadata_cache: HeaderMetadataCache::default(),
#[cfg(not(target_os = "unknown"))] #[cfg(not(target_os = "unknown"))]
io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1), kvdb::IoStats::empty()), io_stats: FrozenForDuration::new(std::time::Duration::from_secs(1)),
}) })
} }