MCPcopy Create free account
hub / github.com/clockworklabs/SpacetimeDB / extract

Method extract

crates/commitlog/src/commitlog.rs:454–499  ·  view source on GitHub ↗
(repo: impl Repo)

Source from the content-addressed store, hash-verified

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
502impl From<CommittedMeta> for segment::Metadata {

Callers

nothing calls this directly

Calls 8

OkFunction · 0.50
newFunction · 0.50
ErrFunction · 0.50
okMethod · 0.45
get_offset_indexMethod · 0.45
as_refMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected