Skip to main content

Engine

Struct Engine 

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

The sharded engine. Owns handles to all shard tasks and routes requests by key hash.

Clone is cheap — it just clones the Vec<ShardHandle> (which are mpsc senders under the hood).

Implementations§

Source§

impl Engine

Source

pub fn new(shard_count: usize) -> Self

Creates an engine with shard_count shards using default config.

Each shard is spawned as a tokio task immediately. Panics if shard_count is zero.

Source

pub fn with_config(shard_count: usize, config: EngineConfig) -> Self

Creates an engine with shard_count shards and the given config.

Spawns a single background drop thread shared by all shards for lazy-freeing large values.

Panics if shard_count is zero.

Source

pub fn prepare( shard_count: usize, config: EngineConfig, ) -> (Self, Vec<PreparedShard>)

Creates the engine and prepared shards without spawning any tasks.

The caller is responsible for running each PreparedShard on the desired runtime via shard::run_prepared. This is the entry point for thread-per-core deployment where each OS thread runs its own single-threaded tokio runtime and one shard.

Panics if shard_count is zero.

Source

pub fn with_available_cores() -> Self

Creates an engine with one shard per available CPU core.

Falls back to a single shard if the core count can’t be determined.

Source

pub fn with_available_cores_config(config: EngineConfig) -> Self

Creates an engine with one shard per available CPU core and the given config.

Source

pub fn shard_count(&self) -> usize

Returns the number of shards.

Source

pub fn subscribe_replication(&self) -> Option<Receiver<ReplicationEvent>>

Creates a new broadcast receiver for replication events.

Returns None if no replication channel was configured. Each caller gets an independent receiver starting from the current broadcast position — not from the beginning of the stream.

Source

pub fn subscribe_expired(&self) -> Option<Receiver<String>>

Creates a new broadcast receiver for expired key names.

Returns None if no expired-key channel was configured. Used by the server to subscribe a background task that fires keyspace notifications.

Source

pub async fn send_to_shard( &self, shard_idx: usize, request: ShardRequest, ) -> Result<ShardResponse, ShardError>

Sends a request to a specific shard by index.

Used by SCAN to iterate through shards sequentially.

Source

pub async fn route( &self, key: &str, request: ShardRequest, ) -> Result<ShardResponse, ShardError>

Routes a request to the shard that owns key.

Source

pub async fn broadcast<F>( &self, make_req: F, ) -> Result<Vec<ShardResponse>, ShardError>
where F: Fn() -> ShardRequest,

Sends a request to every shard and collects all responses.

Dispatches to all shards first (so they start processing in parallel), then collects the replies. Used for commands like DBSIZE and INFO that need data from all shards.

Source

pub async fn route_multi<F>( &self, keys: &[String], make_req: F, ) -> Result<Vec<ShardResponse>, ShardError>
where F: Fn(String) -> ShardRequest,

Routes requests for multiple keys concurrently.

Dispatches all requests without waiting, then collects responses. The response order matches the key order. Used for multi-key commands like DEL and EXISTS.

Source

pub fn same_shard(&self, key1: &str, key2: &str) -> bool

Returns true if both keys are owned by the same shard.

Source

pub fn shard_for_key(&self, key: &str) -> usize

Determines which shard owns a given key.

Source

pub async fn dispatch_to_shard( &self, shard_idx: usize, request: ShardRequest, ) -> Result<Receiver<ShardResponse>, ShardError>

Sends a request to a shard and returns the reply channel without waiting for the response. Used by the connection handler to dispatch commands and collect responses separately.

Source

pub async fn dispatch_reusable_to_shard( &self, shard_idx: usize, request: ShardRequest, reply: Sender<ShardResponse>, ) -> Result<(), ShardError>

Sends a request to a shard using a caller-owned mpsc reply channel.

Avoids the per-command oneshot allocation on the P=1 path.

Source

pub async fn dispatch_batch_to_shard( &self, shard_idx: usize, requests: Vec<ShardRequest>, ) -> Result<Vec<Receiver<ShardResponse>>, ShardError>

Sends a batch of requests to a single shard as one channel message.

Returns one receiver per request, preserving order. This is the pipeline batching optimization: N commands targeting the same shard consume 1 channel slot instead of N, eliminating head-of-line blocking under high pipeline depths.

Trait Implementations§

Source§

impl Clone for Engine

Source§

fn clone(&self) -> Engine

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 Engine

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> 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> 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> 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> 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<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> 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> OptionalSend for T
where T: Send + ?Sized,

Source§

impl<T> OptionalSync for T
where T: Sync + ?Sized,