pub struct PrimaryReplication {
pub wal_buffer: Arc<WalBuffer>,
pub logical_wal_spool: Option<Arc<LogicalWalSpool>>,
pub replicas: RwLock<Vec<ReplicaState>>,
pub commit_waiter: Arc<CommitWaiter>,
/* private fields */
}Expand description
Primary replication manager.
Fields§
§wal_buffer: Arc<WalBuffer>§logical_wal_spool: Option<Arc<LogicalWalSpool>>§replicas: RwLock<Vec<ReplicaState>>§commit_waiter: Arc<CommitWaiter>PLAN.md Phase 11.4 — ack-driven commit synchronization. Always
allocated so the policy enum can flip from Local to
AckN/Quorum without touching this struct’s shape.
Implementations§
Source§impl PrimaryReplication
impl PrimaryReplication
pub fn new(data_path: Option<&Path>) -> Self
pub fn register_replica(&self, id: String) -> u64
Sourcepub fn register_replica_with_region(
&self,
id: String,
region: Option<String>,
) -> u64
pub fn register_replica_with_region( &self, id: String, region: Option<String>, ) -> u64
Register a replica with an explicit region tag (Phase 2.6 multi-region).
Preferred when the replica handshake declares a region — the quorum
coordinator uses this field to decide whether the replica counts
toward a QuorumMode::Regions commit.
Sourcepub fn unregister_replica(&self, id: &str) -> bool
pub fn unregister_replica(&self, id: &str) -> bool
Unregister a replica by id. Returns true when the replica
was present (and removed). Bumps the topology epoch so a
pending advertisement reflects the new fleet size.
Sourcepub fn topology_epoch(&self) -> u64
pub fn topology_epoch(&self) -> u64
Current topology epoch. Strictly monotonic, bumps on every
registry-shape change consumed by TopologyAdvertiser.
Sourcepub fn bump_topology_epoch(&self)
pub fn bump_topology_epoch(&self)
Advance the topology epoch. Call sites: register, unregister,
and the health-sweep tick that flips a replica between
healthy/unhealthy. Wrapping is not a concern in practice
(u64::MAX events would take centuries at any realistic ack
rate) but fetch_add saturates implicitly via wrap-around;
the consumer treats epoch as opaque so a wrap is still
strictly “different” from the previous value.
pub fn ack_replica(&self, id: &str, lsn: u64)
Sourcepub fn ack_replica_lsn(&self, id: &str, applied_lsn: u64, durable_lsn: u64)
pub fn ack_replica_lsn(&self, id: &str, applied_lsn: u64, durable_lsn: u64)
PLAN.md Phase 11.4 — replica reports applied + durable LSN
after persisting a batch. Idempotent: only advances LSNs
monotonically. last_seen_at_unix_ms always refreshes.
Also signals commit_waiter so any thread blocked on
ack_n / quorum can wake and re-check its threshold.
Sourcepub fn note_replica_pull(&self, id: &str, last_sent_lsn: u64)
pub fn note_replica_pull(&self, id: &str, last_sent_lsn: u64)
PLAN.md Phase 11.4 — primary records the LSN it last sent to a
replica via pull_wal_records. Helpful for lag_records = last_sent_lsn - last_acked_lsn to distinguish pull-side delay
from apply-side delay.
Sourcepub fn replica_snapshots(&self) -> Vec<ReplicaState>
pub fn replica_snapshots(&self) -> Vec<ReplicaState>
Snapshot of all currently registered replicas, for /metrics + /admin/status. Returns owned clones so callers don’t hold the lock during serialization.
pub fn replica_count(&self) -> usize
Auto Trait Implementations§
impl !Freeze for PrimaryReplication
impl RefUnwindSafe for PrimaryReplication
impl Send for PrimaryReplication
impl Sync for PrimaryReplication
impl Unpin for PrimaryReplication
impl UnsafeUnpin for PrimaryReplication
impl UnwindSafe for PrimaryReplication
Blanket Implementations§
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