1use std::time::Duration;
16
17use serde::{Deserialize, Serialize};
18use snafu::ensure;
19
20use crate::error::{self, Result};
21
22#[allow(unused)]
24pub(crate) const TICKER_INTERVAL: Duration = Duration::from_secs(60 * 5);
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
30#[serde(default)]
31pub struct GcSchedulerOptions {
32 pub enable: bool,
36 pub max_concurrent_tables: usize,
38 pub max_retries_per_region: usize,
40 pub region_gc_concurrency: usize,
42 #[serde(with = "humantime_serde")]
44 pub retry_backoff_duration: Duration,
45 pub min_region_size_threshold: u64,
47 pub sst_count_weight: f64,
49 pub file_removed_count_weight: f64,
51 #[serde(with = "humantime_serde")]
53 pub gc_cooldown_period: Duration,
54 pub regions_per_table_threshold: usize,
56 #[serde(with = "humantime_serde")]
58 pub mailbox_timeout: Duration,
59 #[serde(with = "humantime_serde")]
64 pub full_file_listing_interval: Duration,
65 #[serde(with = "humantime_serde")]
69 pub tracker_cleanup_interval: Duration,
70}
71
72impl Default for GcSchedulerOptions {
73 fn default() -> Self {
74 Self {
75 enable: false,
76 max_concurrent_tables: 10,
77 max_retries_per_region: 3,
78 retry_backoff_duration: Duration::from_secs(5),
79 region_gc_concurrency: 16,
80 min_region_size_threshold: 100 * 1024 * 1024, sst_count_weight: 0.5, file_removed_count_weight: 1.0, gc_cooldown_period: Duration::from_secs(60 * 5), regions_per_table_threshold: 20, mailbox_timeout: Duration::from_secs(60), full_file_listing_interval: Duration::from_secs(60 * 60 * 24),
88 tracker_cleanup_interval: Duration::from_secs(60 * 60 * 6),
90 }
91 }
92}
93
94impl GcSchedulerOptions {
95 pub fn validate(&self) -> Result<()> {
97 ensure!(
98 self.max_concurrent_tables > 0,
99 error::InvalidArgumentsSnafu {
100 err_msg: "max_concurrent_tables must be greater than 0",
101 }
102 );
103
104 ensure!(
105 self.max_retries_per_region > 0,
106 error::InvalidArgumentsSnafu {
107 err_msg: "max_retries_per_region must be greater than 0",
108 }
109 );
110
111 ensure!(
112 self.region_gc_concurrency > 0,
113 error::InvalidArgumentsSnafu {
114 err_msg: "region_gc_concurrency must be greater than 0",
115 }
116 );
117
118 ensure!(
119 !self.retry_backoff_duration.is_zero(),
120 error::InvalidArgumentsSnafu {
121 err_msg: "retry_backoff_duration must be greater than 0",
122 }
123 );
124
125 ensure!(
126 self.sst_count_weight >= 0.0,
127 error::InvalidArgumentsSnafu {
128 err_msg: "sst_count_weight must be non-negative",
129 }
130 );
131
132 ensure!(
133 self.file_removed_count_weight >= 0.0,
134 error::InvalidArgumentsSnafu {
135 err_msg: "file_removal_rate_weight must be non-negative",
136 }
137 );
138
139 ensure!(
140 !self.gc_cooldown_period.is_zero(),
141 error::InvalidArgumentsSnafu {
142 err_msg: "gc_cooldown_period must be greater than 0",
143 }
144 );
145
146 ensure!(
147 self.regions_per_table_threshold > 0,
148 error::InvalidArgumentsSnafu {
149 err_msg: "regions_per_table_threshold must be greater than 0",
150 }
151 );
152
153 ensure!(
154 !self.mailbox_timeout.is_zero(),
155 error::InvalidArgumentsSnafu {
156 err_msg: "mailbox_timeout must be greater than 0",
157 }
158 );
159
160 ensure!(
161 !self.full_file_listing_interval.is_zero(),
162 error::InvalidArgumentsSnafu {
163 err_msg: "full_file_listing_interval must be greater than 0",
164 }
165 );
166
167 ensure!(
168 !self.tracker_cleanup_interval.is_zero(),
169 error::InvalidArgumentsSnafu {
170 err_msg: "tracker_cleanup_interval must be greater than 0",
171 }
172 );
173
174 Ok(())
175 }
176}