Skip to content

Commit f98fb4d

Browse files
authored
Merge branch 'main' into window-sort
2 parents 83a35b0 + ddf4099 commit f98fb4d

File tree

32 files changed

+729
-406
lines changed

32 files changed

+729
-406
lines changed

Cargo.lock

Lines changed: 162 additions & 156 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/common/building/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ test = true
1414
anyhow = { workspace = true }
1515
cargo-license = "0.6.1"
1616
cargo_metadata = "0.18"
17-
gix = "0.62.0"
17+
gix = "0.63.0"
1818
log = { workspace = true }
1919
vergen = { version = "8.3.1", default-features = false, features = ["build", "cargo", "git", "gix", "rustc"] }

src/meta/raft-store/src/sm_v002/leveled_store/arc_level_impl.rs renamed to src/meta/raft-store/src/sm_v002/leveled_store/immutable.rs

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
use std::borrow::Borrow;
1616
use std::io;
17+
use std::ops::Deref;
1718
use std::ops::RangeBounds;
1819
use std::sync::Arc;
1920

@@ -27,10 +28,50 @@ use crate::sm_v002::leveled_store::map_api::MarkedOf;
2728
use crate::sm_v002::marked::Marked;
2829
use crate::state_machine::ExpireKey;
2930

30-
impl Level {
31+
/// A single **immutable** level of state machine data.
32+
///
33+
/// Immutable level implement only [`MapApiRO`], but not [`MapApi`].
34+
///
35+
/// [`MapApi`]: crate::sm_v002::leveled_store::map_api::MapApi
36+
#[derive(Debug, Clone)]
37+
pub struct Immutable {
38+
level: Arc<Level>,
39+
}
40+
41+
impl Immutable {
42+
pub fn new(level: Arc<Level>) -> Self {
43+
Self { level }
44+
}
45+
46+
pub fn new_from_level(level: Level) -> Self {
47+
Self {
48+
level: Arc::new(level),
49+
}
50+
}
51+
52+
pub fn inner(&self) -> &Arc<Level> {
53+
&self.level
54+
}
55+
}
56+
57+
impl AsRef<Level> for Immutable {
58+
fn as_ref(&self) -> &Level {
59+
self.level.as_ref()
60+
}
61+
}
62+
63+
impl Deref for Immutable {
64+
type Target = Level;
65+
66+
fn deref(&self) -> &Self::Target {
67+
self.level.as_ref()
68+
}
69+
}
70+
71+
impl Immutable {
3172
/// Build a static stream that yields key values for primary index
3273
#[futures_async_stream::try_stream(boxed, ok = MapKV<String>, error = io::Error)]
33-
async fn str_range<Q, R>(self: Arc<Level>, range: R)
74+
async fn str_range<Q, R>(self: Immutable, range: R)
3475
where
3576
String: Borrow<Q>,
3677
Q: Ord + Send + Sync + ?Sized,
@@ -45,7 +86,7 @@ impl Level {
4586

4687
/// Build a static stream that yields expire key and key for the secondary expiration index
4788
#[futures_async_stream::try_stream(boxed, ok = MapKV<ExpireKey>, error = io::Error)]
48-
async fn expire_range<Q, R>(self: Arc<Level>, range: R)
89+
async fn expire_range<Q, R>(self: Immutable, range: R)
4990
where
5091
ExpireKey: Borrow<Q>,
5192
Q: Ord + Send + Sync + ?Sized,
@@ -60,7 +101,7 @@ impl Level {
60101
}
61102

62103
#[async_trait::async_trait]
63-
impl MapApiRO<String> for Arc<Level> {
104+
impl MapApiRO<String> for Immutable {
64105
async fn get<Q>(&self, key: &Q) -> Result<Marked<<String as MapKey>::V>, io::Error>
65106
where
66107
String: Borrow<Q>,
@@ -78,7 +119,7 @@ impl MapApiRO<String> for Arc<Level> {
78119
}
79120

80121
#[async_trait::async_trait]
81-
impl MapApiRO<ExpireKey> for Arc<Level> {
122+
impl MapApiRO<ExpireKey> for Immutable {
82123
async fn get<Q>(&self, key: &Q) -> Result<MarkedOf<ExpireKey>, io::Error>
83124
where
84125
ExpireKey: Borrow<Q>,

src/meta/raft-store/src/sm_v002/leveled_store/static_levels.rs renamed to src/meta/raft-store/src/sm_v002/leveled_store/immutable_levels.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
use std::borrow::Borrow;
1616
use std::io;
1717
use std::ops::RangeBounds;
18-
use std::sync::Arc;
1918

19+
use crate::sm_v002::leveled_store::immutable::Immutable;
2020
use crate::sm_v002::leveled_store::level::Level;
2121
use crate::sm_v002::leveled_store::map_api::compacted_get;
2222
use crate::sm_v002::leveled_store::map_api::compacted_range;
@@ -28,20 +28,20 @@ use crate::sm_v002::marked::Marked;
2828

2929
/// A readonly leveled map that owns the data.
3030
#[derive(Debug, Default, Clone)]
31-
pub struct StaticLevels {
31+
pub struct ImmutableLevels {
3232
/// From oldest to newest, i.e., levels[0] is the oldest
33-
levels: Vec<Arc<Level>>,
33+
levels: Vec<Immutable>,
3434
}
3535

36-
impl StaticLevels {
37-
pub(in crate::sm_v002) fn new(levels: impl IntoIterator<Item = Arc<Level>>) -> Self {
36+
impl ImmutableLevels {
37+
pub(in crate::sm_v002) fn new(levels: impl IntoIterator<Item = Immutable>) -> Self {
3838
Self {
3939
levels: levels.into_iter().collect(),
4040
}
4141
}
4242

4343
/// Return an iterator of all Arc of levels from newest to oldest.
44-
pub(in crate::sm_v002) fn iter_arc_levels(&self) -> impl Iterator<Item = &Arc<Level>> {
44+
pub(in crate::sm_v002) fn iter_immutable_levels(&self) -> impl Iterator<Item = &Immutable> {
4545
self.levels.iter().rev()
4646
}
4747

@@ -50,11 +50,11 @@ impl StaticLevels {
5050
self.levels.iter().map(|x| x.as_ref()).rev()
5151
}
5252

53-
pub(in crate::sm_v002) fn newest(&self) -> Option<&Arc<Level>> {
53+
pub(in crate::sm_v002) fn newest(&self) -> Option<&Immutable> {
5454
self.levels.last()
5555
}
5656

57-
pub(in crate::sm_v002) fn push(&mut self, level: Arc<Level>) {
57+
pub(in crate::sm_v002) fn push(&mut self, level: Immutable) {
5858
self.levels.push(level);
5959
}
6060

@@ -69,24 +69,24 @@ impl StaticLevels {
6969
}
7070

7171
#[async_trait::async_trait]
72-
impl<K> MapApiRO<K> for StaticLevels
72+
impl<K> MapApiRO<K> for ImmutableLevels
7373
where
7474
K: MapKey,
7575
Level: MapApiRO<K>,
76-
Arc<Level>: MapApiRO<K>,
76+
Immutable: MapApiRO<K>,
7777
{
7878
async fn get<Q>(&self, key: &Q) -> Result<Marked<K::V>, io::Error>
7979
where
8080
K: Borrow<Q>,
8181
Q: Ord + Send + Sync + ?Sized,
8282
{
83-
let levels = self.iter_arc_levels();
83+
let levels = self.iter_immutable_levels();
8484
compacted_get(key, levels).await
8585
}
8686

8787
async fn range<R>(&self, range: R) -> Result<KVResultStream<K>, io::Error>
8888
where R: RangeBounds<K> + Clone + Send + Sync + 'static {
89-
let levels = self.iter_arc_levels();
89+
let levels = self.iter_immutable_levels();
9090
compacted_range::<_, _, _, Level>(range, None, levels).await
9191
}
9292
}

src/meta/raft-store/src/sm_v002/leveled_store/leveled_map.rs

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ use std::borrow::Borrow;
1616
use std::fmt;
1717
use std::io;
1818
use std::ops::RangeBounds;
19-
use std::sync::Arc;
2019

2120
use databend_common_meta_types::KVMeta;
2221

22+
use crate::sm_v002::leveled_store::immutable::Immutable;
23+
use crate::sm_v002::leveled_store::immutable_levels::ImmutableLevels;
2324
use crate::sm_v002::leveled_store::level::Level;
2425
use crate::sm_v002::leveled_store::map_api::compacted_get;
2526
use crate::sm_v002::leveled_store::map_api::compacted_range;
@@ -31,7 +32,6 @@ use crate::sm_v002::leveled_store::map_api::MarkedOf;
3132
use crate::sm_v002::leveled_store::map_api::Transition;
3233
use crate::sm_v002::leveled_store::ref_::Ref;
3334
use crate::sm_v002::leveled_store::ref_mut::RefMut;
34-
use crate::sm_v002::leveled_store::static_levels::StaticLevels;
3535
use crate::sm_v002::marked::Marked;
3636

3737
/// State machine data organized in multiple levels.
@@ -46,39 +46,43 @@ pub struct LeveledMap {
4646
writable: Level,
4747

4848
/// The immutable levels.
49-
frozen: StaticLevels,
49+
immutable_levels: ImmutableLevels,
5050
}
5151

5252
impl LeveledMap {
5353
pub(crate) fn new(writable: Level) -> Self {
5454
Self {
5555
writable,
56-
frozen: Default::default(),
56+
immutable_levels: Default::default(),
5757
}
5858
}
5959

6060
/// Return an iterator of all levels in reverse order.
6161
pub(in crate::sm_v002) fn iter_levels(&self) -> impl Iterator<Item = &Level> {
6262
[&self.writable]
6363
.into_iter()
64-
.chain(self.frozen.iter_levels())
64+
.chain(self.immutable_levels.iter_levels())
6565
}
6666

67-
/// Return the top level and an iterator of all frozen levels, in newest to oldest order.
67+
/// Return the top level and an iterator of all immutable levels, in newest to oldest order.
6868
pub(in crate::sm_v002) fn iter_shared_levels(
6969
&self,
70-
) -> (Option<&Level>, impl Iterator<Item = &Arc<Level>>) {
71-
(Some(&self.writable), self.frozen.iter_arc_levels())
70+
) -> (Option<&Level>, impl Iterator<Item = &Immutable>) {
71+
(
72+
Some(&self.writable),
73+
self.immutable_levels.iter_immutable_levels(),
74+
)
7275
}
7376

7477
/// Freeze the current writable level and create a new empty writable level.
75-
pub fn freeze_writable(&mut self) -> &StaticLevels {
78+
pub fn freeze_writable(&mut self) -> &ImmutableLevels {
7679
let new_writable = self.writable.new_level();
7780

78-
let frozen = std::mem::replace(&mut self.writable, new_writable);
79-
self.frozen.push(Arc::new(frozen));
81+
let immutable = std::mem::replace(&mut self.writable, new_writable);
82+
self.immutable_levels
83+
.push(Immutable::new_from_level(immutable));
8084

81-
&self.frozen
85+
&self.immutable_levels
8286
}
8387

8488
/// Return an immutable reference to the top level i.e., the writable level.
@@ -92,22 +96,22 @@ impl LeveledMap {
9296
}
9397

9498
/// Return a reference to the immutable levels.
95-
pub fn frozen_ref(&self) -> &StaticLevels {
96-
&self.frozen
99+
pub fn immutable_levels_ref(&self) -> &ImmutableLevels {
100+
&self.immutable_levels
97101
}
98102

99103
/// Replace all immutable levels with the given one.
100-
pub(crate) fn replace_frozen(&mut self, b: StaticLevels) {
101-
self.frozen = b;
104+
pub(crate) fn replace_immutable_levels(&mut self, b: ImmutableLevels) {
105+
self.immutable_levels = b;
102106
}
103107

104108
pub(crate) fn to_ref_mut(&mut self) -> RefMut {
105-
RefMut::new(&mut self.writable, &self.frozen)
109+
RefMut::new(&mut self.writable, &self.immutable_levels)
106110
}
107111

108112
#[allow(dead_code)]
109113
pub(crate) fn to_ref(&self) -> Ref {
110-
Ref::new(Some(&self.writable), &self.frozen)
114+
Ref::new(Some(&self.writable), &self.immutable_levels)
111115
}
112116
}
113117

@@ -116,7 +120,7 @@ impl<K> MapApiRO<K> for LeveledMap
116120
where
117121
K: MapKey + fmt::Debug,
118122
Level: MapApiRO<K>,
119-
Arc<Level>: MapApiRO<K>,
123+
Immutable: MapApiRO<K>,
120124
{
121125
async fn get<Q>(&self, key: &Q) -> Result<Marked<K::V>, io::Error>
122126
where
@@ -139,7 +143,7 @@ impl<K> MapApi<K> for LeveledMap
139143
where
140144
K: MapKey,
141145
Level: MapApi<K>,
142-
Arc<Level>: MapApiRO<K>,
146+
Immutable: MapApiRO<K>,
143147
{
144148
async fn set(
145149
&mut self,

src/meta/raft-store/src/sm_v002/leveled_store/leveled_map_test.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ async fn test_freeze() -> anyhow::Result<()> {
5151
]);
5252

5353
// Listing from the base level sees the old value.
54-
let frozen = l.frozen_ref();
54+
let immutables = l.immutable_levels_ref();
5555

56-
let got = frozen
56+
let got = immutables
5757
.str_map()
5858
.range(s("")..)
5959
.await?
@@ -193,9 +193,9 @@ async fn test_two_levels() -> anyhow::Result<()> {
193193

194194
// Check base level
195195

196-
let frozen = l.frozen_ref();
196+
let immutables = l.immutable_levels_ref();
197197

198-
let strm = frozen.str_map().range(s("")..).await?;
198+
let strm = immutables.str_map().range(s("")..).await?;
199199
let got = strm.try_collect::<Vec<_>>().await?;
200200
assert_eq!(got, vec![
201201
//

src/meta/raft-store/src/sm_v002/leveled_store/map_api.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ where
223223
/// There could be tombstone entries: [`Marked::TombStone`].
224224
///
225225
/// The `TOP` is the type of the top level.
226-
/// The `L` is the type of frozen levels.
226+
/// The `L` is the type of immutable levels.
227227
///
228-
/// Because the top level is very likely to be a different type from the frozen levels, i.e., it is writable.
228+
/// Because the top level is very likely to be a different type from the immutable levels, i.e., it is writable.
229229
pub(in crate::sm_v002) async fn compacted_range<'d, K, R, L, TOP>(
230230
range: R,
231231
top: Option<&'d TOP>,
@@ -257,10 +257,10 @@ where
257257

258258
#[cfg(test)]
259259
mod tests {
260-
use std::sync::Arc;
261260

262261
use futures_util::TryStreamExt;
263262

263+
use crate::sm_v002::leveled_store::immutable::Immutable;
264264
use crate::sm_v002::leveled_store::level::Level;
265265
use crate::sm_v002::leveled_store::map_api::compacted_get;
266266
use crate::sm_v002::leveled_store::map_api::compacted_range;
@@ -301,12 +301,12 @@ mod tests {
301301
let mut l0 = Level::default();
302302
l0.set(s("a"), Some((b("a"), None))).await?;
303303
l0.set(s("b"), Some((b("b"), None))).await?;
304-
let l0 = Arc::new(l0);
304+
let l0 = Immutable::new_from_level(l0);
305305

306306
let mut l1 = l0.new_level();
307307
l1.set(s("a"), None).await?;
308308
l1.set(s("c"), None).await?;
309-
let l1 = Arc::new(l1);
309+
let l1 = Immutable::new_from_level(l1);
310310

311311
let mut l2 = l1.new_level();
312312
l2.set(s("b"), Some((b("b2"), None))).await?;

src/meta/raft-store/src/sm_v002/leveled_store/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
mod arc_level_impl;
15+
pub mod immutable;
16+
pub mod immutable_levels;
1617
pub mod level;
1718
pub mod leveled_map;
1819
pub mod map_api;
1920
pub mod ref_;
2021
pub mod ref_mut;
21-
pub mod static_levels;
2222
pub mod sys_data;
2323
pub mod sys_data_api;
2424
pub mod util;

0 commit comments

Comments
 (0)