MeshAdminAgent

Struct MeshAdminAgent 

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

Actor that serves a mesh-level admin HTTP endpoint.

MeshAdminAgent is the mesh-wide aggregation point for introspection: it holds hyperactor_reference::ActorRef<HostAgent> handles for each host, and answers admin queries by forwarding targeted requests to the appropriate host agent and assembling a uniform NodePayload response for the client.

The agent also exposes an HTTP server (spawned from init) and supports reference-based navigation (GET /v1/{reference}) by resolving opaque reference strings into typed NodeProperties plus child references.

Implementations§

Source§

impl MeshAdminAgent

Source

pub fn new( hosts: Vec<(String, ActorRef<HostAgent>)>, root_client_actor_id: Option<ActorId>, admin_addr: Option<SocketAddr>, ) -> Self

Construct a MeshAdminAgent from a list of (host_addr, host_agent_ref) pairs and an optional root client ActorId.

Builds both:

  • hosts: the forward map used to route admin queries to the correct HostAgent, and
  • host_agents_by_actor_id: a reverse index used during reference resolution to recognize host-agent ActorIds and resolve them as NodeProperties::Host rather than as generic actors.

When root_client_actor_id is Some, the root client appears as a first-class child of the root node in the introspection tree.

The HTTP listen address is initialized to None and populated during init() after the server socket is bound.

Trait Implementations§

Source§

impl Actor for MeshAdminAgent

Source§

fn init<'life0, 'life1, 'async_trait>( &'life0 mut self, this: &'life1 Instance<Self>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Initializes the mesh admin agent and its HTTP server.

  1. Binds well-known message ports (proc.spawn() does not call bind() — unlike gspawn — so the actor must do it itself before becoming reachable).
  2. Binds a TCP listener (ephemeral or fixed port).
  3. Builds a TLS acceptor (explicit env vars, then Meta default paths). At Meta (fbcode_build), mTLS is mandatory and init fails if no certs are found. In OSS, falls back to plain HTTP.
  4. Creates a dedicated Instance<()> client mailbox on system_proc for the HTTP bridge’s reply ports, keeping bridge traffic off the actor’s own mailbox.
  5. Spawns the axum server in a background task (HTTPS with mTLS at Meta, HTTPS or HTTP in OSS depending on step 3).

The hostname-based listen address is stored in admin_host so it can be returned via GetAdminAddr. The scheme (https:// or http://) is included so clients know which protocol to use.

Source§

fn handle_undeliverable_message<'life0, 'life1, 'async_trait>( &'life0 mut self, _cx: &'life1 Instance<Self>, __arg2: Undeliverable<MessageEnvelope>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Swallow undeliverable message bounces instead of crashing.

The admin agent sends IntrospectMessage to actors that may not have the introspection port bound (e.g. actors spawned via cx.spawn() whose #[export] list does not include it). When the message cannot be delivered, the routing layer bounces an Undeliverable back to the sender. The default Actor::handle_undeliverable_message calls bail!(), which would kill this admin agent and — via supervision cascade — take down the entire admin process with exit(1).

Since the admin agent is best-effort infrastructure, an undeliverable introspection probe is not a fatal error.

Source§

fn cleanup<'life0, 'life1, 'life2, 'async_trait>( &'life0 mut self, _this: &'life1 Instance<Self>, _err: Option<&'life2 ActorError>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, Self: 'async_trait,

Cleanup things used by this actor before shutting down. Notably this function is async and allows more complex cleanup. Simpler cleanup can be handled by the impl Drop for this Actor. If err is not None, it is the error that this actor is failing with. Any errors returned by this function will be logged and ignored. If err is None, any errors returned by this function will be propagated as an ActorError. This function is not called if there is a panic in the actor, as the actor may be in an indeterminate state. It is also not called if the process is killed, there is no atexit handler or signal handler.
Source§

fn spawn(self, cx: &impl Actor) -> Result<ActorHandle<Self>, Error>

Spawn a child actor, given a spawning capability (usually given by Instance). The spawned actor will be supervised by the parent (spawning) actor.
Source§

fn spawn_with_name( self, cx: &impl Actor, name: &str, ) -> Result<ActorHandle<Self>, Error>

Spawn a named child actor. Same supervision semantics as spawn, but the child gets name in its ActorId.
Source§

fn spawn_detached(self) -> Result<ActorHandle<Self>, Error>

Spawns this actor in a detached state, handling its messages in a background task. The returned handle is used to control the actor’s lifecycle and to interact with it. Read more
Source§

fn spawn_server_task<F>(future: F) -> JoinHandle<<F as Future>::Output>
where F: Future + Send + 'static, <F as Future>::Output: Send + 'static,

This method is used by the runtime to spawn the actor server. It can be used by actors that require customized runtime setups (e.g., dedicated actor threads), or want to use a custom tokio runtime.
Source§

fn handle_supervision_event<'life0, 'life1, 'life2, 'async_trait>( &'life0 mut self, _this: &'life1 Instance<Self>, _event: &'life2 ActorSupervisionEvent, ) -> Pin<Box<dyn Future<Output = Result<bool, Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, Self: 'async_trait,

Handle actor supervision event. Return `Ok(true)`` if the event is handled here.
Source§

fn display_name(&self) -> Option<String>

If overridden, we will use this name in place of the ActorId for talking about this actor in supervision error messages.
Source§

impl Binds<MeshAdminAgent> for MeshAdminAgent

Source§

fn bind(ports: &Ports<Self>)

Bind ports in this actor.
Source§

impl Debug for MeshAdminAgent

Source§

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

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

impl Handler<MeshAdminMessage> for MeshAdminAgent

Manual Handler impl — swallows reply.send() failures so the admin agent stays alive when the HTTP caller disconnects.

Source§

fn handle<'life0, 'life1, 'async_trait>( &'life0 mut self, cx: &'life1 Context<'_, Self>, msg: MeshAdminMessage, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Dispatches MeshAdminMessage variants.

Reply-send failures are swallowed because a dropped receiver (e.g. the HTTP bridge timed out) is not an error — the caller simply went away. Propagating the failure would crash the admin agent and take down the entire process.

Source§

impl Handler<ResolveReferenceMessage> for MeshAdminAgent

Manual Handler impl — swallows reply.send() failures so the admin agent stays alive when the HTTP caller disconnects.

Source§

fn handle<'life0, 'life1, 'async_trait>( &'life0 mut self, cx: &'life1 Context<'_, Self>, msg: ResolveReferenceMessage, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Dispatches ResolveReferenceMessage variants.

The inner resolve_reference call never returns Err to the handler — failures are captured in the response payload. Reply-send failures are swallowed for the same reason as MeshAdminMessage: a dropped receiver means the caller (HTTP bridge) went away, which must not crash the admin agent.

Source§

impl Named for MeshAdminAgent

Source§

fn typename() -> &'static str

The globally unique type name for the type. This should typically be the fully qualified Rust name of the type.
Source§

fn typehash() -> u64

A globally unique hash for this type. TODO: actually enforce perfect hashing
Source§

fn typeid() -> TypeId

The TypeId for this type. TypeIds are unique only within a binary, and should not be used for global identification.
Source§

fn port() -> u64

The globally unique port for this type. Typed ports are in the range of 1<<63..1<<64-1.
Source§

fn arm(&self) -> Option<&'static str>

If the named type is an enum, this returns the name of the arm of the value self.
Source§

unsafe fn arm_unchecked(self_: *const ()) -> Option<&'static str>

An unsafe version of ‘arm’, accepting a pointer to the value, for use in type-erased settings.
Source§

impl Accepts<IntrospectMessage> for MeshAdminAgent

Source§

impl Accepts<MeshAdminMessage> for MeshAdminAgent

Source§

impl Accepts<ResolveReferenceMessage> for MeshAdminAgent

Source§

impl Accepts<Signal> for MeshAdminAgent

Source§

impl Referable for MeshAdminAgent

Source§

impl RemoteHandles<IntrospectMessage> for MeshAdminAgent

Source§

impl RemoteHandles<MeshAdminMessage> for MeshAdminAgent

Source§

impl RemoteHandles<ResolveReferenceMessage> for MeshAdminAgent

Source§

impl RemoteHandles<Signal> for MeshAdminAgent

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
§

impl<T> Any for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

§

fn type_name(&self) -> &'static str

§

impl<T> AnySync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

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.

§

impl<T> FutureExt for T

§

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

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

fn with_current_context(self) -> WithContext<Self>

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

impl<A, M> Handler<IndexedErasedUnbound<M>> for A
where A: Handler<M>, M: Castable,

Source§

fn handle<'life0, 'life1, 'async_trait>( &'life0 mut self, cx: &'life1 Context<'_, A>, msg: IndexedErasedUnbound<M>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, A: 'async_trait,

Handle the next M-typed message.
Source§

impl<A> Handler<Signal> for A
where A: Actor,

Source§

fn handle<'life0, 'life1, 'async_trait>( &'life0 mut self, _cx: &'life1 Context<'_, A>, _message: Signal, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, A: 'async_trait,

Handle the next M-typed message.
Source§

impl<A> Handler<Undeliverable<MessageEnvelope>> for A
where A: Actor,

Source§

fn handle<'life0, 'life1, 'async_trait>( &'life0 mut self, cx: &'life1 Context<'_, A>, message: Undeliverable<MessageEnvelope>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, A: 'async_trait,

Handle the next M-typed message.
§

impl<T> Instrument for T

§

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

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

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
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

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

impl<L> LayerExt<L> for L

§

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].
§

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
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: 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
§

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

§

fn push_quoted<'q, Q, S>(&mut self, _q: Q, s: S)
where Q: QuoteInto<T>, S: Into<Quotable<'q>>,

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

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<M> Message for M
where M: Send + Sync + 'static,