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

Function create_segment

crates/commitlog/src/stream/writer.rs:442–486  ·  view source on GitHub ↗

Create a new segment at offset `last_written_tx_range.end`. If the segment file already exists but has a size equal to or smaller than a segment header, the file is truncated. Otherwise, an already existing segment is an error.

(
    repo: R,
    last_written_tx_range: Option<Range<u64>>,
    commitlog_options: Options,
    header: segment::Header,
)

Source from the content-addressed store, hash-verified

440/// a segment header, the file is truncated. Otherwise, an already existing
441/// segment is an error.
442fn create_segment<R: Repo>(
443 repo: R,
444 last_written_tx_range: Option<Range<u64>>,
445 commitlog_options: Options,
446 header: segment::Header,
447) -> io::Result<(R::SegmentWriter, Option<OffsetIndexWriter>)> {
448 let segment_offset = last_written_tx_range
449 .as_ref()
450 .map(|range| range.end)
451 .unwrap_or_default();
452 let mut segment = loop {
453 match repo.create_segment(segment_offset, header) {
454 Ok(segment) => break segment,
455 Err(e) if e.kind() == io::ErrorKind::AlreadyExists => {
456 trace!("segment already exists");
457 let mut s = repo.open_segment_writer(segment_offset)?;
458 let len = s.segment_len()?;
459 trace!("segment len: {len}");
460 if len <= segment::Header::LEN as _ {
461 trace!("overwriting existing segment");
462 repo.remove_segment(segment_offset)?;
463 continue;
464 }
465
466 return Err(io::Error::new(
467 e.kind(),
468 format!(
469 "repo {}: segment {} already exists and is non-empty: {}",
470 repo, segment_offset, e
471 ),
472 ));
473 }
474 Err(e) => return Err(e),
475 }
476 };
477 fallocate(&mut segment, &commitlog_options)?;
478
479 let index_writer = repo
480 .create_offset_index(segment_offset, commitlog_options.offset_index_len())
481 .inspect_err(|e| warn!("unable to create offset index segment={segment_offset} err={e:?}"))
482 .map(|index| OffsetIndexWriter::new(index, commitlog_options))
483 .ok();
484
485 Ok((segment, index_writer))
486}

Callers 2

create_segmentMethod · 0.85
append_allMethod · 0.85

Calls 14

offset_index_lenMethod · 0.80
ErrFunction · 0.50
newFunction · 0.50
fallocateFunction · 0.50
OkFunction · 0.50
mapMethod · 0.45
as_refMethod · 0.45
create_segmentMethod · 0.45
kindMethod · 0.45
open_segment_writerMethod · 0.45
segment_lenMethod · 0.45
remove_segmentMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…