diff --git a/src/memtable/mod.rs b/src/memtable/mod.rs index 9ac40d5..d755cc7 100644 --- a/src/memtable/mod.rs +++ b/src/memtable/mod.rs @@ -36,7 +36,7 @@ where #[derive(Default)] pub struct Memtable { #[doc(hidden)] - items: SkipMap, + pub items: SkipMap, /// Approximate active memtable size /// @@ -45,6 +45,13 @@ pub struct Memtable { } impl Memtable { + /// Clears the memtable. + pub fn clear(&mut self) { + self.items.clear(); + self.approximate_size + .store(0, std::sync::atomic::Ordering::Release); + } + /// Creates an iterator over all items. pub fn iter(&self) -> impl DoubleEndedIterator + '_ { self.items.iter().map(|entry| InternalValue { diff --git a/src/tree/mod.rs b/src/tree/mod.rs index 9129cc0..7ae6371 100644 --- a/src/tree/mod.rs +++ b/src/tree/mod.rs @@ -177,6 +177,7 @@ impl AbstractTree for Tree { })?; for segment in segments { + log::trace!("releasing sealed memtable {}", segment.metadata.id); sealed_memtables.remove(segment.metadata.id); } @@ -239,13 +240,13 @@ impl AbstractTree for Tree { log::trace!("rotate: acquiring active memtable write lock"); let mut active_memtable = self.lock_active_memtable(); + log::trace!("rotate: acquiring sealed memtables write lock"); + let mut sealed_memtables = self.lock_sealed_memtables(); + if active_memtable.is_empty() { return None; } - log::trace!("rotate: acquiring sealed memtables write lock"); - let mut sealed_memtables = self.lock_sealed_memtables(); - let yanked_memtable = std::mem::take(&mut *active_memtable); let yanked_memtable = Arc::new(yanked_memtable);