Skip to content

Commit fe0c1b7

Browse files
committed
inner layers
1 parent 3a7d0e6 commit fe0c1b7

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

experimental/storage/layered-map/src/layer.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ use aptos_crypto::HashValue;
1111
use aptos_drop_helper::ArcAsyncDrop;
1212
use aptos_infallible::Mutex;
1313
use aptos_metrics_core::IntGaugeVecHelper;
14-
use std::{marker::PhantomData, sync::Arc};
14+
use std::{marker::PhantomData, sync::{Arc, Weak}};
1515

1616
#[derive(Debug)]
1717
struct LayerInner<K: ArcAsyncDrop, V: ArcAsyncDrop> {
1818
peak: FlattenPerfectTree<K, V>,
19+
parent: Weak<LayerInner<K, V>>,
1920
children: Mutex<Vec<Arc<LayerInner<K, V>>>>,
2021
use_case: &'static str,
2122
family: HashValue,
@@ -50,6 +51,7 @@ impl<K: ArcAsyncDrop, V: ArcAsyncDrop> LayerInner<K, V> {
5051
let family = HashValue::random();
5152
Arc::new(Self {
5253
peak: FlattenPerfectTree::new_with_empty_nodes(1),
54+
parent: Weak::new(),
5355
children: Mutex::new(Vec::new()),
5456
use_case,
5557
family,
@@ -61,6 +63,7 @@ impl<K: ArcAsyncDrop, V: ArcAsyncDrop> LayerInner<K, V> {
6163
fn spawn(self: &Arc<Self>, child_peak: FlattenPerfectTree<K, V>, base_layer: u64) -> Arc<Self> {
6264
let child = Arc::new(Self {
6365
peak: child_peak,
66+
parent: Arc::downgrade(self),
6467
children: Mutex::new(Vec::new()),
6568
use_case: self.use_case,
6669
family: self.family,
@@ -108,6 +111,11 @@ impl<K: ArcAsyncDrop, V: ArcAsyncDrop> MapLayer<K, V> {
108111
}
109112
}
110113

114+
pub(crate) fn parent(&self) -> Option<Self> {
115+
let parent_inner = self.inner.parent.upgrade();
116+
parent_inner.map(Self::new)
117+
}
118+
111119
pub fn into_layers_view_after(self, base_layer: MapLayer<K, V>) -> LayeredMap<K, V> {
112120
assert!(base_layer.is_family(&self));
113121
assert!(base_layer.inner.layer >= self.inner.base_layer);

experimental/storage/layered-map/src/map/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,21 @@ where
114114
.into_feet_iter()
115115
.flat_map(|node| DescendantIterator::new(node, self.base_layer()))
116116
}
117+
118+
pub fn inner_maps(&self) -> Vec<Self> {
119+
let mut ret = Vec::new();
120+
121+
let mut current_layer = self.top_layer.clone();
122+
let mut current_layer_num = self.top_layer.layer();
123+
let lowest_layer_num = self.base_layer.layer();
124+
while current_layer_num > lowest_layer_num {
125+
let next_high = current_layer.parent().expect("the next one must exist.");
126+
ret.push(Self::new(next_high.clone(), current_layer));
127+
current_layer = next_high;
128+
current_layer_num = current_layer.layer();
129+
}
130+
ret.reverse();
131+
132+
ret
133+
}
117134
}

0 commit comments

Comments
 (0)