@@ -230,15 +230,19 @@ impl MessageBuilder {
230230 certificate: & CertificateMessage ,
231231 cardano_database_snapshot: & CardanoDatabaseSnapshotMessage ,
232232 immutable_file_range: & ImmutableFileRange ,
233+ allow_missing: bool ,
233234 database_dir: & Path ,
234235 verified_digests: & VerifiedDigests ,
235236 ) -> Result <ProtocolMessage , ComputeCardanoDatabaseMessageError > {
236237 let network = certificate. metadata. network. clone( ) ;
237238 let immutable_file_number_range = immutable_file_range
238239 . to_range_inclusive( cardano_database_snapshot. beacon. immutable_file_number)
239240 . map_err( ComputeCardanoDatabaseMessageError :: ImmutableFilesRange ) ?;
240- let missing_immutable_files =
241- Self :: list_missing_immutable_files( database_dir, & immutable_file_number_range) ;
241+ let missing_immutable_files = if allow_missing {
242+ vec![ ]
243+ } else {
244+ Self :: list_missing_immutable_files( database_dir, & immutable_file_number_range)
245+ } ;
242246 let immutable_digester = CardanoImmutableDigester :: new( network, None , self . logger. clone( ) ) ;
243247 let computed_digest_entries = immutable_digester
244248 . compute_digests_for_range( database_dir, & immutable_file_number_range)
@@ -533,6 +537,7 @@ mod tests {
533537 & certificate,
534538 & CardanoDatabaseSnapshotMessage :: dummy ( ) ,
535539 & immutable_file_range_to_prove,
540+ false ,
536541 & database_dir,
537542 & verified_digests,
538543 )
@@ -543,15 +548,16 @@ mod tests {
543548 }
544549
545550 #[ tokio:: test]
546- async fn compute_cardano_database_message_should_fail_if_immutable_is_missing ( ) {
551+ async fn compute_cardano_database_message_should_fail_if_immutable_is_missing_and_allow_missing_not_set ( )
552+ {
547553 let beacon = CardanoDbBeacon {
548554 epoch : Epoch ( 123 ) ,
549555 immutable_file_number : 10 ,
550556 } ;
551557 let immutable_file_range = 1 ..=15 ;
552558 let immutable_file_range_to_prove = ImmutableFileRange :: Range ( 2 , 4 ) ;
553559 let ( database_dir, certificate, verified_digests) = prepare_db_and_verified_digests (
554- "compute_cardano_database_message_should_fail_if_immutable_is_missing " ,
560+ "compute_cardano_database_message_should_fail_if_immutable_is_missing_and_allow_missing_not_set " ,
555561 & beacon,
556562 & immutable_file_range,
557563 )
@@ -560,11 +566,13 @@ mod tests {
560566 let files_to_remove = vec ! [ "00003.chunk" , "00004.primary" ] ;
561567 remove_immutable_files ( & database_dir, & files_to_remove) ;
562568
569+ let allow_missing = false ;
563570 let error = MessageBuilder :: new ( )
564571 . compute_cardano_database_message (
565572 & certificate,
566573 & CardanoDatabaseSnapshotMessage :: dummy ( ) ,
567574 & immutable_file_range_to_prove,
575+ allow_missing,
568576 & database_dir,
569577 & verified_digests,
570578 )
@@ -588,6 +596,41 @@ mod tests {
588596 ) ;
589597 }
590598
599+ #[ tokio:: test]
600+ async fn compute_cardano_database_message_should_success_if_immutable_is_missing_and_allow_missing_is_set ( )
601+ {
602+ let beacon = CardanoDbBeacon {
603+ epoch : Epoch ( 123 ) ,
604+ immutable_file_number : 10 ,
605+ } ;
606+ let immutable_file_range = 1 ..=15 ;
607+ let immutable_file_range_to_prove = ImmutableFileRange :: Range ( 2 , 4 ) ;
608+ let ( database_dir, certificate, verified_digests) = prepare_db_and_verified_digests (
609+ "compute_cardano_database_message_should_success_if_immutable_is_missing_and_allow_missing_is_set" ,
610+ & beacon,
611+ & immutable_file_range,
612+ )
613+ . await ;
614+
615+ let files_to_remove = vec ! [ "00003.chunk" , "00004.primary" ] ;
616+ remove_immutable_files ( & database_dir, & files_to_remove) ;
617+
618+ let allow_missing = true ;
619+ MessageBuilder :: new ( )
620+ . compute_cardano_database_message (
621+ & certificate,
622+ & CardanoDatabaseSnapshotMessage :: dummy ( ) ,
623+ & immutable_file_range_to_prove,
624+ allow_missing,
625+ & database_dir,
626+ & verified_digests,
627+ )
628+ . await
629+ . expect (
630+ "compute_cardano_database_message should succeed if a immutable is missing but 'allow_missing' is set" ,
631+ ) ;
632+ }
633+
591634 #[ tokio:: test]
592635 async fn compute_cardano_database_message_should_fail_if_immutable_is_tampered ( ) {
593636 let beacon = CardanoDbBeacon {
@@ -614,6 +657,7 @@ mod tests {
614657 & certificate,
615658 & CardanoDatabaseSnapshotMessage :: dummy ( ) ,
616659 & immutable_file_range_to_prove,
660+ false ,
617661 & database_dir,
618662 & verified_digests,
619663 )
@@ -665,6 +709,7 @@ mod tests {
665709 & certificate,
666710 & CardanoDatabaseSnapshotMessage :: dummy ( ) ,
667711 & immutable_file_range_to_prove,
712+ false ,
668713 & database_dir,
669714 & verified_digests,
670715 )
0 commit comments