Skip to content

Commit d836a02

Browse files
committed
temporarily add memtable_size_sum
1 parent 4650397 commit d836a02

File tree

7 files changed

+74
-37
lines changed

7 files changed

+74
-37
lines changed

src/abstract.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ pub type RangeItem = crate::Result<KvPair>;
2525
/// Generic Tree API
2626
#[enum_dispatch]
2727
pub trait AbstractTree {
28+
// TODO: remove
29+
#[doc(hidden)]
30+
fn version_memtable_size_sum(&self) -> u64 {
31+
self.get_version_history_lock().memtable_size_sum()
32+
}
33+
2834
#[doc(hidden)]
2935
fn next_table_id(&self) -> TableId;
3036

@@ -79,16 +85,16 @@ pub trait AbstractTree {
7985
let sealed_ids = latest
8086
.sealed_memtables
8187
.iter()
82-
.map(|mt| mt.0)
88+
.map(|mt| mt.id)
8389
.collect::<Vec<_>>();
8490

85-
let flushed_size = latest.sealed_memtables.iter().map(|(_, x)| x.size()).sum();
91+
let flushed_size = latest.sealed_memtables.iter().map(|mt| mt.size()).sum();
8692

8793
let merger = Merger::new(
8894
latest
8995
.sealed_memtables
9096
.iter()
91-
.map(|(_, mt)| mt.iter().map(Ok))
97+
.map(|mt| mt.iter().map(Ok))
9298
.collect::<Vec<_>>(),
9399
);
94100
let stream = CompactionStream::new(merger, seqno_threshold);
@@ -258,7 +264,7 @@ pub trait AbstractTree {
258264
/// Adds a sealed memtables.
259265
///
260266
/// May be used to restore the LSM-tree's in-memory state from some journals.
261-
fn add_sealed_memtable(&self, id: MemtableId, memtable: Arc<Memtable>);
267+
fn add_sealed_memtable(&self, memtable: Arc<Memtable>);
262268

263269
/// Performs compaction on the tree's levels, blocking the caller until it's done.
264270
///

src/blob_tree/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,8 +610,8 @@ impl AbstractTree for BlobTree {
610610
self.index.set_active_memtable(memtable);
611611
}
612612

613-
fn add_sealed_memtable(&self, id: MemtableId, memtable: Arc<Memtable>) {
614-
self.index.add_sealed_memtable(id, memtable);
613+
fn add_sealed_memtable(&self, memtable: Arc<Memtable>) {
614+
self.index.add_sealed_memtable(memtable);
615615
}
616616

617617
fn compact(

src/memtable/mod.rs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// (found in the LICENSE-* files in the repository)
44

55
use crate::key::InternalKey;
6+
use crate::tree::inner::MemtableId;
67
use crate::{
78
value::{InternalValue, SeqNo, UserValue},
89
ValueType,
@@ -14,8 +15,10 @@ use std::sync::atomic::AtomicU64;
1415
/// The memtable serves as an intermediary, ephemeral, sorted storage for new items
1516
///
1617
/// When the Memtable exceeds some size, it should be flushed to a table.
17-
#[derive(Default)]
1818
pub struct Memtable {
19+
#[doc(hidden)]
20+
pub id: MemtableId,
21+
1922
/// The actual content, stored in a lock-free skiplist.
2023
#[doc(hidden)]
2124
pub items: SkipMap<InternalKey, UserValue>,
@@ -32,6 +35,17 @@ pub struct Memtable {
3235
}
3336

3437
impl Memtable {
38+
#[doc(hidden)]
39+
#[must_use]
40+
pub fn new(id: MemtableId) -> Self {
41+
Self {
42+
id,
43+
items: SkipMap::default(),
44+
approximate_size: AtomicU64::default(),
45+
highest_seqno: AtomicU64::default(),
46+
}
47+
}
48+
3549
/// Clears the memtable.
3650
pub fn clear(&mut self) {
3751
self.items.clear();
@@ -161,7 +175,7 @@ mod tests {
161175
#[test]
162176
#[expect(clippy::unwrap_used)]
163177
fn memtable_mvcc_point_read() {
164-
let memtable = Memtable::default();
178+
let memtable = Memtable::new(0);
165179

166180
memtable.insert(InternalValue::from_components(
167181
*b"hello-key-999991",
@@ -204,7 +218,7 @@ mod tests {
204218

205219
#[test]
206220
fn memtable_get() {
207-
let memtable = Memtable::default();
221+
let memtable = Memtable::new(0);
208222

209223
let value =
210224
InternalValue::from_components(b"abc".to_vec(), b"abc".to_vec(), 0, ValueType::Value);
@@ -216,7 +230,7 @@ mod tests {
216230

217231
#[test]
218232
fn memtable_get_highest_seqno() {
219-
let memtable = Memtable::default();
233+
let memtable = Memtable::new(0);
220234

221235
memtable.insert(InternalValue::from_components(
222236
b"abc".to_vec(),
@@ -262,7 +276,7 @@ mod tests {
262276

263277
#[test]
264278
fn memtable_get_prefix() {
265-
let memtable = Memtable::default();
279+
let memtable = Memtable::new(0);
266280

267281
memtable.insert(InternalValue::from_components(
268282
b"abc0".to_vec(),
@@ -300,7 +314,7 @@ mod tests {
300314

301315
#[test]
302316
fn memtable_get_old_version() {
303-
let memtable = Memtable::default();
317+
let memtable = Memtable::new(0);
304318

305319
memtable.insert(InternalValue::from_components(
306320
b"abc".to_vec(),

src/range.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ impl TreeIter {
192192
}
193193

194194
// Sealed memtables
195-
for (_, memtable) in lock.version.sealed_memtables.iter() {
195+
for memtable in lock.version.sealed_memtables.iter() {
196196
let iter = memtable.range(range.clone());
197197

198198
iters.push(Box::new(

src/tree/mod.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ impl AbstractTree for Tree {
455455
.write()
456456
.expect("lock is poisoned")
457457
.latest_version()
458-
.active_memtable = Arc::new(Memtable::default());
458+
.active_memtable = Arc::new(Memtable::new(self.memtable_id_counter.next()));
459459
}
460460

461461
fn set_active_memtable(&self, memtable: Memtable) {
@@ -466,9 +466,9 @@ impl AbstractTree for Tree {
466466
.active_memtable = Arc::new(memtable);
467467
}
468468

469-
fn add_sealed_memtable(&self, id: MemtableId, memtable: Arc<Memtable>) {
469+
fn add_sealed_memtable(&self, memtable: Arc<Memtable>) {
470470
let mut version_lock = self.version_history.write().expect("lock is poisoned");
471-
version_lock.append_sealed_memtable(id, memtable);
471+
version_lock.append_sealed_memtable(memtable);
472472
}
473473

474474
fn compact(
@@ -522,20 +522,19 @@ impl AbstractTree for Tree {
522522
}
523523

524524
let yanked_memtable = super_version.active_memtable;
525-
let memtable_id = self.0.memtable_id_counter.next();
526525

527526
let mut copy = version_history_lock.latest_version();
528527
copy.seqno = self.config.seqno.next();
529-
copy.active_memtable = Arc::new(Memtable::default());
530-
copy.sealed_memtables = Arc::new(
531-
super_version
532-
.sealed_memtables
533-
.add(memtable_id, yanked_memtable.clone()),
534-
);
528+
copy.active_memtable = Arc::new(Memtable::new(self.memtable_id_counter.next()));
529+
copy.sealed_memtables =
530+
Arc::new(super_version.sealed_memtables.add(yanked_memtable.clone()));
535531

536532
version_history_lock.append_version(copy);
537533

538-
log::trace!("rotate: added memtable id={memtable_id} to sealed memtables");
534+
log::trace!(
535+
"rotate: added memtable id={} to sealed memtables",
536+
yanked_memtable.id,
537+
);
539538

540539
Some(yanked_memtable)
541540
}
@@ -566,7 +565,7 @@ impl AbstractTree for Tree {
566565
let sealed_count = super_version
567566
.sealed_memtables
568567
.iter()
569-
.map(|(_, mt)| mt.len())
568+
.map(|mt| mt.len())
570569
.sum::<usize>() as u64;
571570

572571
(memtable_count + sealed_count + tables_item_count)
@@ -594,7 +593,7 @@ impl AbstractTree for Tree {
594593
let sealed = version
595594
.sealed_memtables
596595
.iter()
597-
.map(|(_, table)| table.get_highest_seqno())
596+
.map(|mt| mt.get_highest_seqno())
598597
.max()
599598
.flatten();
600599

@@ -729,8 +728,8 @@ impl Tree {
729728
key: &[u8],
730729
seqno: SeqNo,
731730
) -> Option<InternalValue> {
732-
for (_, memtable) in super_version.sealed_memtables.iter().rev() {
733-
if let Some(entry) = memtable.get(key, seqno) {
731+
for mt in super_version.sealed_memtables.iter().rev() {
732+
if let Some(entry) = mt.get(key, seqno) {
734733
return Some(entry);
735734
}
736735
}

src/tree/sealed.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,24 @@ use std::sync::Arc;
1010
/// Memtable IDs are monotonically increasing, so we don't really
1111
/// need a search tree; also there are only a handful of them at most.
1212
#[derive(Clone, Default)]
13-
pub struct SealedMemtables(Vec<(MemtableId, Arc<Memtable>)>);
13+
pub struct SealedMemtables(Vec<Arc<Memtable>>);
1414

1515
impl SealedMemtables {
1616
/// Copy-and-writes a new list with additional Memtable.
17-
pub fn add(&self, id: MemtableId, memtable: Arc<Memtable>) -> Self {
17+
pub fn add(&self, memtable: Arc<Memtable>) -> Self {
1818
let mut copy = self.clone();
19-
copy.0.push((id, memtable));
19+
copy.0.push(memtable);
2020
copy
2121
}
2222

2323
/// Copy-and-writes a new list with the specified Memtable removed.
2424
pub fn remove(&self, id_to_remove: MemtableId) -> Self {
2525
let mut copy = self.clone();
26-
copy.0.retain(|(id, _)| *id != id_to_remove);
26+
copy.0.retain(|mt| mt.id != id_to_remove);
2727
copy
2828
}
2929

30-
pub fn iter(&self) -> impl DoubleEndedIterator<Item = &(MemtableId, Arc<Memtable>)> {
30+
pub fn iter(&self) -> impl DoubleEndedIterator<Item = &Arc<Memtable>> {
3131
self.0.iter()
3232
}
3333

src/version/super_version.rs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use crate::{
66
memtable::Memtable,
7-
tree::{inner::MemtableId, sealed::SealedMemtables},
7+
tree::sealed::SealedMemtables,
88
version::{persist_version, Version},
99
SeqNo, SequenceNumberCounter,
1010
};
@@ -31,7 +31,7 @@ impl SuperVersions {
3131
pub fn new(version: Version) -> Self {
3232
Self(
3333
vec![SuperVersion {
34-
active_memtable: Arc::default(),
34+
active_memtable: Arc::new(Memtable::new(0)),
3535
sealed_memtables: Arc::default(),
3636
version,
3737
seqno: 0,
@@ -40,6 +40,24 @@ impl SuperVersions {
4040
)
4141
}
4242

43+
pub fn memtable_size_sum(&self) -> u64 {
44+
let mut set = crate::HashMap::default();
45+
46+
for super_version in &self.0 {
47+
set.entry(super_version.active_memtable.id)
48+
.and_modify(|bytes| *bytes += super_version.active_memtable.size())
49+
.or_insert_with(|| super_version.active_memtable.size());
50+
51+
for sealed in super_version.sealed_memtables.iter() {
52+
set.entry(sealed.id)
53+
.and_modify(|bytes| *bytes += sealed.size())
54+
.or_insert_with(|| sealed.size());
55+
}
56+
}
57+
58+
set.into_values().sum()
59+
}
60+
4361
pub fn free_list_len(&self) -> usize {
4462
self.0.len().saturating_sub(1)
4563
}
@@ -140,9 +158,9 @@ impl SuperVersions {
140158
version.expect("should always find a SuperVersion")
141159
}
142160

143-
pub fn append_sealed_memtable(&mut self, id: MemtableId, memtable: Arc<Memtable>) {
161+
pub fn append_sealed_memtable(&mut self, memtable: Arc<Memtable>) {
144162
let mut copy = self.latest_version();
145-
copy.sealed_memtables = Arc::new(copy.sealed_memtables.add(id, memtable));
163+
copy.sealed_memtables = Arc::new(copy.sealed_memtables.add(memtable));
146164
self.0.push_back(copy);
147165
}
148166
}

0 commit comments

Comments
 (0)