pub struct LocalHummockStorage {Show 16 fields
mem_table: MemTable,
spill_offset: u16,
epoch: Option<u64>,
table_id: TableId,
op_consistency_level: OpConsistencyLevel,
table_option: TableOption,
instance_guard: LocalInstanceGuard,
read_version: HummockReadVersionRef,
is_replicated: bool,
event_sender: HummockEventSender,
memory_limiter: Arc<MemoryLimiter>,
hummock_version_reader: HummockVersionReader,
stats: Arc<HummockStateStoreMetrics>,
write_limiter: WriteLimiterRef,
version_update_notifier_tx: Arc<Sender<PinnedVersion>>,
mem_table_spill_threshold: usize,
}
Expand description
LocalHummockStorage
is a handle for a state table shard to access data from and write data to
the hummock state backend. It is created via HummockStorage::new_local
.
Fields§
§mem_table: MemTable
§spill_offset: u16
§epoch: Option<u64>
§table_id: TableId
§op_consistency_level: OpConsistencyLevel
§table_option: TableOption
§instance_guard: LocalInstanceGuard
§read_version: HummockReadVersionRef
Read handle.
is_replicated: bool
This indicates that this LocalHummockStorage
replicates another LocalHummockStorage
.
It’s used by executors in different CNs to synchronize states.
Within LocalHummockStorage
we use this flag to avoid uploading local state to be
persisted, so we won’t have duplicate data.
This also handles a corner case where an executor doing replication
is scheduled to the same CN as its Upstream executor.
In that case, we use this flag to avoid reading the same data twice,
by ignoring the replicated ReadVersion
.
event_sender: HummockEventSender
Event sender.
memory_limiter: Arc<MemoryLimiter>
§hummock_version_reader: HummockVersionReader
§stats: Arc<HummockStateStoreMetrics>
§write_limiter: WriteLimiterRef
§version_update_notifier_tx: Arc<Sender<PinnedVersion>>
§mem_table_spill_threshold: usize
Implementations§
source§impl LocalHummockStorage
impl LocalHummockStorage
sourcepub fn update(&self, info: VersionUpdate)
pub fn update(&self, info: VersionUpdate)
See HummockReadVersion::update
for more details.
pub async fn get_inner( &self, table_key: TableKey<Bytes>, epoch: u64, read_options: ReadOptions, ) -> StorageResult<Option<StateStoreKeyedRow>>
pub async fn wait_for_epoch(&self, wait_epoch: u64) -> StorageResult<()>
pub async fn iter_flushed( &self, table_key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> StorageResult<HummockStorageIterator>
pub async fn rev_iter_flushed( &self, table_key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> StorageResult<HummockStorageRevIterator>
fn mem_table_iter(&self) -> MemTableHummockIterator<'_>
fn mem_table_rev_iter(&self) -> MemTableHummockRevIterator<'_>
pub async fn iter_all( &self, table_key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> StorageResult<LocalHummockStorageIterator<'_>>
pub async fn rev_iter_all( &self, table_key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> StorageResult<LocalHummockStorageRevIterator<'_>>
source§impl LocalHummockStorage
impl LocalHummockStorage
async fn flush_inner( &mut self, sorted_items: Vec<(TableKey<Bytes>, SharedBufferValue<Bytes>)>, old_values: Option<Vec<Bytes>>, write_options: WriteOptions, ) -> StorageResult<usize>
source§impl LocalHummockStorage
impl LocalHummockStorage
pub fn new( instance_guard: LocalInstanceGuard, read_version: HummockReadVersionRef, hummock_version_reader: HummockVersionReader, event_sender: HummockEventSender, memory_limiter: Arc<MemoryLimiter>, write_limiter: WriteLimiterRef, option: NewLocalOptions, version_update_notifier_tx: Arc<Sender<PinnedVersion>>, mem_table_spill_threshold: usize, ) -> Self
sourcepub fn read_version(&self) -> HummockReadVersionRef
pub fn read_version(&self) -> HummockReadVersionRef
See HummockReadVersion::update
for more details.
pub fn table_id(&self) -> TableId
pub fn instance_id(&self) -> u64
fn is_flush_old_value(&self) -> bool
Trait Implementations§
source§impl LocalStateStore for LocalHummockStorage
impl LocalStateStore for LocalHummockStorage
type Iter<'a> = HummockStorageIteratorInner<'a>
type RevIter<'a> = HummockStorageRevIteratorInner<'a>
source§async fn get(
&self,
key: TableKey<Bytes>,
read_options: ReadOptions,
) -> StorageResult<Option<Bytes>>
async fn get( &self, key: TableKey<Bytes>, read_options: ReadOptions, ) -> StorageResult<Option<Bytes>>
source§async fn iter(
&self,
key_range: TableKeyRange,
read_options: ReadOptions,
) -> StorageResult<Self::Iter<'_>>
async fn iter( &self, key_range: TableKeyRange, read_options: ReadOptions, ) -> StorageResult<Self::Iter<'_>>
prefix_hint
and full_key_range
Internally, prefix_hint
will be used to for checking bloom_filter
and
full_key_range
used for iter. (if the prefix_hint
not None, it should be be included
in key_range
) The returned iterator will iterate data based on the latest written
snapshot.async fn rev_iter( &self, key_range: TableKeyRange, read_options: ReadOptions, ) -> StorageResult<Self::RevIter<'_>>
source§fn get_table_watermark(&self, vnode: VirtualNode) -> Option<Bytes>
fn get_table_watermark(&self, vnode: VirtualNode) -> Option<Bytes>
source§fn insert(
&mut self,
key: TableKey<Bytes>,
new_val: Bytes,
old_val: Option<Bytes>,
) -> StorageResult<()>
fn insert( &mut self, key: TableKey<Bytes>, new_val: Bytes, old_val: Option<Bytes>, ) -> StorageResult<()>
epoch
into the state store.source§fn delete(&mut self, key: TableKey<Bytes>, old_val: Bytes) -> StorageResult<()>
fn delete(&mut self, key: TableKey<Bytes>, old_val: Bytes) -> StorageResult<()>
epoch
will be deleted.async fn flush(&mut self) -> StorageResult<usize>
async fn try_flush(&mut self) -> StorageResult<()>
fn epoch(&self) -> u64
fn is_dirty(&self) -> bool
source§async fn init(&mut self, options: InitOptions) -> StorageResult<()>
async fn init(&mut self, options: InitOptions) -> StorageResult<()>
epoch
pair.
Typically we will use epoch.curr
as the initialized epoch,
Since state table will begin as empty.
In some cases like replicated state table, state table may not be empty initially,
as such we need to wait for epoch.prev
checkpoint to complete,
hence this interface is made async.source§fn seal_current_epoch(&mut self, next_epoch: u64, opts: SealCurrentEpochOptions)
fn seal_current_epoch(&mut self, next_epoch: u64, opts: SealCurrentEpochOptions)
new_epoch
.
All writes after this function is called will be tagged with new_epoch
. In other words,
the previous write epoch is sealed.fn update_vnode_bitmap(&mut self, vnodes: Arc<Bitmap>) -> Arc<Bitmap>
source§impl StateStoreRead for LocalHummockStorage
impl StateStoreRead for LocalHummockStorage
type ChangeLogIter = ChangeLogIterator
type Iter = HummockStorageIteratorInner<'static>
type RevIter = HummockStorageRevIteratorInner<'static>
source§fn get_keyed_row(
&self,
key: TableKey<Bytes>,
epoch: u64,
read_options: ReadOptions,
) -> impl Future<Output = StorageResult<Option<StateStoreKeyedRow>>> + Send + '_
fn get_keyed_row( &self, key: TableKey<Bytes>, epoch: u64, read_options: ReadOptions, ) -> impl Future<Output = StorageResult<Option<StateStoreKeyedRow>>> + Send + '_
epoch
.
Both full key and the value are returned.source§fn iter(
&self,
key_range: TableKeyRange,
epoch: u64,
read_options: ReadOptions,
) -> impl Future<Output = StorageResult<Self::Iter>> + '_
fn iter( &self, key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> impl Future<Output = StorageResult<Self::Iter>> + '_
prefix_hint
and full_key_range
Internally, prefix_hint
will be used to for checking bloom_filter
and
full_key_range
used for iter. (if the prefix_hint
not None, it should be be included
in key_range
) The returned iterator will iterate data based on a snapshot
corresponding to the given epoch
.fn rev_iter( &self, key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> impl Future<Output = StorageResult<Self::RevIter>> + '_
async fn iter_log( &self, epoch_range: (u64, u64), key_range: TableKeyRange, options: ReadLogOptions, ) -> StorageResult<Self::ChangeLogIter>
source§fn get(
&self,
key: TableKey<Bytes>,
epoch: u64,
read_options: ReadOptions,
) -> impl Future<Output = StorageResult<Option<Bytes>>> + Send + '_
fn get( &self, key: TableKey<Bytes>, epoch: u64, read_options: ReadOptions, ) -> impl Future<Output = StorageResult<Option<Bytes>>> + Send + '_
epoch
.
Only the value is returned.Auto Trait Implementations§
impl !Freeze for LocalHummockStorage
impl !RefUnwindSafe for LocalHummockStorage
impl Send for LocalHummockStorage
impl Sync for LocalHummockStorage
impl Unpin for LocalHummockStorage
impl !UnwindSafe for LocalHummockStorage
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<S> DynamicDispatchedLocalStateStore for Swhere
S: LocalStateStore,
impl<S> DynamicDispatchedLocalStateStore for Swhere
S: LocalStateStore,
fn get<'life0, 'async_trait>(
&'life0 self,
key: TableKey<Bytes>,
read_options: ReadOptions,
) -> Pin<Box<dyn Future<Output = Result<Option<Bytes>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn iter<'life0, 'async_trait>(
&'life0 self,
key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>),
read_options: ReadOptions,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn DynamicDispatchedStateStoreIter<(FullKey<Bytes>, Bytes)> + 'life0>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn rev_iter<'life0, 'async_trait>(
&'life0 self,
key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>),
read_options: ReadOptions,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn DynamicDispatchedStateStoreIter<(FullKey<Bytes>, Bytes)> + 'life0>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn insert( &mut self, key: TableKey<Bytes>, new_val: Bytes, old_val: Option<Bytes>, ) -> Result<(), StorageError>
fn delete( &mut self, key: TableKey<Bytes>, old_val: Bytes, ) -> Result<(), StorageError>
fn flush<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<usize, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn try_flush<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn epoch(&self) -> u64
fn is_dirty(&self) -> bool
fn init<'life0, 'async_trait>(
&'life0 mut self,
options: InitOptions,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn seal_current_epoch(&mut self, next_epoch: u64, opts: SealCurrentEpochOptions)
fn update_vnode_bitmap(&mut self, vnodes: Arc<Bitmap>) -> Arc<Bitmap>
fn get_table_watermark(&self, vnode: VirtualNode) -> Option<Bytes>
source§impl<S> DynamicDispatchedStateStoreRead for Swhere
S: StateStoreRead,
impl<S> DynamicDispatchedStateStoreRead for Swhere
S: StateStoreRead,
fn get_keyed_row<'life0, 'async_trait>(
&'life0 self,
key: TableKey<Bytes>,
epoch: u64,
read_options: ReadOptions,
) -> Pin<Box<dyn Future<Output = Result<Option<(FullKey<Bytes>, Bytes)>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn iter<'life0, 'async_trait>(
&'life0 self,
key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>),
epoch: u64,
read_options: ReadOptions,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn DynamicDispatchedStateStoreIter<(FullKey<Bytes>, Bytes)>>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn rev_iter<'life0, 'async_trait>(
&'life0 self,
key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>),
epoch: u64,
read_options: ReadOptions,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn DynamicDispatchedStateStoreIter<(FullKey<Bytes>, Bytes)>>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn iter_log<'life0, 'async_trait>(
&'life0 self,
epoch_range: (u64, u64),
key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>),
options: ReadLogOptions,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn DynamicDispatchedStateStoreIter<(TableKey<Bytes>, ChangeLogValue<Bytes>)>>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> IntoResult<T> for T
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
impl<M> MetricVecRelabelExt for M
source§fn relabel(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level
.source§fn relabel_n(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
relabel_num: usize,
) -> RelabeledMetricVec<M>
fn relabel_n( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, relabel_num: usize, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
.source§fn relabel_debug_1(
self,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel_debug_1( self, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
with metric_level
set to
MetricLevel::Debug
and relabel_num
set to 1.§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<S> StateStoreReadExt for Swhere
S: StateStoreRead,
impl<S> StateStoreReadExt for Swhere
S: StateStoreRead,
source§async fn scan(
&self,
key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>),
epoch: u64,
limit: Option<usize>,
read_options: ReadOptions,
) -> Result<Vec<(FullKey<Bytes>, Bytes)>, StorageError>
async fn scan( &self, key_range: (Bound<TableKey<Bytes>>, Bound<TableKey<Bytes>>), epoch: u64, limit: Option<usize>, read_options: ReadOptions, ) -> Result<Vec<(FullKey<Bytes>, Bytes)>, StorageError>
limit
number of keys from a key range. If limit
is None
, scans all elements.
Internally, prefix_hint
will be used to for checking bloom_filter
and
full_key_range
used for iter.
The result is based on a snapshot corresponding to the given epoch
. Read more