pub struct DoubleWriteBuffer { /* private fields */ }Expand description
Double-write buffer file.
Implementations§
Source§impl DoubleWriteBuffer
impl DoubleWriteBuffer
Sourcepub fn open(path: &Path, mode: DwbMode) -> Result<Self>
pub fn open(path: &Path, mode: DwbMode) -> Result<Self>
Open or create the double-write buffer file in the requested I/O mode.
Callers that want the DWB disabled must not call this at all;
DwbMode::Off returns WalError::DwbOffNotOpenable.
Sourcepub fn write_record(&mut self, record: &WalRecord) -> Result<DwbMirror>
pub fn write_record(&mut self, record: &WalRecord) -> Result<DwbMirror>
Write a WAL record to the double-write buffer before WAL append.
The record is written at the current circular position and the file
is fsynced immediately. Use write_record_deferred + flush for
batch mode (multiple records per fsync).
Sourcepub fn write_record_deferred(&mut self, record: &WalRecord) -> Result<DwbMirror>
pub fn write_record_deferred(&mut self, record: &WalRecord) -> Result<DwbMirror>
Stage a WAL record in its ring slot without any disk write.
The slot image stays in memory until flush() writes it and fsyncs
the file. Use this in batch mode: stage all records in a group commit
batch, then call flush() once. A flush writes at most
DWB_CAPACITY slots, however many records it covers.
Returns DwbMirror::Skipped for a record that cannot be mirrored, so
the caller can account for the lost protection instead of assuming the
record is covered.
Sourcepub fn staged_slots(&self) -> u32
pub fn staged_slots(&self) -> u32
Records staged since the last flush whose slots will reach disk at
the next flush. At most DWB_CAPACITY.
Sourcepub fn slots_written(&self) -> u64
pub fn slots_written(&self) -> u64
Slots this buffer wrote to disk since it was opened.
Sourcepub fn write_staged(&mut self) -> Result<u32>
pub fn write_staged(&mut self) -> Result<u32>
Write the staged slots that survive in the ring, oldest first, with no fsync. Returns the number of slots written.
flush() calls this before writing the header. A caller that must
tell a failed slot write from a failed fsync calls it first.
Sourcepub fn flush(&mut self) -> Result<()>
pub fn flush(&mut self) -> Result<()>
Write the staged slots and the DWB header, then fsync the file.
Must be called after one or more write_record_deferred calls to make
the records durable. The single fsync covers all deferred writes since
the last flush — amortizing the cost across the group commit batch.
Source§impl DoubleWriteBuffer
impl DoubleWriteBuffer
Sourcepub fn recover_record(&mut self, target_lsn: u64) -> Result<Option<WalRecord>>
pub fn recover_record(&mut self, target_lsn: u64) -> Result<Option<WalRecord>>
Try to recover a WAL record by LSN from the double-write buffer.
Reads the slots on disk only. A record staged since the last flush is not visible here until that flush writes its slot.
When two slots hold the same LSN — a crash between the DWB fsync and the WAL fsync leaves an LSN durable here but absent from the WAL, so recovery hands that LSN to a different record — the copy with the highest slot sequence number wins. Returning the older one would resurrect a payload that was never acknowledged to any client.
Trait Implementations§
Auto Trait Implementations§
impl !Sync for DoubleWriteBuffer
impl Freeze for DoubleWriteBuffer
impl RefUnwindSafe for DoubleWriteBuffer
impl Send for DoubleWriteBuffer
impl Unpin for DoubleWriteBuffer
impl UnsafeUnpin for DoubleWriteBuffer
impl UnwindSafe for DoubleWriteBuffer
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.