1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::sync::Arc;
use configuration::{ConfigChange, ConfigManager, Configuration};
use tikv_util::config::{ReadableSize, VersionTrack};
const DEFAULT_GC_RATIO_THRESHOLD: f64 = 1.1;
pub const DEFAULT_GC_BATCH_KEYS: usize = 512;
const DEFAULT_GC_MAX_WRITE_BYTES_PER_SEC: u64 = 0;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Configuration)]
#[serde(default)]
#[serde(rename_all = "kebab-case")]
pub struct GcConfig {
pub ratio_threshold: f64,
pub batch_keys: usize,
pub max_write_bytes_per_sec: ReadableSize,
pub enable_compaction_filter: bool,
pub compaction_filter_skip_version_check: bool,
}
impl Default for GcConfig {
fn default() -> GcConfig {
GcConfig {
ratio_threshold: DEFAULT_GC_RATIO_THRESHOLD,
batch_keys: DEFAULT_GC_BATCH_KEYS,
max_write_bytes_per_sec: ReadableSize(DEFAULT_GC_MAX_WRITE_BYTES_PER_SEC),
enable_compaction_filter: true,
compaction_filter_skip_version_check: false,
}
}
}
impl GcConfig {
pub fn validate(&self) -> std::result::Result<(), Box<dyn std::error::Error>> {
if self.batch_keys == 0 {
return Err("gc.batch_keys should not be 0".into());
}
Ok(())
}
}
#[derive(Clone, Default)]
pub struct GcWorkerConfigManager(pub Arc<VersionTrack<GcConfig>>);
impl ConfigManager for GcWorkerConfigManager {
fn dispatch(
&mut self,
change: ConfigChange,
) -> std::result::Result<(), Box<dyn std::error::Error>> {
{
let change = change.clone();
self.0.update(move |cfg: &mut GcConfig| cfg.update(change));
}
info!(
"GC worker config changed";
"change" => ?change,
);
Ok(())
}
}
impl std::ops::Deref for GcWorkerConfigManager {
type Target = Arc<VersionTrack<GcConfig>>;
fn deref(&self) -> &Self::Target {
&self.0
}
}