Skip to content

Commit fe630c3

Browse files
committed
feat: add cron job to delete deprecated version
1 parent 4a996b5 commit fe630c3

File tree

8 files changed

+448
-12
lines changed

8 files changed

+448
-12
lines changed

Cargo.lock

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

config.release.conf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ file_dir = "/data"
7272
// # max file size allowed to be uploaded,
7373
// # default is 30MB(30*1024*1024)
7474
// max_upload_size = 31457280
75+
76+
// # delete deprecated version by cron
77+
// deprecated_version_delete {
78+
// # default value: every day at 3am.
79+
// cron: "0 0 3 * * *",
80+
// # default value is 2
81+
// max_preserve: 2,
82+
// }
7583
//}
7684

7785

docs/develop/roadmap.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ There is no real roadmap for v1.3.x now, need users firstly.
1515
- [ ] chore: spa-client command help doc
1616
- [ ] bench: add benchmark
1717
- [x] chore(break change): change server docker config and binary location
18+
- [x] feat: add cron job to delete deprecated version
1819
- [x] feat(with client): delete deprecated version to save storage
1920
- [x] feat: Support S3 by docker(backward: release docker image: timzaak/spa-server:1.2.5-s3)
2021
- [x] deps: bump hocon 0.9, fix size unit config parse

docs/guide/spa-server-configuration.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ file_dir = "/data"
8181
// # max file size allowed to be uploaded,
8282
// # default is 30MB(30*1024*1024)
8383
// max_upload_size = 31457280
84+
85+
// # delete deprecated version by cron
86+
// deprecated_version_delete {
87+
// # default value: every day at 3am.
88+
// cron: "0 0 3 * * *",
89+
// # default value is 2
90+
// max_preserve: 2,
91+
// }
8492
//}
8593
8694

server/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ flate2 = "1.0"
4141
# tokio trace and log
4242
tracing = "0.1"
4343
tracing-subscriber = "0.2"
44+
# tokio cron
45+
delay_timer="0.11"
4446

4547
#config
4648
hocon = "0.9"

server/src/admin_server.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ use std::sync::Arc;
1414
use warp::multipart::FormData;
1515
use warp::reply::Response;
1616
use warp::{Filter, Rejection};
17+
#[macro_use]
18+
use delay_timer::prelude::*;
1719

1820
pub struct AdminServer {
1921
conf: AdminConfig,
@@ -55,6 +57,16 @@ impl AdminServer {
5557
let bind_address =
5658
SocketAddr::from_str(&format!("{}:{}", &self.conf.addr, &self.conf.port)).unwrap();
5759
warp::serve(self.routes()).run(bind_address).await;
60+
if let Some(cron_config) = &self.conf.deprecated_version_delete {
61+
let mut delay_timer = DelayTimerBuilder::default()
62+
.tokio_runtime_by_default()
63+
.build();
64+
delay_timer.add_task(build_async_job(
65+
self.domain_storage.clone(),
66+
Some(cron_config.max_reserve),
67+
&cron_config.cron,
68+
)?)?;
69+
}
5870
Ok(())
5971
}
6072

@@ -451,6 +463,30 @@ pub mod request {
451463
}
452464
}
453465

466+
fn build_async_job(
467+
domain_storage: Arc<DomainStorage>,
468+
max_reserve: Option<u32>,
469+
cron: &str,
470+
) -> anyhow::Result<Task> {
471+
let domain_storage = domain_storage.clone();
472+
473+
let body = move || {
474+
service::remove_domain_version(
475+
domain_storage.clone(),
476+
DeleteDomainVersionOption {
477+
domain: None,
478+
max_reserve,
479+
},
480+
);
481+
println!("tt");
482+
};
483+
let builder = TaskBuilder::default()
484+
.set_frequency_repeated_by_cron_str(cron)
485+
.set_task_id(1)
486+
.set_maximum_parallel_runnable_num(1)
487+
.spawn_routine(body)?;
488+
Ok(builder)
489+
}
454490
// TODO: the code structure is not friendly with Unit Test, need refactor it.
455491
#[cfg(test)]
456492
mod test {

server/src/config.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ pub struct AdminConfig {
4444
pub token: String,
4545
#[serde(default = "default_max_upload_size")]
4646
pub max_upload_size: u64,
47+
pub deprecated_version_delete: Option<DeprecatedVersionRemove>,
4748
}
4849

4950
fn default_max_upload_size() -> u64 {
@@ -115,4 +116,17 @@ impl Default for CacheConfig {
115116
compression: false,
116117
}
117118
}
118-
}
119+
}
120+
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
121+
pub struct DeprecatedVersionRemove {
122+
#[serde(default = "default_cron")]
123+
pub cron: String,
124+
#[serde(default = "default_max_reserve")]
125+
pub max_reserve: u32,
126+
}
127+
pub fn default_cron() -> String {
128+
String::from("0 0 3 * * *")
129+
}
130+
pub fn default_max_reserve() -> u32 {
131+
return 2;
132+
}

server/src/lib.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ pub mod file_cache;
99
pub mod hot_reload;
1010
pub mod tls;
1111

12-
pub mod static_file_filter;
13-
pub mod service;
1412
pub mod cors;
13+
pub mod service;
14+
pub mod static_file_filter;
1515

1616
use crate::admin_server::AdminServer;
1717
use crate::config::{AdminConfig, Config};
@@ -44,7 +44,7 @@ fn load_config_and_cache() -> anyhow::Result<(Config, Arc<DomainStorage>)> {
4444
let config = Config::load()?;
4545
tracing::debug!("config load:{:?}", &config);
4646
let cache = FileCache::new(&config);
47-
let domain_storage = Arc::new(DomainStorage::init(&config.file_dir,cache)?);
47+
let domain_storage = Arc::new(DomainStorage::init(&config.file_dir, cache)?);
4848
Ok((config, domain_storage))
4949
}
5050

@@ -58,7 +58,7 @@ pub async fn reload_server(
5858
let config = Config::load()?;
5959
if config.admin_config.as_ref() == Some(admin_config) {
6060
let cache = FileCache::new(&config);
61-
let domain_storage = Arc::new(DomainStorage::init(&config.file_dir,cache)?);
61+
let domain_storage = Arc::new(DomainStorage::init(&config.file_dir, cache)?);
6262
let (state, http_rx, https_rx) = HotReloadState::init(&config);
6363
let server = Server::new(config.clone(), domain_storage.clone());
6464
tokio::task::spawn(async move { server.run(http_rx, https_rx).await });
@@ -68,6 +68,7 @@ pub async fn reload_server(
6868
}
6969
Ok(())
7070
}
71+
7172
pub async fn run_server() -> anyhow::Result<()> {
7273
let (config, domain_storage) = load_config_and_cache().expect("prepare config and cache file");
7374
if config.port <= 0 && config.https.is_none() {

0 commit comments

Comments
 (0)