spin_factor_key_value

Struct CachingStoreManager

Source
pub struct CachingStoreManager<T> { /* private fields */ }
Expand description

Wrap each Store produced by the inner StoreManager in an asynchronous, write-behind cache.

This serves two purposes:

  • Improve performance with slow and/or distant stores

  • Provide a relaxed consistency guarantee vs. what a fully synchronous store provides

The latter is intended to prevent guests from coming to rely on the synchronous consistency model of an existing implementation which may later be replaced with one providing a more relaxed, asynchronous (i.e. “eventual”) consistency model. See also https://www.hyrumslaw.com/ and https://xkcd.com/1172/.

This implementation provides a “read-your-writes”, asynchronous consistency model such that values are immediately available for reading as soon as they are written as long as the read(s) hit the same cache as the write(s). Reads and writes through separate caches (e.g. separate guest instances or separately-opened references to the same store within a single instance) are not guaranteed to be consistent; not only is cross-cache consistency subject to scheduling and/or networking delays, a given tuple is never refreshed from the backing store once added to a cache since this implementation is intended for use only by short-lived guest instances.

Note that, because writes are asynchronous and return immediately, durability is not guaranteed. I/O errors may occur asynchronously after the write operation has returned control to the guest, which may result in the write being lost without the guest knowing. In the future, a separate write-durable function could be added to key-value.wit to provide either synchronous or asynchronous feedback on durability for guests which need it.

Implementations§

Source§

impl<T> CachingStoreManager<T>

Source

pub fn new(inner: T) -> Self

Source

pub fn new_with_capacity(capacity: NonZeroUsize, inner: T) -> Self

Trait Implementations§

Source§

impl<T: StoreManager> StoreManager for CachingStoreManager<T>

Source§

fn get<'life0, 'life1, 'async_trait>( &'life0 self, name: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Arc<dyn Store>, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Source§

fn is_defined(&self, store_name: &str) -> bool

Source§

fn summary(&self, store_name: &str) -> Option<String>

A human-readable summary of the given store’s configuration Read more

Auto Trait Implementations§

§

impl<T> Freeze for CachingStoreManager<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for CachingStoreManager<T>
where T: RefUnwindSafe,

§

impl<T> Send for CachingStoreManager<T>
where T: Send,

§

impl<T> Sync for CachingStoreManager<T>
where T: Sync,

§

impl<T> Unpin for CachingStoreManager<T>
where T: Unpin,

§

impl<T> UnwindSafe for CachingStoreManager<T>
where T: UnwindSafe,

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> 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> 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> Same for T

Source§

type Output = T

Should always be Self
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