Skip to content

Commit 9cb421d

Browse files
committed
Replace non-decodable sector metadata with dummy expired one in order to not prevent farmer from starting
1 parent 65867e6 commit 9cb421d

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

crates/subspace-farmer/src/single_disk_farm.rs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)