Skip to main content

DoubleWriteBuffer

Struct DoubleWriteBuffer 

Source
pub struct DoubleWriteBuffer { /* private fields */ }
Expand description

Double-write buffer file.

Implementations§

Source§

impl DoubleWriteBuffer

Source

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.

Source

pub fn mode(&self) -> DwbMode

I/O mode this buffer was opened with.

Source

pub fn path(&self) -> &Path

Path to the double-write buffer file.

Source

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).

Source

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.

Source

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.

Source

pub fn slots_written(&self) -> u64

Slots this buffer wrote to disk since it was opened.

Source

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.

Source

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

Source

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§

Source§

impl Debug for DoubleWriteBuffer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
Source§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

Source§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
Source§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more