pub struct Batch<K, V, T, D> {
pub(crate) batch_delete_enabled: bool,
pub(crate) metrics: Arc<Metrics>,
pub(crate) shard_metrics: Arc<ShardMetrics>,
pub(crate) version: Version,
pub(crate) batch: HollowBatch<T>,
pub(crate) blob: Arc<dyn Blob>,
pub(crate) _phantom: PhantomData<fn() -> (K, V, T, D)>,
}
Expand description
A handle to a batch of updates that has been written to blob storage but which has not yet been appended to a shard.
A Batch needs to be marked as consumed or it needs to be deleted via Self::delete. Otherwise, a dangling batch will leak and backing blobs will remain in blob storage.
Fields§
§batch_delete_enabled: bool
§metrics: Arc<Metrics>
§shard_metrics: Arc<ShardMetrics>
§version: Version
The version of Materialize which wrote this batch.
batch: HollowBatch<T>
A handle to the data represented by this batch.
blob: Arc<dyn Blob>
Handle to the Blob that the blobs of this batch were uploaded to.
_phantom: PhantomData<fn() -> (K, V, T, D)>
Implementations§
Source§impl<K, V, T, D> Batch<K, V, T, D>
impl<K, V, T, D> Batch<K, V, T, D>
pub(crate) fn new( batch_delete_enabled: bool, metrics: Arc<Metrics>, blob: Arc<dyn Blob>, shard_metrics: Arc<ShardMetrics>, version: Version, batch: HollowBatch<T>, ) -> Self
Sourcepub(crate) fn mark_consumed(&mut self)
pub(crate) fn mark_consumed(&mut self)
Marks the blobs that this batch handle points to as consumed, likely because they were appended to a shard.
Consumers of a blob need to make this explicit, so that we can log warnings in case a batch is not used.
Sourcepub async fn delete(self)
pub async fn delete(self)
Deletes the blobs that make up this batch from the given blob store and marks them as deleted.
Sourcepub fn schemas(&self) -> impl Iterator<Item = SchemaId> + '_
pub fn schemas(&self) -> impl Iterator<Item = SchemaId> + '_
Returns the schemas of parts in this batch.
Sourcepub fn into_hollow_batch(self) -> HollowBatch<T>
pub fn into_hollow_batch(self) -> HollowBatch<T>
Turns this Batch
into a HollowBatch
.
NOTE: If this batch is not eventually appended to a shard or dropped, the data that it represents will have leaked.
Sourcepub fn into_transmittable_batch(self) -> ProtoBatch
pub fn into_transmittable_batch(self) -> ProtoBatch
Turns this Batch
into a ProtoBatch
, which can be used to
transfer this batch across process boundaries, for example when
exchanging data between timely workers.
NOTE: If this batch is not eventually appended to a shard or
dropped, the data that it represents will have leaked. The caller is
responsible for turning this back into a Batch
using
WriteHandle::batch_from_transmittable_batch
.
pub(crate) async fn flush_to_blob( &mut self, cfg: &BatchBuilderConfig, batch_metrics: &BatchWriteMetrics, isolated_runtime: &Arc<IsolatedRuntime>, write_schemas: &Schemas<K, V>, )
Source§impl<K, V, T, D> Batch<K, V, T, D>
impl<K, V, T, D> Batch<K, V, T, D>
Sourcepub fn rewrite_ts(
&mut self,
frontier: &Antichain<T>,
new_upper: Antichain<T>,
) -> Result<(), InvalidUsage<T>>
pub fn rewrite_ts( &mut self, frontier: &Antichain<T>, new_upper: Antichain<T>, ) -> Result<(), InvalidUsage<T>>
Efficiently rewrites the timestamps in this not-yet-committed batch.
This Batch represents potentially large amounts of data, which may have partly or entirely been spilled to s3. This call bulk edits the timestamps of all data in this batch in a metadata-only operation (i.e. without network calls).
Specifically, every timestamp in the batch is logically advanced_by the
provided frontier
.
This method may be called multiple times, with later calls overriding previous ones, but the rewrite frontier may not regress across calls.
When this batch was created, it was given an upper
, which bounds the
staged data it represents. To allow rewrite past this original upper
,
this call accepts a new upper
which replaces the previous one. Like
the rewrite frontier, the upper may not regress across calls.
Multiple batches with various rewrite frontiers may be used in a single crate::write::WriteHandle::compare_and_append_batch call. This is an expected usage.
This feature requires that the timestamp impls TotalOrder
. This is
because we need to be able to verify that the contained data, after the
rewrite forward operation, still respects the new upper. It turns out
that, given the metadata persist currently collects during batch
collection, this is possible for totally ordered times, but it’s known
to be not possible for partially ordered times. It is believed that we
could fix this by collecting different metadata in batch creation (e.g.
the join of or an antichain of the original contained timestamps), but
the experience of database-issues#7825 has shaken our confidence in our own abilities
to reason about partially ordered times and anyway all the initial uses
have totally ordered times.
Trait Implementations§
Auto Trait Implementations§
impl<K, V, T, D> Freeze for Batch<K, V, T, D>where
T: Freeze,
impl<K, V, T, D> !RefUnwindSafe for Batch<K, V, T, D>
impl<K, V, T, D> Send for Batch<K, V, T, D>where
T: Send,
impl<K, V, T, D> Sync for Batch<K, V, T, D>where
T: Sync,
impl<K, V, T, D> Unpin for Batch<K, V, T, D>where
T: Unpin,
impl<K, V, T, D> !UnwindSafe for Batch<K, V, T, D>
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> 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::Request
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>
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> Pointable for T
impl<T> Pointable for T
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
.