pub struct WalBuffer { /* private fields */ }Expand description
In-memory WAL buffer for replication. Primary appends records here; replicas consume from it.
Each record payload is stored behind an Arc<[u8]> so fan-out to
multiple replicas shares a single heap allocation per record
(issue #832): a pull clones the Arc handle, never the bytes, so
adding replicas does not multiply the primary’s send-buffer memory.
Implementations§
Source§impl WalBuffer
impl WalBuffer
pub fn new(max_size: usize) -> WalBuffer
Sourcepub fn append(&self, lsn: u64, data: Vec<u8>)
pub fn append(&self, lsn: u64, data: Vec<u8>)
Append a WAL record. Called by the storage engine after each write.
Sourcepub fn read_since(
&self,
since_lsn: u64,
max_count: usize,
) -> Vec<(u64, Vec<u8>)>
pub fn read_since( &self, since_lsn: u64, max_count: usize, ) -> Vec<(u64, Vec<u8>)>
Read records since the given LSN (exclusive), copying each
payload into an owned Vec<u8>. Kept for callers (WAL
archiving, retention bookkeeping) that need owned bytes; the
per-replica fan-out path should prefer Self::read_since_shared
to avoid copying.
Read records since the given LSN (exclusive) sharing the stored
Arc<[u8]> payloads. Fan-out to N replicas clones only the
reference-counted handles, so the buffer’s bytes are never
duplicated per replica (issue #832).
Sourcepub fn current_lsn(&self) -> u64
pub fn current_lsn(&self) -> u64
Current LSN.
pub fn set_current_lsn(&self, lsn: u64)
pub fn prune_through(&self, upto_lsn: u64)
Sourcepub fn oldest_lsn(&self) -> Option<u64>
pub fn oldest_lsn(&self) -> Option<u64>
Oldest available LSN (for gap detection).
Auto Trait Implementations§
impl !Freeze for WalBuffer
impl RefUnwindSafe for WalBuffer
impl Send for WalBuffer
impl Sync for WalBuffer
impl Unpin for WalBuffer
impl UnsafeUnpin for WalBuffer
impl UnwindSafe for WalBuffer
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request