(repo: impl Repo)
| 452 | } |
| 453 | |
| 454 | fn extract(repo: impl Repo) -> io::Result<Option<Self>> { |
| 455 | let Some(MostRecentNonEmptySegment { |
| 456 | empty_segments, |
| 457 | segment_offset, |
| 458 | mut segment_reader, |
| 459 | }) = open_newest_non_empty_segment(&repo)? |
| 460 | else { |
| 461 | return Ok(None); |
| 462 | }; |
| 463 | let offset_index = repo.get_offset_index(segment_offset).ok(); |
| 464 | match segment::Metadata::extract(segment_offset, &mut segment_reader, offset_index.as_ref()) { |
| 465 | // Segment is intact. |
| 466 | Ok(metadata) if empty_segments <= 1 => { |
| 467 | assert!( |
| 468 | !metadata.tx_range.is_empty(), |
| 469 | "segment was promised to be non-empty but contains zero transactions" |
| 470 | ); |
| 471 | Ok(Some(CommittedMeta::Complete { metadata })) |
| 472 | } |
| 473 | // Segment is good, but there are too many empty segments. |
| 474 | Ok(metadata) => Ok(Some(CommittedMeta::Prefix { |
| 475 | metadata, |
| 476 | error: io::Error::new( |
| 477 | io::ErrorKind::InvalidData, |
| 478 | format!("repo {}: too many empty segments: {}", repo, empty_segments), |
| 479 | ), |
| 480 | })), |
| 481 | // Segment is non-empty, but first commit is corrupt. |
| 482 | Err(error::SegmentMetadata::InvalidCommit { sofar, source }) if sofar.tx_range.is_empty() => { |
| 483 | Err(io::Error::new( |
| 484 | io::ErrorKind::InvalidData, |
| 485 | format!( |
| 486 | "repo {}: first commit in the most recent segment is corrupt: {}", |
| 487 | repo, source |
| 488 | ), |
| 489 | )) |
| 490 | } |
| 491 | // Some prefix of the segment is good. |
| 492 | Err(error::SegmentMetadata::InvalidCommit { sofar, source }) => Ok(Some(CommittedMeta::Prefix { |
| 493 | metadata: sofar, |
| 494 | error: source, |
| 495 | })), |
| 496 | // Something went wrong, including out-of-order errors and such. |
| 497 | Err(error::SegmentMetadata::Io(e)) => Err(e), |
| 498 | } |
| 499 | } |
| 500 | } |
| 501 | |
| 502 | impl From<CommittedMeta> for segment::Metadata { |
nothing calls this directly
no test coverage detected