Skip to main content

SegmentedVolume

Struct SegmentedVolume 

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

WAL namespace: the zonal replica factories for segment data (one per zone) plus one regional factory hosting the manifest control register.

Implementations§

Source§

impl SegmentedVolume

Source

pub fn new( factories: Vec<GrpcReplicaFactory>, manifest_factory: GrpcReplicaFactory, prefix: impl Into<String>, client_config: ClientConfig, ) -> Result<Self, Error>

Bind 1, 3, or 5 GCS Rapid zonal buckets to one WAL object prefix. Any other factory count returns crate::Error. Durability and availability follow the strict-majority quorum: a single replica tolerates no zone loss, three tolerate one, five tolerate two.

Each element must target a different zone. Keep both the list order and the factory’s diagnostic zone index stable across restarts; recovery treats list position as the replica identity. The prefix is dedicated to this WAL. The zonal data prefix contains opaque, creation-ordered segment ids; the same prefix in the regional bucket contains the manifest control object.

The client validates replica count and bucket-name consistency but cannot verify physical placement. Operators must provision Rapid buckets in distinct zones of one region. Pass full v2 bucket resource names and use a gRPC-compatible endpoint such as https://storage.googleapis.com; Cloud Storage regional JSON/XML endpoints do not support gRPC.

Registers persist the ordered zonal bucket names in chorus.buckets; its length is the replica count. A later wrong, reordered, or duplicate set is rejected, and registers without the binding fail closed.

Independent processes may recover the same prefix concurrently. GCS append takeover and conditional segment creation elect one writer; the loser receives a terminal fencing or conditional-create error. Rotation policy is supplied later through crate::WalEngineConfig, not through this storage description.

Source

pub fn new_with_metrics_recorder( factories: Vec<GrpcReplicaFactory>, manifest_factory: GrpcReplicaFactory, prefix: impl Into<String>, client_config: ClientConfig, metrics_recorder: Arc<dyn MetricsRecorder>, ) -> Result<Self, Error>

Bind a WAL namespace and emit metrics through metrics_recorder.

Chorus registers all handles during construction and updates them directly on event paths. The recorder owns aggregation and export; the WAL does not retain a readable metrics registry.

Most handles have no labels. When one backend recorder serves several volumes, wrap it per volume and inject a stable volume label into every registration; otherwise those volumes share indistinguishable series.

Source

pub fn new_with_manifest_store( factories: Vec<GrpcReplicaFactory>, manifest_store: Arc<dyn ManifestStore>, prefix: impl Into<String>, client_config: ClientConfig, ) -> Result<Self, Error>

Bind a WAL namespace whose manifest register lives in a caller-supplied ManifestStore instead of the default regional GCS object.

The store must be scoped to exactly this WAL (one register per WAL prefix) and provide the linearizable compare-and-swap semantics the trait documents; Firestore, Spanner, or a SQL row with optimistic locking all qualify. Segment data still lives in the zonal factories. The required bucket binding covers the ordered zonal data factories; the caller remains responsible for scoping the custom store to this WAL.

Source

pub fn new_with_manifest_store_and_metrics_recorder( factories: Vec<GrpcReplicaFactory>, manifest_store: Arc<dyn ManifestStore>, prefix: impl Into<String>, client_config: ClientConfig, metrics_recorder: Arc<dyn MetricsRecorder>, ) -> Result<Self, Error>

Self::new_with_manifest_store with a metrics recorder.

Source

pub async fn recover(&self, checkpoint: WalSeqNo) -> Result<Recovery, Error>

Fence and seal the prior writer, then prepare database startup replay.

checkpoint is the first record not represented by the database’s durable state. The returned Recovery emits the fixed range [checkpoint, Recovery::end) and does not create an appendable segment yet. Apply every emitted record, consume the stream through None, then call Recovery::start to conditionally create the manifest-selected active segment and begin admission.

Source

pub async fn recover_from_committed_floor(&self) -> Result<Recovery, Error>

Recover from the truncation floor committed in the manifest.

This is intended for diagnostic and maintenance tools that do not own a database checkpoint. Database integrations should use Self::recover with their durable replay boundary.

Source

pub async fn repair_sealed_segments(&self) -> Result<RepairReport, Error>

Recover the committed chain and repair immutable sealed segment copies.

This volume-level primitive is intended for diagnostic and maintenance tools that need a detailed RepairReport. Applications should run the WAL engine, which performs the same repair automatically in the background. The operation claims the WAL writer epoch and creates the next active segment, just like normal recovery startup.

Trait Implementations§

Source§

impl Clone for SegmentedVolume

Source§

fn clone(&self) -> SegmentedVolume

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. 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> 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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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