Struct MultiResourceLock

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

A distributed mutual exclusion lock backed by Redis.

Supports exclusion based on multiple resources and partial overlaps.

This is much less efficient than lock_across. Ideally you should architect your application so you never need MultiResourceLock.

E.g. a lock on resources ["a", "b"] will block a lock on ["a"] or ["b", "c"].

Implementations§

Source§

impl MultiResourceLock

Source

pub fn new(client: Client) -> RedisResult<Self>

Create a new instance of the lock.

§Errors

When Client::get_connection errors.

Source

pub async fn acquire_default( &mut self, resources: &[String], ) -> RedisResult<Option<String>>

Source

pub async fn acquire( &mut self, resources: &[String], expiration: Duration, timeout: Duration, sleep: Duration, ) -> RedisResult<Option<String>>

Attempts to acquire the lock blocking until the lock can be acquired.

Blocks up to timeout duration making attempts every sleep duration.

Returns None when it times out.

§Errors

When MultiResourceLock::try_acquire errors.

Source

pub async fn try_acquire_default( &mut self, resources: &[String], ) -> RedisResult<Option<String>>

Source

pub async fn try_acquire( &mut self, resources: &[String], expiration: Duration, ) -> RedisResult<Option<String>>

Attempts to acquire the lock returning immediately if it cannot be immediately acquired.

§Errors
  • When the acquire_lock function is missing from the Redis instance.
Source

pub async fn release(&mut self, lock_id: &str) -> RedisResult<usize>

Releases a held lock.

§Errors
  • When the release_lock function is missing from the Redis instance.
  • When lock_id does not refer to a held lock.
Source

pub async fn map<F>( &mut self, resources: &[String], expiration: Duration, timeout: Duration, sleep: Duration, f: F, ) -> Result<F::Output, MapError>
where F: Future + Send + 'static, F::Output: Send + 'static,

Since we cannot safely drop a guard in an async context, we need to provide a way to release the lock in case of an error.

This is the suggested approach, it is less ergonomic but it is safe.

Source

pub async fn map_default<F>( &mut self, resources: &[String], f: F, ) -> Result<F::Output, MapError>
where F: Future + Send + 'static, F::Output: Send + 'static,

Trait Implementations§

Source§

impl Debug for MultiResourceLock

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> 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, 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
Source§

impl<T> ErasedDestructor for T
where T: 'static,