Skip to content

Commit 462a597

Browse files
authored
In-memory Engine: defining hybrid engine (tikv#16114)
ref tikv#16141 Introduce hybrid engine which implements KvEngine but without detailed implementation. Signed-off-by: SpadeA-Tang <[email protected]>
1 parent 99916c0 commit 462a597

26 files changed

+1004
-1
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ failpoints = ["fail/failpoints", "raftstore/failpoints", "tikv_util/failpoints",
2525
cloud-aws = ["encryption_export/cloud-aws"]
2626
cloud-gcp = ["encryption_export/cloud-gcp"]
2727
cloud-azure = ["encryption_export/cloud-azure"]
28-
testexport = ["raftstore/testexport", "api_version/testexport", "causal_ts/testexport", "engine_traits/testexport", "engine_rocks/testexport", "engine_panic/testexport"]
28+
testexport = ["raftstore/testexport", "api_version/testexport", "causal_ts/testexport", "engine_traits/testexport", "engine_rocks/testexport", "engine_panic/testexport", "hybrid_engine/testexport"]
2929
test-engine-kv-rocksdb = ["engine_test/test-engine-kv-rocksdb"]
3030
test-engine-raft-raft-engine = ["engine_test/test-engine-raft-raft-engine"]
3131
test-engines-rocksdb = ["engine_test/test-engines-rocksdb"]
@@ -90,6 +90,7 @@ grpcio = { workspace = true }
9090
grpcio-health = { workspace = true }
9191
hex = "0.4"
9292
http = "0"
93+
hybrid_engine = { workspace = true }
9394
hyper = { version = "0.14", features = ["full"] }
9495
hyper-tls = "0.5"
9596
into_other = { workspace = true }
@@ -319,6 +320,7 @@ encryption = { path = "components/encryption" }
319320
encryption_export = { path = "components/encryption/export" }
320321
engine_panic = { path = "components/engine_panic" }
321322
engine_rocks = { path = "components/engine_rocks" }
323+
hybrid_engine = { path = "components/hybrid_engine" }
322324
engine_rocks_helper = { path = "components/engine_rocks_helper" }
323325
engine_test = { path = "components/engine_test", default-features = false }
324326
engine_traits = { path = "components/engine_traits" }

components/engine_traits/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ mod table_properties;
312312
pub use crate::table_properties::*;
313313
mod checkpoint;
314314
pub use crate::checkpoint::*;
315+
mod memory_engine;
316+
pub use memory_engine::RegionCacheEngine;
315317

316318
// These modules contain more general traits, some of which may be implemented
317319
// by multiple types.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use std::fmt::Debug;
4+
5+
use crate::{Iterable, Snapshot, WriteBatchExt};
6+
7+
/// RegionCacheEngine works as a region cache caching some regions (in Memory or
8+
/// NVME for instance) to improve the read performance.
9+
pub trait RegionCacheEngine:
10+
WriteBatchExt + Iterable + Debug + Clone + Unpin + Send + Sync + 'static
11+
{
12+
type Snapshot: Snapshot;
13+
14+
// If None is returned, the RegionCacheEngine is currently not readable for this
15+
// region or read_ts.
16+
fn snapshot(&self, region_id: u64, read_ts: u64) -> Option<Self::Snapshot>;
17+
}

components/hybrid_engine/Cargo.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[package]
2+
name = "hybrid_engine"
3+
version = "0.0.1"
4+
edition = "2021"
5+
publish = false
6+
7+
[features]
8+
testexport = []
9+
10+
[dependencies]
11+
engine_traits = { workspace = true }
12+
txn_types = { workspace = true }
13+
tikv_util = { workspace = true }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use engine_traits::{CfNamesExt, KvEngine, RegionCacheEngine};
4+
5+
use crate::engine::HybridEngine;
6+
7+
impl<EK, EC> CfNamesExt for HybridEngine<EK, EC>
8+
where
9+
EK: KvEngine,
10+
EC: RegionCacheEngine,
11+
{
12+
fn cf_names(&self) -> Vec<&str> {
13+
self.disk_engine().cf_names()
14+
}
15+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use engine_traits::{CfOptionsExt, KvEngine, RegionCacheEngine, Result};
4+
5+
use crate::engine::HybridEngine;
6+
7+
impl<EK, EC> CfOptionsExt for HybridEngine<EK, EC>
8+
where
9+
EK: KvEngine,
10+
EC: RegionCacheEngine,
11+
{
12+
type CfOptions = EK::CfOptions;
13+
14+
fn get_options_cf(&self, cf: &str) -> Result<Self::CfOptions> {
15+
self.disk_engine().get_options_cf(cf)
16+
}
17+
18+
fn set_options_cf(&self, cf: &str, options: &[(&str, &str)]) -> Result<()> {
19+
self.disk_engine().set_options_cf(cf, options)
20+
}
21+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use engine_traits::{Checkpointable, KvEngine, RegionCacheEngine, Result};
4+
5+
use crate::engine::HybridEngine;
6+
7+
impl<EK, EC> Checkpointable for HybridEngine<EK, EC>
8+
where
9+
EK: KvEngine,
10+
EC: RegionCacheEngine,
11+
{
12+
type Checkpointer = EK::Checkpointer;
13+
14+
fn new_checkpointer(&self) -> Result<Self::Checkpointer> {
15+
self.disk_engine().new_checkpointer()
16+
}
17+
18+
fn merge(&self, dbs: &[&Self]) -> Result<()> {
19+
let disk_dbs: Vec<_> = dbs.iter().map(|&db| db.disk_engine()).collect();
20+
self.disk_engine().merge(&disk_dbs)
21+
}
22+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use engine_traits::{CompactExt, KvEngine, RegionCacheEngine, Result};
4+
5+
use crate::engine::HybridEngine;
6+
7+
impl<EK, EC> CompactExt for HybridEngine<EK, EC>
8+
where
9+
EK: KvEngine,
10+
EC: RegionCacheEngine,
11+
{
12+
type CompactedEvent = EK::CompactedEvent;
13+
14+
fn auto_compactions_is_disabled(&self) -> Result<bool> {
15+
self.disk_engine().auto_compactions_is_disabled()
16+
}
17+
18+
fn compact_range_cf(
19+
&self,
20+
cf: &str,
21+
start_key: Option<&[u8]>,
22+
end_key: Option<&[u8]>,
23+
exclusive_manual: bool,
24+
max_subcompactions: u32,
25+
) -> Result<()> {
26+
self.disk_engine().compact_range_cf(
27+
cf,
28+
start_key,
29+
end_key,
30+
exclusive_manual,
31+
max_subcompactions,
32+
)
33+
}
34+
35+
fn compact_files_in_range_cf(
36+
&self,
37+
cf: &str,
38+
start: Option<&[u8]>,
39+
end: Option<&[u8]>,
40+
output_level: Option<i32>,
41+
) -> Result<()> {
42+
self.disk_engine()
43+
.compact_files_in_range_cf(cf, start, end, output_level)
44+
}
45+
46+
fn compact_files_in_range(
47+
&self,
48+
start: Option<&[u8]>,
49+
end: Option<&[u8]>,
50+
output_level: Option<i32>,
51+
) -> Result<()> {
52+
self.disk_engine()
53+
.compact_files_in_range(start, end, output_level)
54+
}
55+
56+
fn compact_files_cf(
57+
&self,
58+
cf: &str,
59+
files: Vec<String>,
60+
output_level: Option<i32>,
61+
max_subcompactions: u32,
62+
exclude_l0: bool,
63+
) -> Result<()> {
64+
self.disk_engine()
65+
.compact_files_cf(cf, files, output_level, max_subcompactions, exclude_l0)
66+
}
67+
68+
fn check_in_range(&self, start: Option<&[u8]>, end: Option<&[u8]>) -> Result<()> {
69+
self.disk_engine().check_in_range(start, end)
70+
}
71+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use engine_traits::{DbOptionsExt, KvEngine, RegionCacheEngine, Result};
4+
5+
use crate::engine::HybridEngine;
6+
7+
impl<EK, EC> DbOptionsExt for HybridEngine<EK, EC>
8+
where
9+
EK: KvEngine,
10+
EC: RegionCacheEngine,
11+
{
12+
type DbOptions = EK::DbOptions;
13+
14+
fn get_db_options(&self) -> Self::DbOptions {
15+
self.disk_engine().get_db_options()
16+
}
17+
18+
fn set_db_options(&self, options: &[(&str, &str)]) -> Result<()> {
19+
self.disk_engine().set_db_options(options)
20+
}
21+
}

0 commit comments

Comments
 (0)