Skip to content

Commit 9a04f56

Browse files
committed
Add 'reset' & 'disable' digest-cache params to signer & aggregator
+ Add a builder pattern for json digest cache provider
1 parent a4bb098 commit 9a04f56

File tree

13 files changed

+229
-66
lines changed

13 files changed

+229
-66
lines changed

mithril-aggregator/src/command_args.rs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,18 @@ use clap::{Parser, Subcommand};
22
use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind};
33
use slog::Level;
44
use slog_scope::debug;
5-
use std::error::Error;
6-
use std::fs;
7-
use std::path::PathBuf;
8-
use std::sync::Arc;
9-
use tokio::sync::RwLock;
10-
use tokio::time::Duration;
5+
use std::{error::Error, fs, path::PathBuf, sync::Arc};
6+
use tokio::{sync::RwLock, time::Duration};
117

128
use mithril_common::{
139
certificate_chain::MithrilCertificateVerifier,
1410
chain_observer::{CardanoCliRunner, ChainObserver},
1511
crypto_helper::{key_decode_hex, ProtocolGenesisSigner, ProtocolGenesisVerifier},
1612
database::{ApplicationNodeType, DatabaseVersionChecker},
17-
digesters::cache::JsonImmutableFileDigestCacheProvider,
18-
digesters::{CardanoImmutableDigester, ImmutableFileSystemObserver},
13+
digesters::{
14+
cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProviderBuilder},
15+
CardanoImmutableDigester, ImmutableFileSystemObserver,
16+
},
1917
entities::{Epoch, HexEncodedGenesisSecretKey},
2018
store::{adapter::SQLiteAdapter, StakeStore},
2119
BeaconProviderImpl,
@@ -255,6 +253,16 @@ pub struct ServeCommand {
255253
/// Defaults to work folder
256254
#[clap(long)]
257255
pub snapshot_directory: Option<PathBuf>,
256+
257+
/// Disable immutables digests cache.
258+
#[clap(long)]
259+
disable_digests_cache: bool,
260+
261+
/// If set the existing immutables digests cache will be reset.
262+
///
263+
/// Will be ignored if set in conjunction with `--disable-digests-cache`.
264+
#[clap(long)]
265+
reset_digests_cache: bool,
258266
}
259267

260268
impl Source for ServeCommand {
@@ -358,11 +366,7 @@ impl ServeCommand {
358366
));
359367
let digester = Arc::new(CardanoImmutableDigester::new(
360368
config.db_directory.clone(),
361-
Some(Arc::new(JsonImmutableFileDigestCacheProvider::new(
362-
&config
363-
.data_stores_directory
364-
.join(format!("immutables_digests_{}.json", config.network)),
365-
))),
369+
self.build_digester_cache_provider(&config).await?,
366370
slog_scope::logger(),
367371
));
368372
let multi_signer = Arc::new(RwLock::new(MultiSignerImpl::new(
@@ -459,6 +463,24 @@ impl ServeCommand {
459463
println!("Exiting...");
460464
Ok(())
461465
}
466+
467+
async fn build_digester_cache_provider(
468+
&self,
469+
config: &Configuration,
470+
) -> Result<Option<Arc<dyn ImmutableFileDigestCacheProvider>>, Box<dyn Error>> {
471+
if self.disable_digests_cache {
472+
return Ok(None);
473+
}
474+
let cache_provider = JsonImmutableFileDigestCacheProviderBuilder::new(
475+
&config.data_stores_directory,
476+
&format!("immutables_digests_{}.json", config.network),
477+
)
478+
.should_reset_digests_cache(self.reset_digests_cache)
479+
.build()
480+
.await?;
481+
482+
Ok(Some(Arc::new(cache_provider)))
483+
}
462484
}
463485

464486
/// Genesis tools

mithril-client/src/commands/restore.rs

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
use std::{error::Error, fs, path::Path, sync::Arc};
2-
31
use clap::Parser;
42
use config::{builder::DefaultState, ConfigBuilder};
53
use directories::ProjectDirs;
64
use mithril_common::{
75
certificate_chain::MithrilCertificateVerifier,
86
crypto_helper::{key_decode_hex, ProtocolGenesisVerifier},
9-
digesters::cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProvider},
10-
digesters::CardanoImmutableDigester,
7+
digesters::{
8+
cache::ImmutableFileDigestCacheProvider,
9+
cache::JsonImmutableFileDigestCacheProviderBuilder, CardanoImmutableDigester,
10+
},
1111
};
12-
use slog_scope::{debug, info, warn};
12+
use slog_scope::{debug, warn};
13+
use std::{error::Error, path::Path, sync::Arc};
1314

1415
use crate::{AggregatorHTTPClient, AggregatorHandler, Config, Runtime};
1516

@@ -108,35 +109,16 @@ async fn build_digester_cache_provider(
108109
Ok(None)
109110
}
110111
Some(project_dirs) => {
111-
let cache_dir: &Path = project_dirs.cache_dir();
112-
if !cache_dir.exists() {
113-
fs::create_dir_all(cache_dir).map_err(|e| {
114-
format!(
115-
"Failure when creation cache directory `{}`: {}",
116-
cache_dir.display(),
117-
e
118-
)
119-
})?;
120-
}
121-
122-
let cache_file = cache_dir.join(format!("immutables_digests_{}.json", config.network));
123-
let cache_provider = Arc::new(JsonImmutableFileDigestCacheProvider::new(&cache_file));
124-
125-
if reset_digests_cache {
126-
cache_provider.reset().await.map_err(|e| {
127-
format!(
128-
"Failure when resetting digests cache file `{}`: {}",
129-
cache_file.display(),
130-
e
131-
)
132-
})?;
133-
}
112+
let cache_provider = JsonImmutableFileDigestCacheProviderBuilder::new(
113+
project_dirs.cache_dir(),
114+
&format!("immutables_digests_{}.json", config.network),
115+
)
116+
.ensure_dir_exist()
117+
.should_reset_digests_cache(reset_digests_cache)
118+
.build()
119+
.await?;
134120

135-
info!(
136-
"Storing/Getting immutables digests cache from: {}",
137-
cache_file.display()
138-
);
139-
Ok(Some(cache_provider))
121+
Ok(Some(Arc::new(cache_provider)))
140122
}
141123
}
142124
}

mithril-common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ serde_json = "1.0"
3737
serde_yaml = "0.9.10"
3838
sha2 = "0.10.2"
3939
slog = { version = "2.7.0", features = ["max_level_trace", "release_max_level_debug"] }
40+
slog-scope = "4.4.0"
4041
sqlite = "0.28"
4142
thiserror = "1.0.31"
4243
tokio = { version = "1.17.0", features = ["full"] }

mithril-common/src/digesters/cache/json_provider.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use super::ImmutableFileDigestCacheProvider;
21
use crate::{
3-
digesters::cache::CacheProviderResult,
42
digesters::{
53
cache::provider::{ImmutableDigesterCacheGetError, ImmutableDigesterCacheStoreError},
4+
cache::CacheProviderResult,
5+
cache::ImmutableFileDigestCacheProvider,
66
ImmutableFile,
77
},
88
entities::{HexEncodedDigest, ImmutableFileName},
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
use crate::digesters::cache::{
2+
ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProvider,
3+
};
4+
use slog_scope::info;
5+
use std::{error::Error, path::Path};
6+
use tokio::fs;
7+
8+
/// A [JsonImmutableFileDigestCacheProvider] builder.
9+
pub struct JsonImmutableFileDigestCacheProviderBuilder<'a> {
10+
cache_dir: &'a Path,
11+
filename: &'a str,
12+
ensure_dir_exist: bool,
13+
reset_digests_cache: bool,
14+
}
15+
16+
impl<'a> JsonImmutableFileDigestCacheProviderBuilder<'a> {
17+
/// [JsonImmutableFileDigestCacheProviderBuilder] factory.
18+
pub fn new(cache_dir: &'a Path, filename: &'a str) -> Self {
19+
Self {
20+
cache_dir,
21+
filename,
22+
ensure_dir_exist: false,
23+
reset_digests_cache: false,
24+
}
25+
}
26+
27+
/// If set will create the cache directory if it doesn't already exist.
28+
pub fn ensure_dir_exist(&mut self) -> &mut Self {
29+
self.ensure_dir_exist = true;
30+
self
31+
}
32+
33+
/// Set if existing cached values in the provider must be reset.
34+
pub fn should_reset_digests_cache(&mut self, should_reset: bool) -> &mut Self {
35+
self.reset_digests_cache = should_reset;
36+
self
37+
}
38+
39+
/// Build a [JsonImmutableFileDigestCacheProvider] based on the parameters previously set.
40+
pub async fn build(&self) -> Result<JsonImmutableFileDigestCacheProvider, Box<dyn Error>> {
41+
let cache_file = self.cache_dir.join(self.filename);
42+
let cache_provider = JsonImmutableFileDigestCacheProvider::new(&cache_file);
43+
44+
if self.ensure_dir_exist {
45+
fs::create_dir_all(&self.cache_dir).await.map_err(|e| {
46+
format!(
47+
"Failure when creating cache directory `{}`: {}",
48+
self.cache_dir.display(),
49+
e
50+
)
51+
})?;
52+
}
53+
54+
if self.reset_digests_cache {
55+
cache_provider.reset().await.map_err(|e| {
56+
format!(
57+
"Failure when resetting digests cache file `{}`: {}",
58+
cache_file.display(),
59+
e
60+
)
61+
})?;
62+
}
63+
64+
info!(
65+
"Storing/Getting immutables digests cache from: {}",
66+
cache_file.display()
67+
);
68+
69+
Ok(cache_provider)
70+
}
71+
}
72+
73+
#[cfg(test)]
74+
mod tests {
75+
use crate::digesters::cache::JsonImmutableFileDigestCacheProviderBuilder;
76+
77+
#[tokio::test]
78+
async fn create_dir_if_ensure_dir_exist_is_set() {
79+
let dir = std::env::temp_dir()
80+
.join("mithril_test")
81+
.join("json_provider_builder")
82+
.join("create_dir_if_ensure_dir_exist_is_set");
83+
84+
JsonImmutableFileDigestCacheProviderBuilder::new(&dir, "test.json")
85+
.ensure_dir_exist()
86+
.build()
87+
.await
88+
.expect("Build should not fail");
89+
90+
assert!(dir.exists());
91+
}
92+
93+
#[tokio::test]
94+
async fn dont_create_dir_if_ensure_dir_exist_is_not_set() {
95+
let dir = std::env::temp_dir()
96+
.join("mithril_test")
97+
.join("json_provider_builder")
98+
.join("dont_create_dir_if_ensure_dir_exist_is_not_set");
99+
100+
JsonImmutableFileDigestCacheProviderBuilder::new(&dir, "test.json")
101+
.build()
102+
.await
103+
.expect("Build should not fail");
104+
105+
assert!(!dir.exists());
106+
}
107+
}

mithril-common/src/digesters/cache/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
//! reusing [super::ImmutableFile] digests.
33
44
mod json_provider;
5+
mod json_provider_builder;
56
mod memory_provider;
67
mod provider;
78

89
pub use json_provider::JsonImmutableFileDigestCacheProvider;
10+
pub use json_provider_builder::JsonImmutableFileDigestCacheProviderBuilder;
911
pub use memory_provider::MemoryImmutableFileDigestCacheProvider;
1012
#[cfg(test)]
1113
pub use provider::MockImmutableFileDigestCacheProvider;

mithril-signer/src/certificate_handler.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ mod tests {
321321

322322
use mithril_common::fake_data;
323323

324-
use crate::entities::Config;
324+
use crate::configuration::Config;
325325

326326
fn setup_test() -> (MockServer, Config) {
327327
let server = MockServer::start();
@@ -338,6 +338,8 @@ mod tests {
338338
store_retention_limit: None,
339339
kes_secret_key_path: None,
340340
operational_certificate_path: None,
341+
disable_digests_cache: false,
342+
reset_digests_cache: false,
341343
};
342344
(server, config)
343345
}

mithril-signer/src/entities.rs renamed to mithril-signer/src/configuration.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ pub struct Config {
4747

4848
/// File path to the operational certificate of the pool
4949
pub operational_certificate_path: Option<PathBuf>,
50+
51+
/// Disable immutables digests cache.
52+
pub disable_digests_cache: bool,
53+
54+
/// If set the existing immutables digests cache will be reset.
55+
///
56+
/// Will be ignored if set in conjunction with `disable_digests_cache`.
57+
pub reset_digests_cache: bool,
5058
}
5159

5260
impl Config {

mithril-signer/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
//! for more information on how it works.
88
99
mod certificate_handler;
10-
mod entities;
10+
mod configuration;
1111
mod protocol_initializer_store;
1212
mod runtime;
1313
mod single_signer;
1414

1515
pub use certificate_handler::*;
16-
pub use entities::Config;
16+
pub use configuration::Config;
1717
pub use protocol_initializer_store::{ProtocolInitializerStore, ProtocolInitializerStorer};
1818
pub use runtime::*;
1919
pub use single_signer::*;

mithril-signer/src/main.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ pub struct Args {
3737
help = "Directory where the configuration file is located"
3838
)]
3939
configuration_dir: PathBuf,
40+
41+
/// Disable immutables digests cache.
42+
#[clap(long)]
43+
disable_digests_cache: bool,
44+
45+
/// If set the existing immutables digests cache will be reset.
46+
///
47+
/// Will be ignored if set in conjunction with `--disable-digests-cache`.
48+
#[clap(long)]
49+
reset_digests_cache: bool,
4050
}
4151

4252
impl Args {
@@ -69,6 +79,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
6979

7080
// Load config
7181
let config: Config = config::Config::builder()
82+
.set_default("disable_digests_cache", args.disable_digests_cache)?
83+
.set_default("reset_digests_cache", args.reset_digests_cache)?
7284
.add_source(
7385
config::File::with_name(&format!(
7486
"{}/{}.json",
@@ -82,7 +94,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
8294
.map_err(|e| format!("configuration build error: {}", e))?
8395
.try_deserialize()
8496
.map_err(|e| format!("configuration deserialize error: {}", e))?;
85-
let services = ProductionServiceBuilder::new(&config).build()?;
97+
let services = ProductionServiceBuilder::new(&config).build().await?;
8698
DatabaseVersionChecker::new(
8799
slog_scope::logger(),
88100
ApplicationNodeType::Signer,

0 commit comments

Comments
 (0)