Skip to main content

SpillableJoinSelection

Struct SpillableJoinSelection 

Source
pub struct SpillableJoinSelection { /* private fields */ }
Expand description

Convert hash joins whose estimated build side cannot fit the per-task memory share into sort-merge joins, which can spill.

Implementations§

Source§

impl SpillableJoinSelection

Source

pub fn from_capacity() -> Self

Derive the threshold from the process’s capacity decision, honouring SPILL_JOIN_BUILD_BYTES_ENV.

Source

pub fn without_broadcast_rescue(self) -> Self

Forbid the degenerate-broadcast rescue — for a plan that is about to be cut into stages, where an added exchange is an added stage boundary.

Source

pub fn for_local_execution() -> Self

Same threshold as Self::from_capacity, but allowed to choose the grace hash join.

Only for plans that are already decoded and will not be serialized — see distributed_plan::apply_local_spill_strategy.

Source

pub fn with_grace_where_plans_are_never_encoded(self) -> Self

Allow grace only in a process that never encodes a stage plan.

with_krishiv_optimizer_rules is shared by two callers with opposite requirements: the coordinator’s staging planner, whose output must survive datafusion-proto (a GraceHashJoinExec there fails to encode and the scheduler’s response is to run the whole query as a SINGLE TASK), and the one-shot CLI, whose plans never leave the process.

is_single_query_process() separates them exactly: stage building happens only in build_stages_for_parquet_tables, reached solely from krishiv-scheduler’s distributed_batch, i.e. the coordinator daemon, which never declares itself single-query. It is also the same predicate that gates rescue_degenerate_broadcast, which is the point: the rescue exists to make a degenerate broadcast spillable, and grace is the better way to spill one. Enabling them apart is what left the rescue handing every join to sort-merge while grace sat unreachable.

This does not turn grace on — grace_hash_join::enabled() still defaults off. It stops KRISHIV_GRACE_HASH_JOIN from being silently inert in the tier that has the rescue.

Source

pub fn with_threshold(threshold_bytes: Option<u64>) -> Self

Explicit threshold, for tests. Keeps the sort-merge conversion.

Source

pub fn with_threshold_and_grace( threshold_bytes: Option<u64>, grace: bool, ) -> Self

Explicit threshold and algorithm, for tests.

Trait Implementations§

Source§

impl Debug for SpillableJoinSelection

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PhysicalOptimizerRule for SpillableJoinSelection

Source§

fn name(&self) -> &str

A human readable name for this optimizer rule
Source§

fn schema_check(&self) -> bool

A flag to indicate whether the physical planner should validate that the rule will not change the schema of the plan after the rewriting. Some of the optimization rules might change the nullable properties of the schema and should disable the schema check.
Source§

fn optimize( &self, plan: Arc<dyn ExecutionPlan>, config: &ConfigOptions, ) -> Result<Arc<dyn ExecutionPlan>>

Rewrite plan to an optimized form. Read more
Source§

fn optimize_with_context( &self, plan: Arc<dyn ExecutionPlan>, context: &dyn PhysicalOptimizerContext, ) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>

Rewrite plan with access to extended context (statistics registry, etc.). Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more