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,
)
| 440 | /// a segment header, the file is truncated. Otherwise, an already existing |
| 441 | /// segment is an error. |
| 442 | fn 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 | } |
no test coverage detected
searching dependent graphs…