Skip to main content

Waiters

Struct Waiters 

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

Every parked client, oldest first.

The order is the order they blocked in and it is the order they are served in, which is what makes a queue with several workers on it fair: two clients blocked on the same key take the two elements a RPUSH q first second adds in the order they arrived. A Vec is the right structure for that while the list is short, and it is short, because a waiter is a client doing nothing.

Implementations§

Source§

impl Waiters

Source

pub fn is_empty(&self) -> bool

Whether anybody is waiting.

Source

pub fn len(&self) -> usize

How many clients are parked, which is what INFO clients calls blocked_clients.

Source

pub fn at(&self, at: usize) -> Parked

Where the waiter at at has to be answered.

§Panics

If at is past the end, which only a caller that ignored Waiters::len can manage.

Source

pub fn db_of(&self, at: usize) -> usize

The database the waiter at at blocked on.

§Panics

As Waiters::at.

Source

pub fn drop_at(&mut self, at: usize)

Take a waiter off the list.

§Panics

As Waiters::at.

Source

pub fn forget(&mut self, client: u64)

Take off every waiter belonging to a client that has gone.

Called when a connection closes rather than left for the deadline sweep to find, because a BLPOP key 0 on a connection nobody will ever write to again has no deadline to be found by.

Source

pub fn bind(&mut self, client: u64, conn: u32)

Say which slot the waiter this client just registered is answered on.

The command layer knows which client blocked and the engine knows which slot that client is on, so the slot is filled in afterwards by the half that has it. A client can only be parked once, since it is not reading commands while it waits, so the search finds the one that was just added.

Trait Implementations§

Source§

impl Default for Waiters

Source§

fn default() -> Waiters

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.