ResourceRegistry

Struct ResourceRegistry 

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

A registry for scarce, externally backed resources.

In many cases, data planes will have to interact with the outside world by way of exposing network endpoints, or exposing files, and so on… referred to here as “resources.” These resources are unique, or are conceptually meant to be unique: there should be no other OS processes trying to take ownership of them, and only one part of the code in the data plane should own them.

A ResourceRegistry owns those resources on behalf of the entire data plane and lends them out. A child process never owns a resource, but instead holds a ResourceLease. When the lease drops – including when the child process holding it dies – the resource returns to the registry intact and still live, ready for the next acquirer. Since the registry outlives the components that use its resources, a component can be torn down and rebuilt without the underlying resource being automatically released back to the operating system due to typical Rust drop semantics.

§Groups

Resources are named by a ResourceSpecification, which provides the blueprint for how to create a particular resource, such as a network socket, when a caller attempts to acquire it. Resource specifications are generally tied one-to-one with a particular type.

The specification provides both the information necessary to properly determine one unique resource from another, as well as a mechanism for consistent creation of potentially complex resources, including asynchronous initialization.

§Keys and conflicts

Entries are keyed by kind and key together, deliberately not by resource type. Two different Rust types can easily describe the same scarce thing – a connection-oriented listener and a general one over the same address – and keying by type would let each of them claim it. Kind is coarse enough that such representations still collide, while keeping unrelated resource families from colliding on a coincidentally equal key. A key therefore only has to be unique within its own kind.

Implementations§

Source§

impl ResourceRegistry

Source

pub fn new() -> Self

Creates an empty registry.

Source

pub async fn acquire<S: ResourceSpecification>( &self, owner: &SubsystemIdentifier, spec: S, ) -> Result<ResourceLease<S::Resource>, AcquireError>

Acquires the resource named by spec, creating it if it isn’t registered yet.

owner identifies the subsystem taking the lease and is recorded, alongside the current process identifier, for accounting.

If the resource is already registered, the existing one is handed back rather than a new one being created. This is the mechanism by which a resource outlives the components that use it.

§Errors

If the resource is already leased, if the key is registered to a different type of resource, or if creation fails, an error is returned.

Source

pub fn snapshot(&self) -> Vec<ResourceStatus>

Returns a snapshot of every registered resource, ordered by key.

Source

pub fn api_handler(&self) -> ResourceRegistryAPIHandler

Creates an API handler for reporting the state of all registered resources.

Source

pub fn worker(&self) -> ResourceRegistryWorker

Creates a ResourceRegistryWorker that publishes the registry over the control plane.

Trait Implementations§

Source§

impl Clone for ResourceRegistry

Source§

fn clone(&self) -> ResourceRegistry

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Default for ResourceRegistry

Source§

fn default() -> ResourceRegistry

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

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
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> 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> 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
§

impl<T> Track for T

§

fn track_resources(self, token: ResourceGroupToken) -> Tracked<Self>

Instruments this type by attaching the given resource group token, returning a Tracked wrapper. Read more
§

fn in_current_resource_group(self) -> Tracked<Self>

Instruments this type by attaching the current resource group, returning a Tracked wrapper. 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> 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
Source§

impl<T> CloneAny for T
where T: Any + Clone,