@@ -361,9 +361,6 @@ pub enum SingleDiskFarmError {
361361 /// Failed to decode metadata header
362362 #[ error( "Failed to decode metadata header: {0}" ) ]
363363 FailedToDecodeMetadataHeader ( parity_scale_codec:: Error ) ,
364- /// Failed to decode sector metadata
365- #[ error( "Failed to decode sector metadata: {0}" ) ]
366- FailedToDecodeSectorMetadata ( parity_scale_codec:: Error ) ,
367364 /// Unexpected metadata version
368365 #[ error( "Unexpected metadata version {0}" ) ]
369366 UnexpectedMetadataVersion ( u8 ) ,
@@ -765,12 +762,13 @@ impl SingleDiskFarm {
765762 }
766763 } ;
767764
765+ let metadata_file_path = directory. join ( Self :: METADATA_FILE ) ;
768766 let mut metadata_file = OpenOptions :: new ( )
769767 . read ( true )
770768 . write ( true )
771769 . create ( true )
772770 . advise_random_access ( )
773- . open ( directory . join ( Self :: METADATA_FILE ) ) ?;
771+ . open ( & metadata_file_path ) ?;
774772
775773 metadata_file. advise_random_access ( ) ?;
776774
@@ -827,14 +825,34 @@ impl SingleDiskFarm {
827825
828826 let mut sector_metadata_bytes = vec ! [ 0 ; sector_metadata_size] ;
829827 for sector_index in 0 ..metadata_header. plotted_sector_count {
830- metadata_file. read_exact_at (
831- & mut sector_metadata_bytes,
832- RESERVED_PLOT_METADATA + sector_metadata_size as u64 * u64:: from ( sector_index) ,
833- ) ?;
834- sectors_metadata. push (
835- SectorMetadataChecksummed :: decode ( & mut sector_metadata_bytes. as_ref ( ) )
836- . map_err ( SingleDiskFarmError :: FailedToDecodeSectorMetadata ) ?,
837- ) ;
828+ let sector_offset =
829+ RESERVED_PLOT_METADATA + sector_metadata_size as u64 * u64:: from ( sector_index) ;
830+ metadata_file. read_exact_at ( & mut sector_metadata_bytes, sector_offset) ?;
831+
832+ let sector_metadata =
833+ match SectorMetadataChecksummed :: decode ( & mut sector_metadata_bytes. as_ref ( ) ) {
834+ Ok ( sector_metadata) => sector_metadata,
835+ Err ( error) => {
836+ warn ! (
837+ path = %metadata_file_path. display( ) ,
838+ %error,
839+ %sector_index,
840+ "Failed to decode sector metadata, replacing with dummy expired \
841+ sector metadata"
842+ ) ;
843+
844+ let dummy_sector = SectorMetadataChecksummed :: from ( SectorMetadata {
845+ sector_index,
846+ pieces_in_sector,
847+ s_bucket_sizes : Box :: new ( [ 0 ; Record :: NUM_S_BUCKETS ] ) ,
848+ history_size : HistorySize :: from ( SegmentIndex :: ZERO ) ,
849+ } ) ;
850+ metadata_file. write_all_at ( & dummy_sector. encode ( ) , sector_offset) ?;
851+
852+ dummy_sector
853+ }
854+ } ;
855+ sectors_metadata. push ( sector_metadata) ;
838856 }
839857
840858 Arc :: new ( RwLock :: new ( sectors_metadata) )
0 commit comments