Proc

Struct Proc 

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

A proc instance is the runtime managing a single proc in Hyperactor. It is responsible for spawning actors in the proc, multiplexing messages to/within actors in the proc, and providing fallback routing to external procs.

Procs are also responsible for maintaining the local supervision hierarchy.

Implementations§

Source§

impl Proc

Source

pub fn configured(proc_id: ProcId, forwarder: BoxedMailboxSender) -> Self

Create a pre-configured proc with the given proc id and forwarder.

Source

pub fn direct(addr: ChannelAddr, name: String) -> Result<Self, ChannelError>

Create a new direct-addressed proc.

Source

pub fn set_supervision_coordinator( &self, port: PortHandle<ActorSupervisionEvent>, ) -> Result<(), Error>

Set the supervision coordinator’s port for this proc. Return Err if it is already set.

Source

pub fn handle_unhandled_supervision_event( &self, cx: &impl Actor, event: ActorSupervisionEvent, )

Handle a supervision event received by the proc. Attempt to forward it to the supervision coordinator port if one is set, otherwise crash the process.

Source

pub fn local() -> Self

Create a new local-only proc. This proc is not allowed to forward messages outside of the proc itself.

Source

pub fn proc_id(&self) -> &ProcId

The proc’s ID.

Source

pub fn forwarder(&self) -> &BoxedMailboxSender

Shared sender used by the proc to forward messages to remote destinations.

Source

pub fn attach(&self, name: &str) -> Result<Mailbox, Error>

Attach a mailbox to the proc with the provided root name.

Source

pub fn attach_child(&self, parent_id: &ActorId) -> Result<Mailbox, Error>

Attach a mailbox to the proc as a child actor.

Source

pub fn attach_actor<R, M>( &self, name: &str, ) -> Result<(Instance<()>, ActorRef<R>, PortReceiver<M>), Error>

Attach a mailbox to the proc with the provided root name, and bind an [ActorRef]. This is intended only for testing, and will be replaced by simpled utilities.

Source

pub fn spawn<A: Actor>( &self, name: &str, actor: A, ) -> Result<ActorHandle<A>, Error>

Spawn a named (root) actor on this proc. The name of the actor must be unique.

Source

pub fn instance( &self, name: &str, ) -> Result<(Instance<()>, ActorHandle<()>), Error>

Create a lightweight client instance (no actor loop, no introspect task). This is safe to call outside a Tokio runtime — unlike [actor_instance], it never calls tokio::spawn.

Source

pub fn introspectable_instance( &self, name: &str, ) -> Result<(Instance<()>, ActorHandle<()>), Error>

Create a lightweight client instance that handles IntrospectMessage.

Like instance, this creates a client-mode instance with no actor message loop. Unlike instance, it spawns a dedicated introspect task, so the instance responds to IntrospectMessage::Query and is visible and navigable in admin tooling such as the mesh TUI.

See CI-1, CI-2 in module doc.

Requires an active Tokio runtime (calls tokio::spawn).

Source

pub fn actor_instance<A: Actor>( &self, name: &str, ) -> Result<ActorInstance<A>, Error>

Create and return an actor instance, its handle, and its receivers. This allows actors to be “inverted”: the caller can use the returned Instance to send and receive messages, launch child actors, etc. The actor itself does not handle any messages unless driven by the caller.

Source

pub fn traverse<F>(&self, f: &mut F)
where F: FnMut(&InstanceCell, usize),

Traverse all actor trees in this proc, starting from root actors (pid=0).

Caution: This holds DashMap shard read locks while doing Weak::upgrade() and recursively walking the actor tree per entry. Under rapid actor churn, this causes convoy starvation with concurrent insert/remove operations. Prefer all_instance_keys() with point lookups if you only need actor IDs. Currently unused in production code.

Source

pub fn get_instance(&self, actor_id: &ActorId) -> Option<InstanceCell>

Look up an instance by ActorId.

Source

pub fn root_actor_ids(&self) -> Vec<ActorId>

Returns the ActorIds of all root actors (pid=0) in this proc.

Caution: This iterates the full DashMap under shard read locks. The per-entry work is lightweight (key filter + clone), but under very rapid churn the iteration can still contend with concurrent writes. Prefer all_instance_keys() with a post-filter if this becomes a hot path. Currently unused in production code.

Source

pub fn all_actor_ids(&self) -> Vec<ActorId>

Returns the ActorIds of all live actors in this proc, including dynamically spawned children.

An actor is considered live if its weak reference is upgradeable and its status is not terminal. This excludes actors whose InstanceCell has been dropped and actors that have stopped or failed but whose Arc is still held (e.g. by the introspect task during teardown).

Source

pub fn all_instance_keys(&self) -> Vec<ActorId>

Snapshot all instance keys from the DashMap without inspecting values. Each shard read lock is held only long enough to clone the key — no Weak::upgrade(), no watch::borrow(), no is_terminal() check. This minimises shard lock hold time to avoid convoy starvation with concurrent insert/remove operations during rapid actor churn.

The returned list may include actors that are terminal or whose WeakInstanceCell no longer upgrades. Callers should tolerate stale entries (e.g. by handling “not found” on subsequent per-actor lookups).

Source

pub fn terminated_snapshot( &self, actor_id: &ActorId, ) -> Option<IntrospectResult>

Look up a terminated actor’s snapshot by ID.

Source

pub fn all_terminated_actor_ids(&self) -> Vec<ActorId>

Return all terminated actor IDs currently retained.

Source

pub fn abort_root_actor( &self, root: &ActorId, this_handle: Option<&JoinHandle<()>>, ) -> Option<impl Future<Output = ActorId>>

Call abort on the JoinHandle associated with the given root actor. If successful return Some(root.clone()) else None.

Source

pub fn stop_actor( &self, actor_id: &ActorId, reason: String, ) -> Option<Receiver<ActorStatus>>

Signals to a root actor to stop, returning a status observer if successful.

Source

pub async fn destroy_and_wait<A: Actor>( &mut self, timeout: Duration, cx: Option<&Context<'_, A>>, reason: &str, ) -> Result<(Vec<ActorId>, Vec<ActorId>), Error>

Stop the proc. Returns a pair of:

  • the actors observed to stop;
  • the actors not observed to stop when timeout.

If cx is specified, it means this method was called from inside an actor in which case we shouldn’t wait for it to stop and need to delay aborting its task.

Source

pub async fn destroy_and_wait_except_current<A: Actor>( &mut self, timeout: Duration, cx: Option<&Context<'_, A>>, except_current: bool, reason: &str, ) -> Result<(Vec<ActorId>, Vec<ActorId>), Error>

Stop the proc. Returns a pair of:

  • the actors observed to stop;
  • the actors not observed to stop when timeout.

If cx is specified, it means this method was called from inside an actor in which case we shouldn’t wait for it to stop and need to delay aborting its task. If except_current is true, don’t stop the actor represented by “cx” at all.

Source

pub fn resolve_actor_ref<R: Actor + Referable>( &self, actor_ref: &ActorRef<R>, ) -> Option<ActorHandle<R>>

Resolve an actor reference to a live actor on this proc.

Returns None if:

  • the actor was never spawned here,
  • the actor’s InstanceCell has been dropped, or
  • the actor’s status is terminal (stopped or failed).

The terminal-status check guards a race window: the introspect task (serve_introspect) holds a strong InstanceCell Arc and drops it only after observing terminal status. Between the actor reaching terminal and the introspect task reacting, upgrade() on the weak ref succeeds even though the actor is dead. The is_terminal() check closes that window. Once the introspect task exits, the Arc is dropped and upgrade() returns None on its own.

Bounds:

  • R: Actor — must be a real actor that can live in this proc.
  • R: Referable — required because the input is an ActorRef<R>.
Source

pub fn downgrade(&self) -> WeakProc

Downgrade to a weak reference that doesn’t prevent the proc from being dropped.

Trait Implementations§

Source§

impl Clone for Proc

Source§

fn clone(&self) -> Proc

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 Debug for Proc

Source§

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

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

impl MailboxSender for Proc

Source§

fn post_unchecked( &self, envelope: MessageEnvelope, return_handle: PortHandle<Undeliverable<MessageEnvelope>>, )

Raw transport: no policy.
Source§

fn post( &self, envelope: MessageEnvelope, return_handle: PortHandle<Undeliverable<MessageEnvelope>>, )

Apply hop semantics (TTL decrement; undeliverable on 0), then delegate to transport.

Auto Trait Implementations§

§

impl Freeze for Proc

§

impl !RefUnwindSafe for Proc

§

impl Send for Proc

§

impl Sync for Proc

§

impl Unpin for Proc

§

impl !UnwindSafe for Proc

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> BoxableMailboxSender for T
where T: MailboxSender + Clone + 'static,

Source§

fn boxed(&self) -> BoxedMailboxSender

A boxed clone of this MailboxSender.
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.

§

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

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> IntoBoxedMailboxSender for T
where T: MailboxSender + 'static,

Source§

fn into_boxed(self) -> BoxedMailboxSender

Rehome this MailboxSender into a BoxedMailboxSender.
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].
Source§

impl<T> MailboxServer for T
where T: MailboxSender + Clone + Sync + Send + 'static,

Source§

fn serve( self, rx: impl Rx<MessageEnvelope> + Send + 'static, ) -> MailboxServerHandle

Serve the provided port on the given channel on this sender on a background task which may be joined with the returned handle. The task fails on any send error.
§

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

impl<T> PortSender for T
where T: MailboxSender + ?Sized,

Source§

fn serialize_and_send<M: RemoteMessage>( &self, port: &PortRef<M>, message: M, return_handle: PortHandle<Undeliverable<MessageEnvelope>>, ) -> Result<(), MailboxSenderError>

Deliver a message to the provided port.
Source§

fn serialize_and_send_once<M: RemoteMessage>( &self, once_port: OncePortRef<M>, message: M, return_handle: PortHandle<Undeliverable<MessageEnvelope>>, ) -> Result<(), MailboxSenderError>

Deliver a message to a one-shot port, consuming the provided port, which is not reusable.
§

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> 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 = 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,