TrackConsumersPool

Struct TrackConsumersPool 

Source
pub struct TrackConsumersPool<I> { /* private fields */ }
Expand description

A MemoryPool that tracks the consumers that have reserved memory within the inner memory pool.

By tracking memory reservations more carefully this pool can provide better error messages on the largest memory users when memory allocation fails.

Tracking is per hashed MemoryConsumer, not per MemoryReservation. The same consumer can have multiple reservations.

§Automatic Usage via RuntimeEnvBuilder

The easiest way to use TrackConsumersPool is via RuntimeEnvBuilder::with_memory_limit().

§Usage Examples

For more examples of using TrackConsumersPool, see the memory_pool_tracking.rs example

Implementations§

Source§

impl<I: MemoryPool> TrackConsumersPool<I>

Source

pub fn new(inner: I, top: NonZeroUsize) -> Self

Creates a new TrackConsumersPool.

§Arguments
  • inner - The underlying memory pool that handles actual memory allocation
  • top - The number of top memory consumers to include in error messages
§Note

In most cases, you should use RuntimeEnvBuilder::with_memory_limit() instead of creating this pool manually, as it automatically sets up tracking with sensible defaults (top 5 consumers).

§Example
use std::num::NonZeroUsize;
use datafusion_execution::memory_pool::{TrackConsumersPool, GreedyMemoryPool, FairSpillPool};

// Create with a greedy pool backend, reporting top 3 consumers in error messages
let tracked_greedy = TrackConsumersPool::new(
    GreedyMemoryPool::new(1024 * 1024), // 1MB limit
    NonZeroUsize::new(3).unwrap(),
);

// Create with a fair spill pool backend, reporting top 5 consumers in error messages
let tracked_fair = TrackConsumersPool::new(
    FairSpillPool::new(2 * 1024 * 1024), // 2MB limit
    NonZeroUsize::new(5).unwrap(),
);
§Impact on Error Messages

The top determines how many Top K MemoryConsumers to include in the reported DataFusionError::ResourcesExhausted.

Source

pub fn report_top(&self, top: usize) -> String

Returns a formatted string with the top memory consumers.

Trait Implementations§

Source§

impl<I: Debug> Debug for TrackConsumersPool<I>

Source§

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

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

impl<I: MemoryPool> MemoryPool for TrackConsumersPool<I>

Source§

fn register(&self, consumer: &MemoryConsumer)

Registers a new MemoryConsumer Read more
Source§

fn unregister(&self, consumer: &MemoryConsumer)

Records the destruction of a MemoryReservation with MemoryConsumer Read more
Source§

fn grow(&self, reservation: &MemoryReservation, additional: usize)

Infallibly grow the provided reservation by additional bytes Read more
Source§

fn shrink(&self, reservation: &MemoryReservation, shrink: usize)

Infallibly shrink the provided reservation by shrink bytes
Source§

fn try_grow( &self, reservation: &MemoryReservation, additional: usize, ) -> Result<()>

Attempt to grow the provided reservation by additional bytes Read more
Source§

fn reserved(&self) -> usize

Return the total amount of memory reserved
Source§

fn memory_limit(&self) -> MemoryLimit

Return the memory limit of the pool Read more

Auto Trait Implementations§

§

impl<I> !Freeze for TrackConsumersPool<I>

§

impl<I> !RefUnwindSafe for TrackConsumersPool<I>

§

impl<I> Send for TrackConsumersPool<I>
where I: Send,

§

impl<I> Sync for TrackConsumersPool<I>
where I: Sync,

§

impl<I> Unpin for TrackConsumersPool<I>
where I: Unpin,

§

impl<I> UnwindSafe for TrackConsumersPool<I>
where I: UnwindSafe,

Blanket Implementations§

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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, 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> ErasedDestructor for T
where T: 'static,