Skip to content

Commit f88d4cf

Browse files
authored
Merge pull request #65 from silicon-heaven/unify-configs
Unify configs
2 parents ffe2a83 + e9ffb75 commit f88d4cf

8 files changed

Lines changed: 82 additions & 49 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "historyprovider"
33
description = "historyprovider-rs"
44
license = "MIT"
55
repository = "https://github.com/silicon-heaven/historyprovider-rs"
6-
version = "2.4.1"
6+
version = "2.5.0"
77
edition = "2024"
88

99
[[bin]]

src/bin/hp.rs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ struct Opts {
1111
/// Config file path
1212
#[arg(long)]
1313
config: Option<String>,
14-
/// Historyprovider config file
15-
#[arg(long, default_value = "config.yaml")]
16-
hp_config: String,
1714
/// Create default config file if one specified by --config is not found
1815
#[arg(short, long)]
1916
create_default_config: bool,
@@ -39,6 +36,24 @@ struct Opts {
3936
/// Print version and exit
4037
#[arg(short = 'V', long)]
4138
version: bool,
39+
40+
// HP specific options
41+
//
42+
/// Path to journal directory
43+
#[arg(long)]
44+
journal_dir: Option<String>,
45+
/// Maximum number of parallel sync tasks
46+
#[arg(long)]
47+
max_sync_tasks: Option<usize>,
48+
/// Maximum size of journal directory in bytes
49+
#[arg(long)]
50+
max_journal_dir_size: Option<usize>,
51+
/// Periodic sync interval in seconds
52+
#[arg(long)]
53+
periodic_sync_interval: Option<u64>,
54+
/// Number of days to keep history data
55+
#[arg(long)]
56+
days_to_keep: Option<i64>,
4257
}
4358

4459
fn init_logger(cli_opts: &Opts) {
@@ -65,24 +80,34 @@ fn print_banner(text: impl AsRef<str>) {
6580
info!("{banner_line}");
6681
}
6782

68-
fn load_client_config(cli_opts: Opts) -> shvrpc::Result<ClientConfig> {
69-
let mut config = if let Some(config_file) = &cli_opts.config {
70-
ClientConfig::from_file_or_default(config_file, cli_opts.create_default_config)?
83+
fn load_client_config(cli_opts: Opts) -> shvrpc::Result<(ClientConfig, HpConfig)> {
84+
let (mut client_config, mut hp_config) = if let Some(config_file) = &cli_opts.config {
85+
(
86+
ClientConfig::from_file_or_default(config_file, cli_opts.create_default_config)?,
87+
HpConfig::load(config_file)?,
88+
)
7189
} else {
72-
Default::default()
90+
(Default::default(), Default::default())
7391
};
74-
config.url = cli_opts.url.map_or_else(|| Ok(config.url), |url_str| Url::parse(&url_str))?;
75-
config.device_id = cli_opts.device_id.or(config.device_id);
76-
config.mount = cli_opts.mount.or(config.mount);
77-
config.reconnect_interval = cli_opts.reconnect_interval.map_or_else(
78-
|| Ok(config.reconnect_interval),
92+
client_config.url = cli_opts.url.map_or_else(|| Ok(client_config.url), |url_str| Url::parse(&url_str))?;
93+
client_config.device_id = cli_opts.device_id.or(client_config.device_id);
94+
client_config.mount = cli_opts.mount.or(client_config.mount);
95+
client_config.reconnect_interval = cli_opts.reconnect_interval.map_or_else(
96+
|| Ok(client_config.reconnect_interval),
7997
|interval_str| duration_str::parse(&interval_str).map(Some)
8098
)?;
81-
config.heartbeat_interval = cli_opts.heartbeat_interval.map_or_else(
82-
|| Ok(config.heartbeat_interval),
99+
client_config.heartbeat_interval = cli_opts.heartbeat_interval.map_or_else(
100+
|| Ok(client_config.heartbeat_interval),
83101
|interval_str| duration_str::parse(&interval_str)
84102
)?;
85-
Ok(config)
103+
104+
hp_config.journal_dir = cli_opts.journal_dir.unwrap_or(hp_config.journal_dir);
105+
hp_config.max_sync_tasks = cli_opts.max_sync_tasks.unwrap_or(hp_config.max_sync_tasks);
106+
hp_config.max_journal_dir_size = cli_opts.max_journal_dir_size.unwrap_or(hp_config.max_journal_dir_size);
107+
hp_config.periodic_sync_interval = cli_opts.periodic_sync_interval.unwrap_or(hp_config.periodic_sync_interval);
108+
hp_config.days_to_keep = cli_opts.days_to_keep.unwrap_or(hp_config.days_to_keep);
109+
110+
Ok((client_config, hp_config))
86111
}
87112

88113
#[tokio::main]
@@ -97,10 +122,7 @@ pub(crate) async fn main() -> shvrpc::Result<()> {
97122

98123
init_logger(&cli_opts);
99124
print_banner(format!("{} {} starting", std::module_path!(), PKG_VERSION));
100-
101-
let hp_config = cli_opts.hp_config.clone();
102-
let client_config = load_client_config(cli_opts).expect("Invalid config");
103-
let hp_config = HpConfig::load(hp_config)?;
125+
let (client_config, hp_config) = load_client_config(cli_opts).expect("Invalid config");
104126

105127
historyprovider::run(&hp_config, &client_config).await
106128
}

src/lib.rs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,38 @@ mod util;
2727
pub mod typeinfo;
2828
pub mod alarm;
2929

30-
fn default_journal_dir() -> String {
30+
const fn max_sync_tasks_default() -> usize { 8 }
31+
const fn max_journal_dir_size_default() -> usize { 30 * 1_000_000_000 } // 30 GB
32+
const fn periodic_sync_interval_default() -> u64 { 60 * 60 } // 1 hour
33+
34+
fn journal_dir_default() -> String {
3135
"/tmp/hp-rs/shvjournal".into()
3236
}
3337

3438
#[derive(Clone, Deserialize)]
3539
pub struct HpConfig {
36-
#[serde(default = "default_journal_dir")]
37-
journal_dir: String,
38-
max_sync_tasks: Option<usize>,
39-
max_journal_dir_size: Option<usize>,
40-
periodic_sync_interval: Option<u64>,
41-
days_to_keep: Option<i64>,
40+
#[serde(default = "journal_dir_default")]
41+
pub journal_dir: String,
42+
#[serde(default = "max_sync_tasks_default")]
43+
pub max_sync_tasks: usize,
44+
#[serde(default = "max_journal_dir_size_default")]
45+
pub max_journal_dir_size: usize,
46+
#[serde(default = "periodic_sync_interval_default")]
47+
pub periodic_sync_interval: u64,
48+
#[serde(default)]
49+
pub days_to_keep: i64,
50+
}
51+
52+
impl Default for HpConfig {
53+
fn default() -> Self {
54+
Self {
55+
journal_dir: journal_dir_default(),
56+
max_sync_tasks: max_sync_tasks_default(),
57+
max_journal_dir_size: max_journal_dir_size_default(),
58+
periodic_sync_interval: periodic_sync_interval_default(),
59+
days_to_keep: Default::default(),
60+
}
61+
}
4262
}
4363

4464
impl HpConfig {

src/sites.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,7 @@ pub(crate) async fn sites_task(
353353
{
354354
let app_state = app_state.clone();
355355
tokio::spawn(async move {
356-
const PERIODIC_SYNC_INTERVAL_DEFAULT: u64 = 60 * 60;
357-
let periodic_sync_interval = app_state.config.periodic_sync_interval.unwrap_or(PERIODIC_SYNC_INTERVAL_DEFAULT);
356+
let periodic_sync_interval = app_state.config.periodic_sync_interval;
358357
let mut interval: Option<tokio::time::Interval> = None;
359358
loop {
360359
tokio::select! {

src/sync.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::journalrw::{GetLog2Params, GetLog2Since, JournalReaderLog2, JournalWr
2525
use crate::sites::{SitesData, SubHpInfo};
2626
use crate::tree::{FileType, LsFilesEntry, METH_READ};
2727
use crate::util::{get_files, is_log2_file, msec_to_log2_filename, DedupReceiver};
28-
use crate::{HpConfig, State};
28+
use crate::State;
2929

3030
#[derive(Default)]
3131
pub(crate) struct SyncInfo {
@@ -705,13 +705,6 @@ async fn sync_site_legacy(
705705
Ok(())
706706
}
707707

708-
const MAX_SYNC_TASKS_DEFAULT: usize = 8;
709-
710-
pub fn log_size_limit(config: &HpConfig) -> u64 {
711-
const MAX_JOURNAL_DIR_SIZE_DEFAULT: usize = 30 * 1_000_000_000;
712-
config.max_journal_dir_size.unwrap_or(MAX_JOURNAL_DIR_SIZE_DEFAULT) as u64
713-
}
714-
715708
pub(crate) async fn sync_task(
716709
client_cmd_tx: ClientCommandSender,
717710
_client_evt_rx: ClientEventsReceiver,
@@ -736,8 +729,8 @@ pub(crate) async fn sync_task(
736729

737730
// The download size limit should be lower than the max_journal_dir_size, because it doesn't
738731
// count in the files synced by getLog.
739-
let max_journal_dir_size = log_size_limit(&app_state.config);
740-
let days_to_keep = app_state.config.days_to_keep.unwrap_or(0);
732+
let max_journal_dir_size = app_state.config.max_journal_dir_size as u64;
733+
let days_to_keep = app_state.config.days_to_keep;
741734

742735
while let Some(cmd) = sync_cmd_rx.next().await {
743736
match cmd {
@@ -749,7 +742,7 @@ pub(crate) async fn sync_task(
749742
app_state.sites_data.read().await.clone(),
750743
max_journal_dir_size
751744
).await;
752-
let max_sync_tasks = app_state.config.max_sync_tasks.unwrap_or(MAX_SYNC_TASKS_DEFAULT);
745+
let max_sync_tasks = app_state.config.max_sync_tasks;
753746
let semaphore = Arc::new(Semaphore::new(max_sync_tasks));
754747
let mut sync_tasks = vec![];
755748
let sync_start = tokio::time::Instant::now();

src/tree.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ use crate::getlog::getlog_handler;
2626
use crate::journalrw::{journal_entries_to_rpcvalue, GetLog2Params, Log2Header, Log2Reader};
2727
use crate::pushlog::pushlog_impl;
2828
use crate::sites::SubHpInfo;
29-
use crate::sync::log_size_limit;
3029
use crate::{AlarmWithTimestamp, HpConfig, State};
3130

3231
// History site node methods
@@ -236,15 +235,15 @@ async fn shvjournal_request_handler(
236235
METH_LS_FILES => return m.resolve(METHODS, async || {
237236
journaldir_lsfiles_handler(get_journaldir_entries(path).await?).await
238237
}),
239-
METH_LOG_SIZE_LIMIT => return m.resolve(METHODS, async move || Ok(log_size_limit(&app_state.config))),
238+
METH_LOG_SIZE_LIMIT => return m.resolve(METHODS, async move || Ok(app_state.config.max_journal_dir_size as i64)),
240239
METH_TOTAL_LOG_SIZE => return m.resolve(METHODS, async move || total_log_size(&app_state.config)
241240
.await
242241
.map(RpcValue::from)
243242
.map_err(rpc_error_filesystem)
244243
),
245244
METH_LOG_USAGE => return m.resolve(METHODS, async move || total_log_size(&app_state.config)
246245
.await
247-
.map(|size| 100. * (size as f64) / (log_size_limit(&app_state.config) as f64))
246+
.map(|size| 100. * (size as f64) / (app_state.config.max_journal_dir_size as f64))
248247
.map_err(rpc_error_filesystem)
249248
),
250249
METH_SYNC_LOG => return m.resolve(METHODS, async move || sync_log_request_handler(&param, app_state).await),

src/util.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ pub(crate) fn msec_to_log2_filename(msec: i64) -> String {
144144

145145
#[cfg(test)]
146146
pub mod testing {
147-
use crate::{State, dirtylog::DirtyLogCommand, sites::{SiteInfo, SitesData, SubHpInfo}, sync::SyncCommand, util::{DedupReceiver, dedup_channel}};
147+
use crate::{State, dirtylog::DirtyLogCommand, max_journal_dir_size_default, max_sync_tasks_default, sites::{SiteInfo, SitesData, SubHpInfo}, sync::SyncCommand, util::{DedupReceiver, dedup_channel}};
148148
use futures::{channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, StreamExt};
149149
use log::debug;
150150
use shvclient::{clientapi::{ClientCommand, ClientEventsReceiver}, ClientCommandSender};
@@ -404,10 +404,10 @@ pub mod testing {
404404
start_time: std::time::Instant::now(),
405405
config: crate::HpConfig {
406406
journal_dir: journal_dir.path().to_str().expect("path must work").to_string(),
407-
max_sync_tasks: None,
408-
max_journal_dir_size: None,
409-
days_to_keep: None,
410-
periodic_sync_interval: Some(3),
407+
max_sync_tasks: max_sync_tasks_default(),
408+
max_journal_dir_size: max_journal_dir_size_default(),
409+
days_to_keep: 0,
410+
periodic_sync_interval: 3,
411411
},
412412
dirtylog_cmd_tx,
413413
sync_cmd_tx: dedup_sender.clone(),

0 commit comments

Comments
 (0)