Skip to main content

RegionWriterConfig

Struct RegionWriterConfig 

Source
pub struct RegionWriterConfig {
Show 16 fields pub region_id: Uuid, pub region_spec_id: u32, pub durable_write: bool, pub sync_indexed_write: bool, pub max_wal_buffer_size: usize, pub max_wal_flush_interval: Option<Duration>, pub max_memtable_size: usize, pub max_memtable_rows: usize, pub max_memtable_batches: usize, pub ivf_index_partition_capacity_safety_factor: usize, pub manifest_scan_batch_size: usize, pub max_unflushed_memtable_bytes: usize, pub backpressure_log_interval: Duration, pub async_index_buffer_rows: usize, pub async_index_interval: Duration, pub stats_log_interval: Option<Duration>,
}
Expand description

Configuration for a region writer.

Fields§

§region_id: Uuid

Unique identifier for this region (UUID v4).

§region_spec_id: u32

Region spec ID this region was created with. A value of 0 indicates a manually-created region not governed by any spec.

§durable_write: bool

Whether to wait for WAL flush before returning from writes.

When true (durable writes):

  • Each write waits for WAL persistence before returning
  • Guarantees no data loss on crash
  • Higher latency due to object storage writes

When false (non-durable writes):

  • Writes return immediately after buffering in memory
  • Potential data loss if process crashes before flush
  • Lower latency, batched S3 operations
§sync_indexed_write: bool

Whether to update indexes synchronously on each write.

When true:

  • Newly written data is immediately searchable via indexes
  • Higher latency due to index update overhead

When false:

  • Index updates are deferred
  • New data may not appear in index-accelerated queries immediately
§max_wal_buffer_size: usize

Maximum WAL buffer size in bytes before triggering a flush.

This is a soft threshold - write batches are atomic and won’t be split. WAL flushes when buffer exceeds this size OR when max_wal_flush_interval elapses. Default: 10MB

§max_wal_flush_interval: Option<Duration>

Time-based WAL flush interval.

WAL buffer will be flushed after this duration even if size threshold hasn’t been reached. This ensures bounded data loss window in non-durable mode and prevents accumulating too much data before flushing to object storage. Default: 100ms

§max_memtable_size: usize

Maximum MemTable size in bytes before triggering a flush to storage.

MemTable size is checked every max_wal_flush_interval (during WAL flush ticks). Default: 256MB

§max_memtable_rows: usize

Maximum number of rows in a MemTable.

Used to pre-allocate index storage (e.g., IVF-PQ partition capacity). When a partition reaches capacity, memtable will be flushed. Default: 100,000 rows

§max_memtable_batches: usize

Maximum number of batches in a MemTable.

Used to pre-allocate batch storage. When this limit is reached, memtable will be flushed. Sized for typical ML workloads with 1024-dim vectors (~82KB per 20-row batch). Default: 8,000 batches

§ivf_index_partition_capacity_safety_factor: usize

Safety factor for IVF-PQ index partition capacity calculation.

Accounts for non-uniform distribution of vectors across partitions. Higher values use more memory but reduce overflow risk. Partition capacity = min((max_rows / num_partitions) * safety_factor, max_rows) Default: 8

§manifest_scan_batch_size: usize

Batch size for parallel HEAD requests when scanning for manifest versions.

Higher values scan faster but use more parallel requests. Default: 2

§max_unflushed_memtable_bytes: usize

Maximum unflushed bytes before applying backpressure.

When total unflushed data (active memtable + frozen memtables) exceeds this, new writes will block until some data is flushed to storage. This prevents unbounded memory growth during write spikes.

Default: 1GB

§backpressure_log_interval: Duration

Interval for logging warnings when writes are blocked by backpressure.

When a write is blocked waiting for WAL flush, memtable flush, or index updates to complete, a warning is logged after this duration. The write will continue waiting indefinitely (it never fails due to backpressure), but warnings are logged at this interval to help diagnose slow flushes.

Default: 30 seconds

§async_index_buffer_rows: usize

Maximum rows to buffer before flushing to async indexes.

Only applies when sync_indexed_write is false. Larger values enable better vectorization (especially for IVF-PQ) but increase memory usage and latency before data becomes searchable.

Default: 10,000 rows

§async_index_interval: Duration

Maximum time to buffer before flushing to async indexes.

Only applies when sync_indexed_write is false. Ensures bounded latency for data to become searchable even during low write throughput.

Default: 1 second

§stats_log_interval: Option<Duration>

Interval for periodic stats logging.

Stats (write throughput, backpressure events, memtable size) are logged at this interval. Set to None to disable periodic stats logging.

Default: 60 seconds

Implementations§

Source§

impl RegionWriterConfig

Source

pub fn new(region_id: Uuid) -> Self

Create a new configuration with the given region ID.

Source

pub fn with_region_spec_id(self, spec_id: u32) -> Self

Set the region spec ID.

Source

pub fn with_durable_write(self, durable: bool) -> Self

Set durable writes mode.

Source

pub fn with_sync_indexed_write(self, indexed: bool) -> Self

Set indexed writes mode.

Source

pub fn with_max_wal_buffer_size(self, size: usize) -> Self

Set maximum WAL buffer size.

Source

pub fn with_max_wal_flush_interval(self, interval: Duration) -> Self

Set maximum flush interval.

Source

pub fn with_max_memtable_size(self, size: usize) -> Self

Set maximum MemTable size.

Source

pub fn with_max_memtable_rows(self, rows: usize) -> Self

Set maximum MemTable rows for index pre-allocation.

Source

pub fn with_max_memtable_batches(self, batches: usize) -> Self

Set maximum MemTable batches for batch store pre-allocation.

Source

pub fn with_ivf_index_partition_capacity_safety_factor( self, factor: usize, ) -> Self

Set partition capacity safety factor for IVF-PQ indexes.

Source

pub fn with_manifest_scan_batch_size(self, size: usize) -> Self

Set manifest scan batch size.

Source

pub fn with_max_unflushed_memtable_bytes(self, size: usize) -> Self

Set maximum unflushed bytes for backpressure.

Source

pub fn with_backpressure_log_interval(self, interval: Duration) -> Self

Set backpressure log interval.

Source

pub fn with_async_index_buffer_rows(self, rows: usize) -> Self

Set async index buffer rows.

Source

pub fn with_async_index_interval(self, interval: Duration) -> Self

Set async index interval.

Source

pub fn with_stats_log_interval(self, interval: Option<Duration>) -> Self

Set stats logging interval. Use None to disable periodic stats logging.

Trait Implementations§

Source§

impl Clone for RegionWriterConfig

Source§

fn clone(&self) -> RegionWriterConfig

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for RegionWriterConfig

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for RegionWriterConfig

Source§

fn default() -> Self

Returns the “default value” for a type. 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> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

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

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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: 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> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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<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
Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Fruit for T
where T: Send + Downcast,