Skip to main content

ReservationOptions

Enum ReservationOptions 

Source
pub enum ReservationOptions<'a> {
    New,
    BorrowedMetadata,
    BorrowedMetadataAndData,
    Hold(&'a Reservation),
}
Expand description

How metadata and allocator reservations should be handled for a transaction.

A transaction consumes space in two different ways:

  1. The transaction will consume space in the journal and eventually in an LSM tree (the “metadata” cost of the transaction).
  2. The transaction might also include additional allocations or deallocations. These may come directly from the global allocator, or they might come from a Reservation object, depending on the context. (See specific enum cases for details.)

The basic decision tree for which variant to use is as follows:

Variants§

§

New

A new reservation is created to accommodate the metadata of a maximally-sized transaction, and the transaction’s metadata is paid for from this reservation. Allocations and deallocations within the transaction will go directly to the global allocator (and therefore might fail if there’s insufficient space).

This should be the default case for most transactions which permit failure when there’s no space left in the global allocator.

§

BorrowedMetadata

Metadata space is borrowed directly from the global reservation held by the ObjectManager. Deallocations in the transaction will be returned to the allocator, rather than to the global reservation.

This must be used for transactions which will either not affect net space usage after compaction (e.g. setting attributes on an object), or will reduce space (e.g. unlinking a file or deleting a range of extents). By extension, this should not be used for transactions which include allocations.

When this is used appropriately, it is guaranteed that transactions will not fail due to lack of space.

When choosing between this and BorrowedMetadataAndData, the main consideration is whether the freed space from a deallocation must go back to the global reservation, or whether it can go back to the global pool. An example of where it must go back to the global reservation would be when purging a layer file during compaction; that space was borrowed from the metadata reservation, so it needs to go back there as well (and in that case BorrowedMetadataAndData should be used instead).

§

BorrowedMetadataAndData

Metadata space is borrowed directly from the global reservation held by the ObjectManager. Allocations and deallocations in the transaction will be from the global reservation as well.

This must be used for transactions that allocate or deallocate extents for internal filesystem metadata, such as journal and superblock growth, LSM tree compaction, and graveyard tombstoning of objects in the root and root-parent stores. These transactions will never fail due to running out of space (barring any bugs resulting in a deficit in the global reservation).

§

Hold(&'a Reservation)

Use the specified reservation for the transaction’s metadata (placing a hold on it) as well as any allocations or deallocations in the transaction.

Trait Implementations§

Source§

impl<'a> Clone for ReservationOptions<'a>

Source§

fn clone(&self) -> ReservationOptions<'a>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Copy for ReservationOptions<'a>

Source§

impl<'a> Default for ReservationOptions<'a>

Source§

fn default() -> ReservationOptions<'a>

Returns the “default value” for a type. Read more

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T, D> Encode<Ambiguous1, D> for T
where D: ResourceDialect,

§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
§

impl<T, D> Encode<Ambiguous2, D> for T
where D: ResourceDialect,

§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
§

impl<F, N> FidlIntoNative<Box<N>> for F
where F: FidlIntoNative<N>,

§

fn fidl_into_native(self) -> Box<N>

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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.