Skip to content

Commit 684d8a1

Browse files
committed
Make cache provider optional for cardano digester
+ fix a the default value used when getting digests from cache provider fails.
1 parent 9d99e92 commit 684d8a1

File tree

6 files changed

+80
-77
lines changed

6 files changed

+80
-77
lines changed

mithril-aggregator/src/command_args.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,11 +358,11 @@ impl ServeCommand {
358358
));
359359
let digester = Arc::new(CardanoImmutableDigester::new(
360360
config.db_directory.clone(),
361-
Arc::new(JsonImmutableFileDigestCacheProvider::new(
361+
Some(Arc::new(JsonImmutableFileDigestCacheProvider::new(
362362
&config
363363
.data_stores_directory
364364
.join(format!("immutables_digests_{}.json", config.network)),
365-
)),
365+
))),
366366
slog_scope::logger(),
367367
));
368368
let multi_signer = Arc::new(RwLock::new(MultiSignerImpl::new(

mithril-client/src/commands/restore.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ use std::{error::Error, fs, path::Path, sync::Arc};
33
use clap::Parser;
44
use config::{builder::DefaultState, ConfigBuilder};
55
use directories::ProjectDirs;
6-
use mithril_common::digesters::cache::{
7-
ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProvider,
8-
MemoryImmutableFileDigestCacheProvider,
9-
};
106
use mithril_common::{
117
certificate_chain::MithrilCertificateVerifier,
128
crypto_helper::{key_decode_hex, ProtocolGenesisVerifier},
9+
digesters::cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProvider},
1310
digesters::CardanoImmutableDigester,
1411
};
1512
use slog_scope::{debug, info, warn};
@@ -99,15 +96,15 @@ fn build_digester_cache_provider(
9996
disable_digests_cache: bool,
10097
reset_digests_cache: bool,
10198
config: &Config,
102-
) -> Result<Arc<dyn ImmutableFileDigestCacheProvider>, Box<dyn Error>> {
99+
) -> Result<Option<Arc<dyn ImmutableFileDigestCacheProvider>>, Box<dyn Error>> {
103100
if disable_digests_cache {
104-
return Ok(Arc::new(MemoryImmutableFileDigestCacheProvider::default()));
101+
return Ok(None);
105102
}
106103

107104
match ProjectDirs::from("io", "iohk", "mithril") {
108105
None => {
109106
warn!("Could not get cache directory, disabling immutables digests cache");
110-
Ok(Arc::new(MemoryImmutableFileDigestCacheProvider::default()))
107+
Ok(None)
111108
}
112109
Some(project_dirs) => {
113110
let cache_dir: &Path = project_dirs.cache_dir();
@@ -137,9 +134,9 @@ fn build_digester_cache_provider(
137134
"Storing/Getting immutables digests cache from: {}",
138135
cache_file.display()
139136
);
140-
Ok(Arc::new(JsonImmutableFileDigestCacheProvider::new(
137+
Ok(Some(Arc::new(JsonImmutableFileDigestCacheProvider::new(
141138
&cache_file,
142-
)))
139+
))))
143140
}
144141
}
145142
}

mithril-common/src/digesters/cardano_immutable_digester.rs

Lines changed: 64 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub struct CardanoImmutableDigester {
2121
db_directory: PathBuf,
2222

2323
/// A [ImmutableFileDigestCacheProvider] instance
24-
cache_provider: Arc<dyn ImmutableFileDigestCacheProvider>,
24+
cache_provider: Option<Arc<dyn ImmutableFileDigestCacheProvider>>,
2525

2626
/// The logger where the logs should be written
2727
logger: Logger,
@@ -31,7 +31,7 @@ impl CardanoImmutableDigester {
3131
/// ImmutableDigester factory
3232
pub fn new(
3333
db_directory: PathBuf,
34-
cache_provider: Arc<dyn ImmutableFileDigestCacheProvider>,
34+
cache_provider: Option<Arc<dyn ImmutableFileDigestCacheProvider>>,
3535
logger: Logger,
3636
) -> Self {
3737
Self {
@@ -64,15 +64,19 @@ impl ImmutableDigester for CardanoImmutableDigester {
6464
}
6565
Some(_) => {
6666
info!(self.logger, "#compute_digest"; "beacon" => #?beacon, "nb_of_immutables" => immutables.len());
67-
let cached_values = match self.cache_provider.get(immutables).await {
68-
Ok(values) => values,
69-
Err(error) => {
70-
warn!(
71-
self.logger,
72-
"Error while getting cached immutable files digests: {}", error
73-
);
74-
BTreeMap::new()
75-
}
67+
68+
let cached_values = match self.cache_provider.as_ref() {
69+
None => BTreeMap::from_iter(immutables.into_iter().map(|i| (i, None))),
70+
Some(cache_provider) => match cache_provider.get(immutables.clone()).await {
71+
Ok(values) => values,
72+
Err(error) => {
73+
warn!(
74+
self.logger,
75+
"Error while getting cached immutable files digests: {}", error
76+
);
77+
BTreeMap::from_iter(immutables.into_iter().map(|i| (i, None)))
78+
}
79+
},
7680
};
7781

7882
// digest is done in a separate thread because it is blocking the whole task
@@ -88,11 +92,13 @@ impl ImmutableDigester for CardanoImmutableDigester {
8892

8993
debug!(self.logger, "#computed digest: {:?}", digest);
9094

91-
if let Err(error) = self.cache_provider.store(new_cache_entries).await {
92-
warn!(
93-
self.logger,
94-
"Error while storing new immutable files digests to cache: {}", error
95-
);
95+
if let Some(cache_provider) = self.cache_provider.as_ref() {
96+
if let Err(error) = cache_provider.store(new_cache_entries).await {
97+
warn!(
98+
self.logger,
99+
"Error while storing new immutable files digests to cache: {}", error
100+
);
101+
}
96102
}
97103

98104
Ok(digest)
@@ -172,9 +178,9 @@ mod tests {
172178
},
173179
CardanoImmutableDigester, ImmutableDigester, ImmutableDigesterError, ImmutableFile,
174180
},
175-
entities::{Beacon, HexEncodedDigest, ImmutableFileNumber},
181+
entities::{Beacon, ImmutableFileNumber},
176182
};
177-
use sha2::{Digest, Sha256};
183+
use sha2::Sha256;
178184
use slog::Drain;
179185
use std::{
180186
collections::BTreeMap,
@@ -266,18 +272,6 @@ mod tests {
266272
slog::Logger::root(Arc::new(drain), slog::o!())
267273
}
268274

269-
fn compute_expected_hash(beacon: &Beacon, entries: &[ImmutableFile]) -> HexEncodedDigest {
270-
let mut hasher = Sha256::new();
271-
hasher.update(beacon.compute_hash().as_bytes());
272-
273-
for entry in entries {
274-
let data = hex::encode(entry.compute_raw_hash::<Sha256>().unwrap());
275-
hasher.update(&data);
276-
}
277-
278-
hex::encode(hasher.finalize())
279-
}
280-
281275
#[test]
282276
fn reports_progress_every_5_percent() {
283277
let mut progress = Progress {
@@ -307,8 +301,7 @@ mod tests {
307301
#[tokio::test]
308302
async fn fail_if_no_file_in_folder() {
309303
let dir = get_test_dir("fail_if_no_file_in_folder/immutable");
310-
let cache = MemoryImmutableFileDigestCacheProvider::default();
311-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), create_logger());
304+
let digester = CardanoImmutableDigester::new(dir, None, create_logger());
312305
let beacon = Beacon::new("devnet".to_string(), 1, 1);
313306

314307
let result = digester
@@ -332,8 +325,7 @@ mod tests {
332325
async fn fail_if_a_invalid_file_is_in_immutable_folder() {
333326
let dir = get_test_dir("fail_if_no_immutable_exist/immutable");
334327
write_dummy_file(&dir, "not_immutable");
335-
let cache = MemoryImmutableFileDigestCacheProvider::default();
336-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), create_logger());
328+
let digester = CardanoImmutableDigester::new(dir, None, create_logger());
337329
let beacon = Beacon::new("devnet".to_string(), 1, 1);
338330

339331
assert!(digester.compute_digest(&beacon).await.is_err());
@@ -343,8 +335,7 @@ mod tests {
343335
async fn fail_if_theres_only_the_uncompleted_immutable_trio() {
344336
let dir = get_test_dir("fail_if_theres_only_the_uncompleted_immutable_trio/immutable");
345337
write_immutable_trio(&dir, 1);
346-
let cache = MemoryImmutableFileDigestCacheProvider::default();
347-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), create_logger());
338+
let digester = CardanoImmutableDigester::new(dir, None, create_logger());
348339
let beacon = Beacon::new("devnet".to_string(), 1, 1);
349340

350341
let result = digester
@@ -368,8 +359,7 @@ mod tests {
368359
async fn fail_if_less_immutable_than_what_required_in_beacon() {
369360
let dir = get_test_dir("fail_if_less_immutable_than_what_required_in_beacon/immutable");
370361
create_fake_immutables(&dir, &[1, 2, 3, 4, 5], true);
371-
let cache = MemoryImmutableFileDigestCacheProvider::default();
372-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), create_logger());
362+
let digester = CardanoImmutableDigester::new(dir, None, create_logger());
373363
let beacon = Beacon::new("devnet".to_string(), 1, 10);
374364

375365
let result = digester
@@ -392,20 +382,24 @@ mod tests {
392382
#[tokio::test]
393383
async fn can_compute_hash_of_a_hundred_immutable_file_trio() {
394384
let dir = get_test_dir("can_compute_hash_of_a_hundred_immutable_file_trio/immutable");
395-
let immutables =
396-
create_fake_immutables(&dir, &(1..=100).collect::<Vec<ImmutableFileNumber>>(), true);
397-
let cache = MemoryImmutableFileDigestCacheProvider::default();
385+
create_fake_immutables(&dir, &(1..=100).collect::<Vec<ImmutableFileNumber>>(), true);
398386
let logger = create_logger();
399-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), logger.clone());
387+
let digester = CardanoImmutableDigester::new(
388+
dir,
389+
Some(Arc::new(MemoryImmutableFileDigestCacheProvider::default())),
390+
logger.clone(),
391+
);
400392
let beacon = Beacon::new("devnet".to_string(), 1, 100);
401393

402-
let expected = compute_expected_hash(&beacon, &immutables);
403394
let result = digester
404395
.compute_digest(&beacon)
405396
.await
406397
.expect("compute_digest must not fail");
407398

408-
assert_eq!(expected, result)
399+
assert_eq!(
400+
"3c91666ce10b79456041d8d031a625c376138203445bec80bbfce4a5098acf54".to_string(),
401+
result
402+
)
409403
}
410404

411405
#[tokio::test]
@@ -414,7 +408,7 @@ mod tests {
414408
let immutables = create_fake_immutables(&dir, &[1, 2], true);
415409
let cache = Arc::new(MemoryImmutableFileDigestCacheProvider::default());
416410
let logger = create_logger();
417-
let digester = CardanoImmutableDigester::new(dir, cache.clone(), logger.clone());
411+
let digester = CardanoImmutableDigester::new(dir, Some(cache.clone()), logger.clone());
418412
let beacon = Beacon::new("devnet".to_string(), 1, 2);
419413

420414
digester
@@ -438,28 +432,42 @@ mod tests {
438432
}
439433

440434
#[tokio::test]
441-
async fn computed_digest_with_or_without_cache_are_equals() {
435+
async fn computed_digest_with_cold_or_hot_or_without_any_cache_are_equals() {
442436
let dir = get_test_dir("computed_digest_with_or_without_cache_are_equals/immutable");
443437
create_fake_immutables(&dir, &[1, 2, 3], true);
444-
let cache = MemoryImmutableFileDigestCacheProvider::default();
445438
let logger = create_logger();
446-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), logger.clone());
439+
let no_cache_digester = CardanoImmutableDigester::new(dir.clone(), None, logger.clone());
440+
let cache_digester = CardanoImmutableDigester::new(
441+
dir,
442+
Some(Arc::new(MemoryImmutableFileDigestCacheProvider::default())),
443+
logger.clone(),
444+
);
447445
let beacon = Beacon::new("devnet".to_string(), 1, 3);
448446

449-
let without_cache_digest = digester
447+
let without_cache_digest = no_cache_digester
450448
.compute_digest(&beacon)
451449
.await
452450
.expect("compute_digest must not fail");
453451

454-
let with_cache_digest = digester
452+
let cold_cache_digest = cache_digester
453+
.compute_digest(&beacon)
454+
.await
455+
.expect("compute_digest must not fail");
456+
457+
let full_cache_digest = cache_digester
455458
.compute_digest(&beacon)
456459
.await
457460
.expect("compute_digest must not fail");
458461

459462
assert_eq!(
460-
without_cache_digest, with_cache_digest,
463+
without_cache_digest, full_cache_digest,
461464
"Digests with or without cache should be the same"
462465
);
466+
467+
assert_eq!(
468+
cold_cache_digest, full_cache_digest,
469+
"Digests with cold or with hot cache should be the same"
470+
);
463471
}
464472

465473
#[tokio::test]
@@ -468,7 +476,7 @@ mod tests {
468476
create_fake_immutables(&dir, &(1..=300).collect::<Vec<ImmutableFileNumber>>(), true);
469477
let cache = MemoryImmutableFileDigestCacheProvider::default();
470478
let logger = create_logger();
471-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), logger.clone());
479+
let digester = CardanoImmutableDigester::new(dir, Some(Arc::new(cache)), logger.clone());
472480
let beacon = Beacon::new("devnet".to_string(), 1, 300);
473481

474482
let now = Instant::now();
@@ -486,8 +494,8 @@ mod tests {
486494
let elapsed_with_cache = now.elapsed();
487495

488496
assert!(
489-
elapsed_with_cache < (elapsed_without_cache * 2 / 3),
490-
"digest computation with full cache should be at least 33% faster than without cache,\
497+
elapsed_with_cache < (elapsed_without_cache * 9 / 10),
498+
"digest computation with full cache should be at least 10% faster than without cache,\
491499
time elapsed: with cache {:?}, without cache {:?}",
492500
elapsed_with_cache,
493501
elapsed_without_cache
@@ -506,7 +514,7 @@ mod tests {
506514
))
507515
});
508516
let logger = create_logger();
509-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), logger.clone());
517+
let digester = CardanoImmutableDigester::new(dir, Some(Arc::new(cache)), logger.clone());
510518
let beacon = Beacon::new("devnet".to_string(), 1, 3);
511519

512520
digester
@@ -527,7 +535,7 @@ mod tests {
527535
});
528536
cache.expect_store().returning(|_| Ok(()));
529537
let logger = create_logger();
530-
let digester = CardanoImmutableDigester::new(dir, Arc::new(cache), logger.clone());
538+
let digester = CardanoImmutableDigester::new(dir, Some(Arc::new(cache)), logger.clone());
531539
let beacon = Beacon::new("devnet".to_string(), 1, 3);
532540

533541
digester

mithril-common/src/digesters/immutable_digester.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use crate::digesters::{cache, ImmutableFileListingError};
2-
use crate::entities::{Beacon, ImmutableFileNumber};
1+
use crate::{
2+
digesters::ImmutableFileListingError,
3+
entities::{Beacon, ImmutableFileNumber},
4+
};
35
use async_trait::async_trait;
46
use std::io;
57
use thiserror::Error;
@@ -65,10 +67,6 @@ pub enum ImmutableDigesterError {
6567
/// Error raised when the digest computation failed.
6668
#[error("Digest computation failed: {0}")]
6769
DigestComputationError(#[from] io::Error),
68-
69-
/// Error raised when the act of storing or getting cached immutable files digest failed.
70-
#[error("Cache provider error: {0}")]
71-
CacheProvider(#[from] cache::ImmutableDigesterCacheProviderError),
7270
}
7371

7472
/// A [ImmutableDigester] returning configurable result for testing purpose.

mithril-common/src/digesters/immutable_file.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::entities::ImmutableFileNumber;
1+
use crate::entities::{ImmutableFileName, ImmutableFileNumber};
22

33
use digest::{Digest, Output};
44
use std::{
@@ -27,7 +27,7 @@ pub struct ImmutableFile {
2727
pub number: ImmutableFileNumber,
2828

2929
/// The filename
30-
pub filename: String,
30+
pub filename: ImmutableFileName,
3131
}
3232

3333
/// [ImmutableFile::new] related errors.

mithril-signer/src/runtime/signer_services.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,12 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
8787
));
8888
let digester = Arc::new(CardanoImmutableDigester::new(
8989
self.config.db_directory.clone(),
90-
Arc::new(JsonImmutableFileDigestCacheProvider::new(
90+
Some(Arc::new(JsonImmutableFileDigestCacheProvider::new(
9191
&self
9292
.config
9393
.data_stores_directory
9494
.join(format!("immutables_digests_{}.json", self.config.network)),
95-
)),
95+
))),
9696
slog_scope::logger(),
9797
));
9898
let stake_store = Arc::new(StakeStore::new(

0 commit comments

Comments
 (0)