pub struct MmapWalReader { /* private fields */ }Expand description
Memory-mapped WAL segment reader.
Opens a sealed WAL segment file via mmap and provides zero-copy iteration over records. The mmap’d region is read-only and the kernel manages page residency — no application-level memory pinning.
Implementations§
Source§impl MmapWalReader
impl MmapWalReader
Sourcepub fn open(path: &Path, keys: Option<&KeyRing>) -> Result<Self>
pub fn open(path: &Path, keys: Option<&KeyRing>) -> Result<Self>
Open a WAL segment file for mmap’d replay.
Every record is decrypted on the way out: what the caller receives never
has ENCRYPTED_FLAG set, and its checksum verifies against the
plaintext. keys must be the key ring the segment was written under, or
None for a segment that was never encrypted — an encrypted record met
with no key is WalError::EncryptedRecordWithoutKey, never ciphertext
handed to the caller.
Sourcepub fn open_raw(path: &Path) -> Result<Self>
pub fn open_raw(path: &Path) -> Result<Self>
Open a WAL segment file for structural scanning only.
Payloads may be ciphertext. Records come out exactly as they are on
disk, ENCRYPTED_FLAG and all. Use it only for code that reads record
framing and never the payload; replay must use Self::open.
A leading WALP preamble is skipped so iteration begins at the first
real record; segments written without encryption have none and start at
offset 0.
Sourcepub fn segment_preamble(&self) -> Option<&SegmentPreamble>
pub fn segment_preamble(&self) -> Option<&SegmentPreamble>
The preamble read from this segment file, if present.
Returns None for unencrypted segments (no preamble written).
Sourcepub fn stop_reason(&self) -> Option<StopReason>
pub fn stop_reason(&self) -> Option<StopReason>
Why iteration stopped, or None while records are still being read.
Feed this to crate::torn_tail::verify_committed_prefix to tell an
unfsynced tail apart from a hole with committed records behind it.
Sourcepub fn madvise_state(&self) -> Option<c_int>
pub fn madvise_state(&self) -> Option<c_int>
The madvise hint applied to the mapped segment (if any).
Sourcepub fn release_pages(&self)
pub fn release_pages(&self)
Hint to the kernel that pages for this segment can be dropped from cache. Call this after a segment has been iterated end-to-end.
Sourcepub fn next_record(&mut self) -> Result<Option<WalRecord>>
pub fn next_record(&mut self) -> Result<Option<WalRecord>>
Read the next record from the mmap’d region.
Returns None at EOF or at the first corruption point. Returns Err
for a format version this build cannot read at the segment’s first
record, and the caller must stop at that Err.
Header parsing avoids extra copies, but the payload is copied out of
the mmap’d region into an owned Vec<u8> on WalRecord: records must
outlive the reader (they cross thread boundaries in parallel replay
and get mutated in place during decryption), which a borrow of the
mapping cannot support.
Sourcepub fn records(self) -> MmapRecordIter ⓘ
pub fn records(self) -> MmapRecordIter ⓘ
Iterator over all valid records in the mmap’d segment.
Auto Trait Implementations§
impl Freeze for MmapWalReader
impl RefUnwindSafe for MmapWalReader
impl Send for MmapWalReader
impl Sync for MmapWalReader
impl Unpin for MmapWalReader
impl UnsafeUnpin for MmapWalReader
impl UnwindSafe for MmapWalReader
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.