risingwave_common::cache

Struct LruHandle

source
pub struct LruHandle<K: LruKey, T: LruValue> {
    next_hash: *mut LruHandle<K, T>,
    next: *mut LruHandle<K, T>,
    prev: *mut LruHandle<K, T>,
    kv: Option<(K, T)>,
    hash: u64,
    charge: usize,
    refs: u32,
    flags: u8,
}
Expand description

An entry is a variable length heap-allocated structure. Entries are referenced by cache and/or by any external entity. The cache keeps all its entries in a hash table. Some elements are also stored on LRU list.

LruHandle can be in these states:

  1. Referenced externally AND in hash table. In that case the entry is not in the LRU list (refs >= 1 && in_cache == true)
  2. Not referenced externally AND in hash table. In that case the entry is in the LRU list and can be freed. (refs == 0 && in_cache == true)
  3. Referenced externally AND not in hash table. In that case the entry is not in the LRU list and not in hash table. The entry can be freed when refs becomes 0. (refs >= 1 && in_cache == false)

All newly created LruHandles are in state 1. If you call LruCacheShard::release on entry in state 1, it will go into state 2. To move from state 1 to state 3, either call LruCacheShard::erase or LruCacheShard::insert with the same key (but possibly different value). To move from state 2 to state 1, use LruCacheShard::lookup. Before destruction, make sure that no handles are in state 1. This means that any successful LruCacheShard::lookup/LruCacheShard::insert have a matching LruCache::release (to move into state 2) or LruCacheShard::erase (to move into state 3).

Fields§

§next_hash: *mut LruHandle<K, T>

next element in the linked-list of hash bucket, only used by hash-table.

§next: *mut LruHandle<K, T>

next element in LRU linked list

§prev: *mut LruHandle<K, T>

prev element in LRU linked list

§kv: Option<(K, T)>

When the handle is on-use, the fields is Some(...), while the handle is cleared up and recycled, the field is None.

§hash: u64§charge: usize§refs: u32

The count for external references. If refs > 0, the handle is not in the lru cache, and when refs == 0, the handle must either be in LRU cache or has been recycled.

§flags: u8

Implementations§

source§

impl<K: LruKey, T: LruValue> LruHandle<K, T>

source

pub fn new(key: K, value: T, hash: u64, charge: usize) -> Self

source

pub fn init(&mut self, key: K, value: T, hash: u64, charge: usize)

source

fn set_in_cache(&mut self, in_cache: bool)

Set the in_cache bit in the flag

Since only in_cache reflects whether the handle is present in the hash table, this method should only be called in the method of hash table. Whenever the handle enters the hash table, we should call set_in_cache(true), and whenever the handle leaves the hash table, we should call set_in_cache(false)

source

fn is_high_priority(&self) -> bool

source

fn set_high_priority(&mut self, high_priority: bool)

source

fn set_in_high_pri_pool(&mut self, in_high_pri_pool: bool)

source

fn is_in_high_pri_pool(&self) -> bool

source

fn add_ref(&mut self)

source

fn add_multi_refs(&mut self, ref_count: u32)

source

fn unref(&mut self) -> bool

source

fn has_refs(&self) -> bool

source

fn is_in_cache(&self) -> bool

Test whether the handle is in cache. in cache is equivalent to that the handle is in the hash table.

source

unsafe fn get_key(&self) -> &K

source

unsafe fn get_value(&self) -> &T

source

unsafe fn is_same_key(&self, key: &K) -> bool

source

unsafe fn take_kv(&mut self) -> (K, T)

source

fn is_in_lru(&self) -> bool

source

fn set_in_lru(&mut self, in_lru: bool)

Trait Implementations§

source§

impl<K: LruKey, T: LruValue> Default for LruHandle<K, T>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<K: LruKey, T: LruValue> Send for LruHandle<K, T>

Auto Trait Implementations§

§

impl<K, T> Freeze for LruHandle<K, T>
where K: Freeze, T: Freeze,

§

impl<K, T> RefUnwindSafe for LruHandle<K, T>

§

impl<K, T> !Sync for LruHandle<K, T>

§

impl<K, T> Unpin for LruHandle<K, T>
where K: Unpin, T: Unpin,

§

impl<K, T> UnwindSafe for LruHandle<K, T>

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.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> IntoResult<T> for T

§

type Err = Infallible

§

fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>

source§

impl<M> MetricVecRelabelExt for M

source§

fn relabel( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>

source§

fn relabel_n( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, relabel_num: usize, ) -> RelabeledMetricVec<M>

source§

fn relabel_debug_1( self, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>

Equivalent to RelabeledMetricVec::with_metric_level_relabel_n with metric_level set to MetricLevel::Debug and relabel_num set to 1.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

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