Struct mz_txn_wal::txn_cache::TxnsCache

source ·
pub struct TxnsCache<T, C: TxnsCodec = TxnsCodecDefault> {
    pub(crate) txns_subscribe: Subscribe<C::Key, C::Val, T, i64>,
    pub(crate) buf: Vec<(TxnsEntry, T, i64)>,
    state: TxnsCacheState<T>,
}
Expand description

A self-updating TxnsCacheState.

Fields§

§txns_subscribe: Subscribe<C::Key, C::Val, T, i64>

A subscribe over the txn shard.

§buf: Vec<(TxnsEntry, T, i64)>

Pending updates for timestamps that haven’t closed.

§state: TxnsCacheState<T>

Implementations§

source§

impl<T, C> TxnsCache<T, C>

source

pub(crate) async fn init( init_ts: T, txns_read: ReadHandle<C::Key, C::Val, T, i64>, txns_write: &mut WriteHandle<C::Key, C::Val, T, i64>, ) -> Self

Initialize the txn shard at init_ts and returns a TxnsCache reading from that shard.

source

pub async fn open( client: &PersistClient, txns_id: ShardId, only_data_id: Option<ShardId>, ) -> Self

Returns a TxnsCache reading from the given txn shard.

txns_id identifies which shard will be used as the txns WAL. MZ will likely have one of these per env, used by all processes and the same across restarts.

source

async fn from_read( txns_read: ReadHandle<C::Key, C::Val, T, i64>, only_data_id: Option<ShardId>, ) -> Self

source

pub async fn update_gt(&mut self, ts: &T) -> &T

Invariant: afterward, self.progress_exclusive will be > ts

Returns the progress_exclusive of the cache after updating.

source

pub async fn update_ge(&mut self, ts: &T) -> &T

Invariant: afterward, self.progress_exclusive will be >= ts

Returns the progress_exclusive of the cache after updating.

source

async fn update<F: Fn(&T) -> bool>( state: &mut TxnsCacheState<T>, txns_subscribe: &mut Subscribe<C::Key, C::Val, T, i64>, buf: &mut Vec<(TxnsEntry, T, i64)>, only_data_id: Option<ShardId>, done: F, )

Listen to the txns shard for events until done returns true.

source

pub(crate) async fn fetch_parts( only_data_id: Option<ShardId>, txns_subscribe: &mut Subscribe<C::Key, C::Val, T, i64>, parts: Vec<LeasedBatchPart<T>>, updates: &mut Vec<(TxnsEntry, T, i64)>, )

source

fn should_fetch_part( only_data_id: Option<&ShardId>, part: &LeasedBatchPart<T>, ) -> bool

Methods from Deref<Target = TxnsCacheState<T>>§

source

pub fn txns_id(&self) -> ShardId

Returns the ShardId of the txns shard.

source

pub fn registered_at_progress(&self, data_id: &ShardId, ts: &T) -> bool

Returns whether the data shard was registered to the txns set as of the current progress.

Specifically, a data shard is registered if the most recent register timestamp is set but the most recent forget timestamp is not set.

This function accepts a timestamp as input, but that timestamp must be equal to the progress exclusive, or else the function panics. It mainly acts as a way for the caller to think about the logical time at which this function executes. Times in the past may have been compacted away, and we can’t always return an accurate answer. If this function isn’t sufficient, you can usually find what you’re looking for by inspecting the times in the most recent registration.

source

pub(crate) fn all_registered_at_progress(&self, ts: &T) -> Vec<ShardId>

Returns the set of all data shards registered to the txns set as of the current progress. See Self::registered_at_progress.

source

pub fn data_snapshot(&self, data_id: ShardId, as_of: T) -> DataSnapshot<T>

Returns a token exchangeable for a snapshot of a data shard.

A data shard might be definite at times past the physical upper because of invariants maintained by this txn system. As a result, this method discovers the latest potentially unapplied write before the as_of.

Callers must first wait for TxnsCache::update_gt with the same or later timestamp to return. Panics otherwise.

source

pub fn data_listen_next(&self, data_id: &ShardId, ts: &T) -> DataListenNext<T>

Returns the next action to take when iterating a Listen on a data shard.

A data shard Listen is executed by repeatedly calling this method with an exclusive progress frontier. The returned value indicates an action to take. Some of these actions advance the progress frontier, which results in calling this method again with a higher timestamp, and thus a new action. See DataListenNext for specifications of the actions.

Note that this is a state machine on self.progress_exclusive and the listen progress. DataListenNext indicates which state transitions to take.

source

pub(crate) fn data_subscribe( &self, data_id: ShardId, as_of: T, ) -> DataSubscribe<T>

Returns a token exchangeable for a subscribe of a data shard.

Callers must first wait for TxnsCache::update_gt with the same or later timestamp to return. Panics otherwise.

source

pub fn min_unapplied_ts(&self) -> &T

Returns the minimum timestamp not known to be applied by this cache.

source

fn min_unapplied_ts_inner(&self) -> &T

source

pub(crate) fn unapplied( &self, ) -> impl Iterator<Item = (&ShardId, Unapplied<'_>, &T)>

Returns the operations needing application as of the current progress.

source

pub(crate) fn filter_retractions<'a>( &'a self, expected_txns_upper: &T, retractions: impl Iterator<Item = (&'a Vec<u8>, &'a ([u8; 8], ShardId))>, ) -> impl Iterator<Item = (&'a Vec<u8>, &'a ([u8; 8], ShardId))>

Filters out retractions known to have made it into the txns shard.

This is called with a set of things that are known to have been applied and in preparation for retracting them. The caller will attempt to retract everything not filtered out by this method in a CaA with an expected upper of expected_txns_upper. So, we catch up to that point, and keep everything that is still outstanding. If the CaA fails with an expected upper mismatch, then it must call this method again on the next attempt with the new expected upper (new retractions may have made it into the txns shard in the meantime).

Callers must first wait for TxnsCache::update_ge with the same or later timestamp to return. Panics otherwise.

source

pub(crate) fn push_entries( &mut self, entries: Vec<(TxnsEntry, T, i64)>, progress: T, )

Update contents with entries and mark this cache as progressed up to progress.

source

fn push_register(&mut self, data_id: ShardId, ts: T, diff: i64, compacted_ts: T)

source

fn push_append(&mut self, data_id: ShardId, batch: Vec<u8>, ts: T, diff: i64)

source

pub(crate) fn mark_register_applied(&mut self, ts: &T)

Informs the cache that all registers and forgets less than ts have been applied.

source

fn compact_data_times(&mut self, data_id: &ShardId)

Compact the internal representation for data_id by removing all data that is not needed to maintain the following invariants:

  • The latest write and registration for each shard are kept in self.datas.
  • All unapplied writes and registrations are kept in self.datas.
  • All writes in self.datas are contained by some registration in self.datas.
source

pub(crate) fn update_gauges(&self, metrics: &Metrics)

source

fn assert_only_data_id(&self, data_id: &ShardId)

source

pub(crate) fn validate(&self) -> Result<(), String>

Trait Implementations§

source§

impl<T: Debug, C: Debug + TxnsCodec> Debug for TxnsCache<T, C>
where C::Key: Debug, C::Val: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T, C: TxnsCodec> Deref for TxnsCache<T, C>

§

type Target = TxnsCacheState<T>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<T, C: TxnsCodec> DerefMut for TxnsCache<T, C>

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.

Auto Trait Implementations§

§

impl<T, C> Freeze for TxnsCache<T, C>
where T: Freeze,

§

impl<T, C = TxnsCodecDefault> !RefUnwindSafe for TxnsCache<T, C>

§

impl<T, C> Send for TxnsCache<T, C>
where T: Send + Sync,

§

impl<T, C> Sync for TxnsCache<T, C>
where T: Sync + Send,

§

impl<T, C> Unpin for TxnsCache<T, C>
where T: Unpin,

§

impl<T, C = TxnsCodecDefault> !UnwindSafe for TxnsCache<T, C>

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, U> CastInto<U> for T
where U: CastFrom<T>,

source§

fn cast_into(self) -> U

Performs the cast.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FutureExt for T

source§

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

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

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext 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> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

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

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

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<P, R> ProtoType<R> for P
where R: RustType<P>,

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<'a, S, T> Semigroup<&'a S> for T
where T: Semigroup<S>,

source§

fn plus_equals(&mut self, rhs: &&'a S)

The method of std::ops::AddAssign, for types that do not implement AddAssign.
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

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

§

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