pub struct HummockStorage {Show 16 fields
hummock_event_sender: HummockEventSender,
_version_update_sender: UnboundedSender<HummockVersionUpdate>,
context: CompactorContext,
compaction_catalog_manager_ref: CompactionCatalogManagerRef,
sstable_object_id_manager: SstableObjectIdManagerRef,
buffer_tracker: BufferTracker,
version_update_notifier_tx: Arc<Sender<PinnedVersion>>,
recent_versions: Arc<ArcSwap<RecentVersions>>,
hummock_version_reader: HummockVersionReader,
_shutdown_guard: Arc<HummockStorageShutdownGuard>,
read_version_mapping: ReadOnlyReadVersionMapping,
backup_reader: BackupReaderRef,
write_limiter: WriteLimiterRef,
compact_await_tree_reg: Option<CompactionAwaitTreeRegRef>,
hummock_meta_client: Arc<dyn HummockMetaClient>,
simple_time_travel_version_cache: Arc<SimpleTimeTravelVersionCache>,
}
Expand description
HummockStorage
is the entry point of the Hummock state store backend.
It implements the StateStore
and StateStoreRead
traits but not the StateStoreWrite
trait
since all writes should be done via LocalHummockStorage
to ensure the single writer property
of hummock. LocalHummockStorage
instance can be created via new_local
call.
Hummock is the state store backend.
Fields§
§hummock_event_sender: HummockEventSender
§_version_update_sender: UnboundedSender<HummockVersionUpdate>
§context: CompactorContext
§compaction_catalog_manager_ref: CompactionCatalogManagerRef
§sstable_object_id_manager: SstableObjectIdManagerRef
§buffer_tracker: BufferTracker
§version_update_notifier_tx: Arc<Sender<PinnedVersion>>
§recent_versions: Arc<ArcSwap<RecentVersions>>
§hummock_version_reader: HummockVersionReader
§_shutdown_guard: Arc<HummockStorageShutdownGuard>
§read_version_mapping: ReadOnlyReadVersionMapping
§backup_reader: BackupReaderRef
§write_limiter: WriteLimiterRef
§compact_await_tree_reg: Option<CompactionAwaitTreeRegRef>
§hummock_meta_client: Arc<dyn HummockMetaClient>
§simple_time_travel_version_cache: Arc<SimpleTimeTravelVersionCache>
Implementations§
source§impl HummockStorage
impl HummockStorage
sourcepub async fn new(
options: Arc<StorageOpts>,
sstable_store: SstableStoreRef,
hummock_meta_client: Arc<dyn HummockMetaClient>,
notification_client: impl NotificationClient,
compaction_catalog_manager_ref: CompactionCatalogManagerRef,
state_store_metrics: Arc<HummockStateStoreMetrics>,
compactor_metrics: Arc<CompactorMetrics>,
await_tree_config: Option<Config>,
) -> HummockResult<Self>
pub async fn new( options: Arc<StorageOpts>, sstable_store: SstableStoreRef, hummock_meta_client: Arc<dyn HummockMetaClient>, notification_client: impl NotificationClient, compaction_catalog_manager_ref: CompactionCatalogManagerRef, state_store_metrics: Arc<HummockStateStoreMetrics>, compactor_metrics: Arc<CompactorMetrics>, await_tree_config: Option<Config>, ) -> HummockResult<Self>
Creates a HummockStorage
.
sourceasync fn get_inner(
&self,
key: TableKey<Bytes>,
epoch: HummockEpoch,
read_options: ReadOptions,
) -> StorageResult<Option<StateStoreKeyedRow>>
async fn get_inner( &self, key: TableKey<Bytes>, epoch: HummockEpoch, read_options: ReadOptions, ) -> StorageResult<Option<StateStoreKeyedRow>>
Gets the value of a specified key
in the table specified in read_options
.
The result is based on a snapshot corresponding to the given epoch
.
if key
has consistent hash virtual node value, then such value is stored in value_meta
If Ok(Some())
is returned, the key is found. If Ok(None)
is returned,
the key is not found. If Err()
is returned, the searching for the key
failed due to other non-EOF errors.
async fn iter_inner( &self, key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> StorageResult<HummockStorageIterator>
async fn rev_iter_inner( &self, key_range: TableKeyRange, epoch: u64, read_options: ReadOptions, ) -> StorageResult<HummockStorageRevIterator>
async fn get_time_travel_version( &self, epoch: u64, table_id: TableId, ) -> StorageResult<PinnedVersion>
async fn build_read_version_tuple( &self, epoch: u64, key_range: TableKeyRange, read_options: &ReadOptions, ) -> StorageResult<(TableKeyRange, ReadVersionTuple)>
async fn build_read_version_tuple_from_backup( &self, epoch: u64, table_id: TableId, key_range: TableKeyRange, ) -> StorageResult<(TableKeyRange, ReadVersionTuple)>
async fn build_read_version_tuple_from_committed( &self, epoch: u64, table_id: TableId, key_range: TableKeyRange, ) -> StorageResult<(TableKeyRange, ReadVersionTuple)>
fn build_read_version_tuple_from_all( &self, epoch: u64, table_id: TableId, key_range: TableKeyRange, ) -> StorageResult<(TableKeyRange, ReadVersionTuple)>
async fn new_local_inner(&self, option: NewLocalOptions) -> LocalHummockStorage
pub async fn clear_tables(&self, table_ids: HashSet<TableId>)
sourcepub fn start_epoch(&self, epoch: HummockEpoch, table_ids: HashSet<TableId>)
pub fn start_epoch(&self, epoch: HummockEpoch, table_ids: HashSet<TableId>)
Declare the start of an epoch. This information is provided for spill so that the spill task won’t include data of two or more syncs.
pub fn sstable_store(&self) -> SstableStoreRef
pub fn sstable_object_id_manager(&self) -> &SstableObjectIdManagerRef
pub fn compaction_catalog_manager_ref(&self) -> CompactionCatalogManagerRef
pub fn get_memory_limiter(&self) -> Arc<MemoryLimiter>
pub fn get_pinned_version(&self) -> PinnedVersion
pub fn backup_reader(&self) -> BackupReaderRef
pub fn compaction_await_tree_reg(&self) -> Option<&Registry>
pub async fn min_uncommitted_sst_id(&self) -> Option<HummockSstableObjectId>
pub async fn sync( &self, sync_table_epochs: Vec<(HummockEpoch, HashSet<TableId>)>, ) -> StorageResult<SyncResult>
source§impl HummockStorage
impl HummockStorage
pub async fn seal_and_sync_epoch( &self, epoch: u64, table_ids: HashSet<TableId>, ) -> StorageResult<SyncResult>
sourcepub async fn update_version_and_wait(&self, version: HummockVersion)
pub async fn update_version_and_wait(&self, version: HummockVersion)
Used in the compaction test tool
pub async fn wait_version(&self, version: HummockVersion)
sourcepub async fn for_test(
options: Arc<StorageOpts>,
sstable_store: SstableStoreRef,
hummock_meta_client: Arc<dyn HummockMetaClient>,
notification_client: impl NotificationClient,
) -> HummockResult<Self>
pub async fn for_test( options: Arc<StorageOpts>, sstable_store: SstableStoreRef, hummock_meta_client: Arc<dyn HummockMetaClient>, notification_client: impl NotificationClient, ) -> HummockResult<Self>
Creates a HummockStorage
with default stats. Should only be used by tests.
pub fn storage_opts(&self) -> &Arc<StorageOpts>
pub fn version_reader(&self) -> &HummockVersionReader
pub async fn wait_version_update( &self, old_id: HummockVersionId, ) -> HummockVersionId
Trait Implementations§
source§impl AsHummock for HummockStorage
impl AsHummock for HummockStorage
fn as_hummock(&self) -> Option<&HummockStorage>
source§impl Clone for HummockStorage
impl Clone for HummockStorage
source§fn clone(&self) -> HummockStorage
fn clone(&self) -> HummockStorage
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl StateStore for HummockStorage
impl StateStore for HummockStorage
source§async fn try_wait_epoch(
&self,
wait_epoch: HummockReadEpoch,
options: TryWaitEpochOptions,
) -> StorageResult<()>
async fn try_wait_epoch( &self, wait_epoch: HummockReadEpoch, options: TryWaitEpochOptions, ) -> StorageResult<()>
Waits until the local hummock version contains the epoch. If wait_epoch
is Current
,
we will only check whether it is le sealed_epoch
and won’t wait.
type Local = LocalHummockStorage
fn new_local( &self, option: NewLocalOptions, ) -> impl Future<Output = Self::Local> + Send + '_
source§fn monitored(
self,
storage_metrics: Arc<MonitoredStorageMetrics>,
) -> MonitoredStateStore<Self>
fn monitored( self, storage_metrics: Arc<MonitoredStorageMetrics>, ) -> MonitoredStateStore<Self>
MonitoredStateStore
from this state store, with given stats
.source§impl StateStoreRead for HummockStorage
impl StateStoreRead for HummockStorage
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 HummockStorage
impl !RefUnwindSafe for HummockStorage
impl Send for HummockStorage
impl Sync for HummockStorage
impl Unpin for HummockStorage
impl !UnwindSafe for HummockStorage
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
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§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> DynamicDispatchedStateStoreExt for Swhere
S: StateStore,
impl<S> DynamicDispatchedStateStoreExt for Swhere
S: StateStore,
fn try_wait_epoch<'life0, 'async_trait>(
&'life0 self,
epoch: HummockReadEpoch,
options: TryWaitEpochOptions,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
fn new_local<'life0, 'async_trait>(
&'life0 self,
option: NewLocalOptions,
) -> Pin<Box<dyn Future<Output = Box<dyn DynamicDispatchedLocalStateStore>> + Send + 'async_trait>>where
'life0: 'async_trait,
S: 'async_trait,
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