pub struct SstableStreamIterator {Show 14 fields
sstable_store: SstableStoreRef,
block_metas: Vec<BlockMeta>,
block_stream: Option<BlockDataStream>,
block_iter: Option<BlockIterator>,
block_idx: usize,
stats_ptr: Arc<AtomicU64>,
sstable_info: SstableInfo,
sstable_table_ids: HashSet<StateTableId>,
task_progress: Arc<TaskProgress>,
io_retry_times: usize,
max_io_retry_times: usize,
key_range_left: FullKey<Vec<u8>>,
key_range_right: FullKey<Vec<u8>>,
key_range_right_exclusive: bool,
}
Expand description
Iterates over the KV-pairs of an SST while downloading it.
SstableStreamIterator
encapsulates operations on sstables
, constructing block streams and accessing the corresponding data via block_metas
.
Note that a block_meta
does not necessarily correspond to the entire sstable, but rather to a subset, which is documented via the block_idx
.
Fields§
§sstable_store: SstableStoreRef
§block_metas: Vec<BlockMeta>
The block metas subset of the SST.
block_stream: Option<BlockDataStream>
The downloading stream.
block_iter: Option<BlockIterator>
Iterates over the KV-pairs of the current block.
block_idx: usize
Index of the current block.
stats_ptr: Arc<AtomicU64>
Counts the time used for IO.
sstable_info: SstableInfo
For key sanity check of divided SST and debugging
sstable_table_ids: HashSet<StateTableId>
To Filter out the blocks
task_progress: Arc<TaskProgress>
§io_retry_times: usize
§max_io_retry_times: usize
§key_range_left: FullKey<Vec<u8>>
§key_range_right: FullKey<Vec<u8>>
§key_range_right_exclusive: bool
Implementations§
source§impl SstableStreamIterator
impl SstableStreamIterator
sourcepub fn new(
block_metas: Vec<BlockMeta>,
sstable_info: SstableInfo,
stats: &StoreLocalStatistic,
task_progress: Arc<TaskProgress>,
sstable_store: SstableStoreRef,
max_io_retry_times: usize,
) -> Self
pub fn new( block_metas: Vec<BlockMeta>, sstable_info: SstableInfo, stats: &StoreLocalStatistic, task_progress: Arc<TaskProgress>, sstable_store: SstableStoreRef, max_io_retry_times: usize, ) -> Self
Initialises a new SstableStreamIterator
which iterates over the given BlockDataStream
.
The iterator reads at most max_block_count
from the stream.
async fn create_stream(&mut self) -> HummockResult<()>
async fn prune_from_valid_block_iter(&mut self) -> HummockResult<()>
sourcepub async fn seek(
&mut self,
seek_key: Option<FullKey<&[u8]>>,
) -> HummockResult<()>
pub async fn seek( &mut self, seek_key: Option<FullKey<&[u8]>>, ) -> HummockResult<()>
Initialises the iterator by moving it to the first KV-pair in the stream’s first block where
key >= seek_key
. If that block does not contain such a KV-pair, the iterator continues to
the first KV-pair of the next block. If seek_key
is not given, the iterator will move to
the very first KV-pair of the stream’s first block.
sourceasync fn next_block(&mut self) -> HummockResult<()>
async fn next_block(&mut self) -> HummockResult<()>
Loads a new block, creates a new iterator for it, and stores that iterator in
self.block_iter
. The created iterator points to the block’s first KV-pair. If the end of
the stream is reached or self.remaining_blocks
is zero, then the function sets
self.block_iter
to None
.
sourcepub async fn next(&mut self) -> HummockResult<()>
pub async fn next(&mut self) -> HummockResult<()>
Moves to the next KV-pair in the table. Assumes that the current position is valid. Even if
the next position is invalid, the function returns Ok(())
.
Do not use next()
to initialise the iterator (i.e. do not use it to find the first
KV-pair). Instead, use seek()
. Afterwards, use next()
to reach the second KV-pair and
onwards.
pub fn key(&self) -> FullKey<&[u8]>
pub fn value(&self) -> HummockValue<&[u8]>
pub fn is_valid(&self) -> bool
fn sst_debug_info(&self) -> String
fn need_recreate_io_stream(&self) -> bool
fn exceed_key_range_left(&self, key: FullKey<&[u8]>) -> bool
fn exceed_key_range_right(&self, key: FullKey<&[u8]>) -> bool
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for SstableStreamIterator
impl !RefUnwindSafe for SstableStreamIterator
impl Send for SstableStreamIterator
impl !Sync for SstableStreamIterator
impl Unpin for SstableStreamIterator
impl !UnwindSafe for SstableStreamIterator
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> 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.