struct Chunk<D: Data> {
pooled: Mutex<Option<ChunkHandle>>,
resident: OnceLock<ColumnBody<(D, Timestamp, Diff)>>,
len: usize,
body_words: usize,
first_time: Timestamp,
last_time: Timestamp,
depth: u8,
}Expand description
A non-empty chunk of updates, backed by a columnar region.
All updates in a chunk are sorted by (time, data) and consolidated.
Chunks are immutable once created. They are produced by ChunkBuilder, which mints a
new chunk whenever its in-progress columnar container reaches a fixed serialized byte
boundary (~2 MiB, matching the ship granularity used elsewhere in the codebase), so each
chunk corresponds to a single, predictably sized allocation.
Fields§
§pooled: Mutex<Option<ChunkHandle>>The body in the buffer pool, which may spill it.
Empty when the body stays on the heap, which is what
mz_timely_util::columnar::chunk::try_spill_ref decides, and emptied again by
Chunk::body: a materialized chunk holds its body on the heap for the rest of its
life, so keeping the pool’s copy alive would only double the footprint and hold budget
the pool could give to a chunk that still needs it. Chunk::with_view reads a copy and
leaves the body here.
A Mutex (not RefCell) keeps the chunk Sync: cursors hold chunks behind a shared
Rc, and the iterator returned by CorrectionV2::updates_before borrows them across
the persist writer’s await, so &Chunk must be Send. The lock is taken at
materialization and for scoped reads, and is otherwise uncontended (the sink runs
single-threaded per worker).
resident: OnceLock<ColumnBody<(D, Timestamp, Diff)>>The materialized form, populated lazily by Chunk::body on first access.
An OnceLock for the same Sync reason as pooled. Once set the slot is never
cleared, so its address is stable and Chunk::index can hand out Ref<'_> borrows
tied to &self. The allocation is freed when the chunk drops, which bounds resident
memory to the chunks under an active merge front.
len: usizeNumber of updates, cached so len and chain bookkeeping never page the chunk in.
body_words: usizeSerialized size of the body in words, cached so size accounting never pages it in.
first_time: TimestampTime of the first update, cached so boundary checks (split_at_time, can_accept) route
a resting chunk without materializing it.
last_time: TimestampTime of the last update, cached likewise.
depth: u8The generational depth: 0 for chunks built from staged updates or written by a read,
one more than the deepest input for chunks written by a bucket’s chain merge. The pool
treats deeper chunks as colder, and compresses them past the floor set by
chunk::set_compress_min_depth.
Implementations§
Source§impl<D: Data> Chunk<D>
impl<D: Data> Chunk<D>
Sourcefn mint(body: &mut ColumnBody<(D, Timestamp, Diff)>, depth: u8) -> Self
fn mint(body: &mut ColumnBody<(D, Timestamp, Diff)>, depth: u8) -> Self
Mint a chunk from the given non-empty body, emptying it.
Reads the metadata a resting chunk must answer (length, size, boundary times) while the body is still in hand, then offers it to the buffer pool. A body the pool takes is encoded straight into its slot, which leaves the typed allocation behind for the caller to refill, and materializes lazily on first read. A body the pool declines is serialized out of the typed allocation instead, because a resident chunk has to own it.
§Panics
Panics if the body is empty. Chunks are non-empty by construction; ChunkBuilder
only ever mints from a populated body.
Sourcefn body(&self) -> &ColumnBody<(D, Timestamp, Diff)>
fn body(&self) -> &ColumnBody<(D, Timestamp, Diff)>
Materialize the chunk’s body, taking it out of the pool on first access.
The returned reference is valid for as long as &self: the OnceLock slot is never
cleared once populated, so its contents have a stable address. Taking the body frees the
pool’s copy, so the chunk holds exactly one.
For reads by merges and splits, whose output replaces the chunk. A read after which the
chunk survives uses Chunk::with_view, which keeps the body spillable.
Sourcefn with_view<R>(
&self,
f: impl FnOnce(<<(D, Timestamp, Diff) as Columnar>::Container as Borrow>::Borrowed<'_>) -> R,
) -> R
fn with_view<R>( &self, f: impl FnOnce(<<(D, Timestamp, Diff) as Columnar>::Container as Borrow>::Borrowed<'_>) -> R, ) -> R
Call f with a view of the chunk’s body, leaving the body where it is.
A materialized chunk is read in place. Otherwise the body is copied out of the pool for the call and the copy dropped after it, so the pool keeps its slot and may still spill the body.
Sourcefn view(
&self,
) -> <<(D, Timestamp, Diff) as Columnar>::Container as Borrow>::Borrowed<'_>
fn view( &self, ) -> <<(D, Timestamp, Diff) as Columnar>::Container as Borrow>::Borrowed<'_>
Borrow the chunk’s body, paging it in if necessary.
Any caller that touches more than one update must hoist this out of its loop and index the
returned view. ColumnBody::borrow on a serialized body rebuilds the struct-of-arrays
view from the serialized header on every call, so borrowing per element pays that decode
per element.
Sourcefn index(&self, idx: usize) -> Ref<'_, (D, Timestamp, Diff)>
fn index(&self, idx: usize) -> Ref<'_, (D, Timestamp, Diff)>
Return the update at the given index, paging the chunk in if necessary.
Single-access only. Indexing a hoisted Chunk::view is the loop form.
§Panics
Panics if the given index is not populated.
Sourcefn first_time(&self) -> Timestamp
fn first_time(&self) -> Timestamp
Return the time of the first update, without materializing the chunk.
Sourcefn last_time(&self) -> Timestamp
fn last_time(&self) -> Timestamp
Return the time of the last update, without materializing the chunk.
Sourcefn find_time_greater_than(&self, time: Timestamp) -> Option<usize>
fn find_time_greater_than(&self, time: Timestamp) -> Option<usize>
Return the index of the first update at a time greater than time, or None if no such
update exists.
The early-out uses the cached last time, so a chunk whose updates are all at or before
time is skipped without paging it in.
Sourcefn size(&self) -> usize
fn size(&self) -> usize
Return the serialized size of the chunk’s body in bytes, for use in metrics.
The chunk holds exactly one copy of its body, in the pool or on the heap, so this is its
size either way. A scoped read’s copy lives only for the read. It is not a resident-byte
number: what the pool has evicted is the pool’s business, and it publishes
resident_bytes itself (mz_ore::pool::PoolStats).
Trait Implementations§
Auto Trait Implementations§
impl<D> !Freeze for Chunk<D>
impl<D> RefUnwindSafe for Chunk<D>where
<D as Columnar>::Container: Sized,
OnceLock<ColumnBody<(D, Timestamp, Overflowing<i64>)>>: RefUnwindSafe,
impl<D> Send for Chunk<D>where
<D as Columnar>::Container: Sized,
OnceLock<ColumnBody<(D, Timestamp, Overflowing<i64>)>>: Send,
impl<D> Sync for Chunk<D>where
<D as Columnar>::Container: Sized,
OnceLock<ColumnBody<(D, Timestamp, Overflowing<i64>)>>: Sync,
impl<D> Unpin for Chunk<D>where
<D as Columnar>::Container: Sized,
OnceLock<ColumnBody<(D, Timestamp, Overflowing<i64>)>>: Unpin,
impl<D> UnsafeUnpin for Chunk<D>where
<D as Columnar>::Container: Sized,
OnceLock<ColumnBody<(D, Timestamp, Overflowing<i64>)>>: UnsafeUnpin,
impl<D> UnwindSafe for Chunk<D>where
<D as Columnar>::Container: Sized,
OnceLock<ColumnBody<(D, Timestamp, Overflowing<i64>)>>: UnwindSafe,
Blanket Implementations§
impl<T> Allocation for T
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> Downcast for T
impl<T> Downcast for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<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::Requestimpl<T> MaybeSend for Twhere
T: Send,
impl<T> MaybeSend for Twhere
T: Send,
Source§impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
Source§fn into_rust(self) -> Result<R, TryFromProtoError>
fn into_rust(self) -> Result<R, TryFromProtoError>
RustType::from_proto.Source§fn from_rust(rust: &R) -> P
fn from_rust(rust: &R) -> P
RustType::into_proto.Source§impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
Source§fn plus_equals(&mut self, rhs: &&'a S)
fn plus_equals(&mut self, rhs: &&'a S)
std::ops::AddAssign, for types that do not implement AddAssign.Source§impl<T> ServiceExt for T
impl<T> ServiceExt for T
Source§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
Source§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
Source§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
Source§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
Source§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.