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
impl ResourceRegistry
Sourcepub async fn acquire<S: ResourceSpecification>(
&self,
owner: &SubsystemIdentifier,
spec: S,
) -> Result<ResourceLease<S::Resource>, AcquireError>
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.
Sourcepub fn snapshot(&self) -> Vec<ResourceStatus>
pub fn snapshot(&self) -> Vec<ResourceStatus>
Returns a snapshot of every registered resource, ordered by key.
Sourcepub fn api_handler(&self) -> ResourceRegistryAPIHandler
pub fn api_handler(&self) -> ResourceRegistryAPIHandler
Creates an API handler for reporting the state of all registered resources.
Sourcepub fn worker(&self) -> ResourceRegistryWorker
pub fn worker(&self) -> ResourceRegistryWorker
Creates a ResourceRegistryWorker that publishes the registry over the control plane.
Trait Implementations§
Source§impl Clone for ResourceRegistry
impl Clone for ResourceRegistry
Source§fn clone(&self) -> ResourceRegistry
fn clone(&self) -> ResourceRegistry
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Default for ResourceRegistry
impl Default for ResourceRegistry
Source§fn default() -> ResourceRegistry
fn default() -> ResourceRegistry
Auto Trait Implementations§
impl Freeze for ResourceRegistry
impl RefUnwindSafe for ResourceRegistry
impl Send for ResourceRegistry
impl Sync for ResourceRegistry
impl Unpin for ResourceRegistry
impl UnwindSafe for ResourceRegistry
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> 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::RequestSource§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Track for T
impl<T> Track for T
§fn track_resources(self, token: ResourceGroupToken) -> Tracked<Self>
fn track_resources(self, token: ResourceGroupToken) -> Tracked<Self>
Tracked wrapper. Read more§fn in_current_resource_group(self) -> Tracked<Self>
fn in_current_resource_group(self) -> Tracked<Self>
Tracked wrapper. Read more