@@ -21,7 +21,7 @@ pub struct CardanoImmutableDigester {
21
21
db_directory : PathBuf ,
22
22
23
23
/// A [ImmutableFileDigestCacheProvider] instance
24
- cache_provider : Arc < dyn ImmutableFileDigestCacheProvider > ,
24
+ cache_provider : Option < Arc < dyn ImmutableFileDigestCacheProvider > > ,
25
25
26
26
/// The logger where the logs should be written
27
27
logger : Logger ,
@@ -31,7 +31,7 @@ impl CardanoImmutableDigester {
31
31
/// ImmutableDigester factory
32
32
pub fn new (
33
33
db_directory : PathBuf ,
34
- cache_provider : Arc < dyn ImmutableFileDigestCacheProvider > ,
34
+ cache_provider : Option < Arc < dyn ImmutableFileDigestCacheProvider > > ,
35
35
logger : Logger ,
36
36
) -> Self {
37
37
Self {
@@ -64,15 +64,19 @@ impl ImmutableDigester for CardanoImmutableDigester {
64
64
}
65
65
Some ( _) => {
66
66
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
+ } ,
76
80
} ;
77
81
78
82
// digest is done in a separate thread because it is blocking the whole task
@@ -88,11 +92,13 @@ impl ImmutableDigester for CardanoImmutableDigester {
88
92
89
93
debug ! ( self . logger, "#computed digest: {:?}" , digest) ;
90
94
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
+ }
96
102
}
97
103
98
104
Ok ( digest)
@@ -172,9 +178,9 @@ mod tests {
172
178
} ,
173
179
CardanoImmutableDigester , ImmutableDigester , ImmutableDigesterError , ImmutableFile ,
174
180
} ,
175
- entities:: { Beacon , HexEncodedDigest , ImmutableFileNumber } ,
181
+ entities:: { Beacon , ImmutableFileNumber } ,
176
182
} ;
177
- use sha2:: { Digest , Sha256 } ;
183
+ use sha2:: Sha256 ;
178
184
use slog:: Drain ;
179
185
use std:: {
180
186
collections:: BTreeMap ,
@@ -266,18 +272,6 @@ mod tests {
266
272
slog:: Logger :: root ( Arc :: new ( drain) , slog:: o!( ) )
267
273
}
268
274
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
-
281
275
#[ test]
282
276
fn reports_progress_every_5_percent ( ) {
283
277
let mut progress = Progress {
@@ -307,8 +301,7 @@ mod tests {
307
301
#[ tokio:: test]
308
302
async fn fail_if_no_file_in_folder ( ) {
309
303
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 ( ) ) ;
312
305
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 1 ) ;
313
306
314
307
let result = digester
@@ -332,8 +325,7 @@ mod tests {
332
325
async fn fail_if_a_invalid_file_is_in_immutable_folder ( ) {
333
326
let dir = get_test_dir ( "fail_if_no_immutable_exist/immutable" ) ;
334
327
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 ( ) ) ;
337
329
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 1 ) ;
338
330
339
331
assert ! ( digester. compute_digest( & beacon) . await . is_err( ) ) ;
@@ -343,8 +335,7 @@ mod tests {
343
335
async fn fail_if_theres_only_the_uncompleted_immutable_trio ( ) {
344
336
let dir = get_test_dir ( "fail_if_theres_only_the_uncompleted_immutable_trio/immutable" ) ;
345
337
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 ( ) ) ;
348
339
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 1 ) ;
349
340
350
341
let result = digester
@@ -368,8 +359,7 @@ mod tests {
368
359
async fn fail_if_less_immutable_than_what_required_in_beacon ( ) {
369
360
let dir = get_test_dir ( "fail_if_less_immutable_than_what_required_in_beacon/immutable" ) ;
370
361
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 ( ) ) ;
373
363
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 10 ) ;
374
364
375
365
let result = digester
@@ -392,20 +382,24 @@ mod tests {
392
382
#[ tokio:: test]
393
383
async fn can_compute_hash_of_a_hundred_immutable_file_trio ( ) {
394
384
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 ) ;
398
386
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
+ ) ;
400
392
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 100 ) ;
401
393
402
- let expected = compute_expected_hash ( & beacon, & immutables) ;
403
394
let result = digester
404
395
. compute_digest ( & beacon)
405
396
. await
406
397
. expect ( "compute_digest must not fail" ) ;
407
398
408
- assert_eq ! ( expected, result)
399
+ assert_eq ! (
400
+ "3c91666ce10b79456041d8d031a625c376138203445bec80bbfce4a5098acf54" . to_string( ) ,
401
+ result
402
+ )
409
403
}
410
404
411
405
#[ tokio:: test]
@@ -414,7 +408,7 @@ mod tests {
414
408
let immutables = create_fake_immutables ( & dir, & [ 1 , 2 ] , true ) ;
415
409
let cache = Arc :: new ( MemoryImmutableFileDigestCacheProvider :: default ( ) ) ;
416
410
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 ( ) ) ;
418
412
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 2 ) ;
419
413
420
414
digester
@@ -438,28 +432,42 @@ mod tests {
438
432
}
439
433
440
434
#[ 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 ( ) {
442
436
let dir = get_test_dir ( "computed_digest_with_or_without_cache_are_equals/immutable" ) ;
443
437
create_fake_immutables ( & dir, & [ 1 , 2 , 3 ] , true ) ;
444
- let cache = MemoryImmutableFileDigestCacheProvider :: default ( ) ;
445
438
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
+ ) ;
447
445
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 3 ) ;
448
446
449
- let without_cache_digest = digester
447
+ let without_cache_digest = no_cache_digester
450
448
. compute_digest ( & beacon)
451
449
. await
452
450
. expect ( "compute_digest must not fail" ) ;
453
451
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
455
458
. compute_digest ( & beacon)
456
459
. await
457
460
. expect ( "compute_digest must not fail" ) ;
458
461
459
462
assert_eq ! (
460
- without_cache_digest, with_cache_digest ,
463
+ without_cache_digest, full_cache_digest ,
461
464
"Digests with or without cache should be the same"
462
465
) ;
466
+
467
+ assert_eq ! (
468
+ cold_cache_digest, full_cache_digest,
469
+ "Digests with cold or with hot cache should be the same"
470
+ ) ;
463
471
}
464
472
465
473
#[ tokio:: test]
@@ -468,7 +476,7 @@ mod tests {
468
476
create_fake_immutables ( & dir, & ( 1 ..=300 ) . collect :: < Vec < ImmutableFileNumber > > ( ) , true ) ;
469
477
let cache = MemoryImmutableFileDigestCacheProvider :: default ( ) ;
470
478
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 ( ) ) ;
472
480
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 300 ) ;
473
481
474
482
let now = Instant :: now ( ) ;
@@ -486,8 +494,8 @@ mod tests {
486
494
let elapsed_with_cache = now. elapsed ( ) ;
487
495
488
496
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,\
491
499
time elapsed: with cache {:?}, without cache {:?}",
492
500
elapsed_with_cache,
493
501
elapsed_without_cache
@@ -506,7 +514,7 @@ mod tests {
506
514
) )
507
515
} ) ;
508
516
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 ( ) ) ;
510
518
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 3 ) ;
511
519
512
520
digester
@@ -527,7 +535,7 @@ mod tests {
527
535
} ) ;
528
536
cache. expect_store ( ) . returning ( |_| Ok ( ( ) ) ) ;
529
537
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 ( ) ) ;
531
539
let beacon = Beacon :: new ( "devnet" . to_string ( ) , 1 , 3 ) ;
532
540
533
541
digester
0 commit comments