Struct BootstrapProcManager

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

A process manager for launching and supervising bootstrap processes (via the bootstrap entry point).

BootstrapProcManager is the host-side runtime for external procs in a hyperactor mesh. It spawns the configured bootstrap binary, forwards each child’s stdout/stderr into the logging channel, tracks lifecycle state through BootstrapProcHandle / ProcStatus, and ensures best-effort teardown on drop.

Internally it maintains two maps:

  • [children]: async map from ProcId to BootstrapProcHandle, used for lifecycle queries (status) and exit monitoring.
  • [pid_table]: synchronous map from ProcId to raw PIDs, used in Drop to synchronously send SIGKILL to any still-running children.

Together these provide both a queryable, real-time status surface and a deterministic cleanup path, so no child processes are left orphaned if the manager itself is dropped.

Implementations§

Source§

impl BootstrapProcManager

Source

pub fn command(&self) -> &BootstrapCommand

The bootstrap command used to launch processes.

Source

pub async fn status(&self, proc_id: &ProcId) -> Option<ProcStatus>

Return the current ProcStatus for the given ProcId, if the proc is known to this manager.

This querprocies the live BootstrapProcHandle stored in the manager’s internal map. It provides an immediate snapshot of lifecycle state (Starting, Running, Stopping, Stopped, etc.).

Returns None if the manager has no record of the proc (e.g. never spawned here, or entry already removed).

Trait Implementations§

Source§

impl BulkTerminate for BootstrapProcManager

Source§

fn terminate_all<'life0, 'async_trait>( &'life0 self, timeout: Duration, max_in_flight: usize, ) -> Pin<Box<dyn Future<Output = TerminateSummary> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Attempt to gracefully terminate all child procs managed by this BootstrapProcManager.

Each child handle is asked to terminate(timeout), which sends SIGTERM, waits up to the deadline, and escalates to SIGKILL if necessary. Termination is attempted concurrently, with at most max_in_flight tasks running at once.

Returns a TerminateSummary with counts of how many procs were attempted, how many successfully terminated (including those that were already terminal), and how many failed.

Logs a warning for each failure.

Source§

impl Debug for BootstrapProcManager

Source§

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

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

impl Drop for BootstrapProcManager

Source§

fn drop(&mut self)

Drop implementation for BootstrapProcManager.

Ensures that when the manager itself is dropped, any child processes it spawned are also terminated. This is a best-effort cleanup mechanism: the manager iterates over its recorded PID table and sends SIGKILL to each one.

Notes:

  • Uses a synchronous Mutex so it can be locked safely in Drop without async context.
  • Safety: sending SIGKILL is low-level but safe here because it only instructs the OS to terminate the process. The only risk is PID reuse, in which case an unrelated process might be signaled. This is accepted for shutdown semantics.
  • This makes BootstrapProcManager robust against leaks: dropping it should not leave stray child processes running.
Source§

impl ProcManager for BootstrapProcManager

Source§

fn transport(&self) -> ChannelTransport

Return the ChannelTransport used by this proc manager.

For BootstrapProcManager this is always ChannelTransport::Unix, since all procs are spawned locally on the same host and communicate over Unix domain sockets.

Source§

fn spawn<'life0, 'async_trait>( &'life0 self, proc_id: ProcId, backend_addr: ChannelAddr, ) -> Pin<Box<dyn Future<Output = Result<Self::Handle, HostError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Launch a new proc under this BootstrapProcManager.

Spawns the configured bootstrap binary (self.program) in a fresh child process. The environment is populated with variables that describe the bootstrap context — most importantly HYPERACTOR_MESH_BOOTSTRAP_MODE, which carries a base64-encoded JSON Bootstrap::Proc payload (proc id, backend addr, callback addr, optional config snapshot). Additional variables like BOOTSTRAP_LOG_CHANNEL are also set up for logging and control.

Responsibilities performed here:

  • Create a one-shot callback channel so the child can confirm successful bootstrap and return its mailbox address plus agent reference.
  • Spawn the OS process with stdout/stderr piped.
  • Stamp the new BootstrapProcHandle as ProcStatus::Running once a PID is observed.
  • Wire stdout/stderr pipes into local writers and forward them over the logging channel (BOOTSTRAP_LOG_CHANNEL).
  • Insert the handle into the manager’s children map and start an exit monitor to track process termination.

Returns a BootstrapProcHandle that exposes the child process’s lifecycle (status, wait/ready, termination). Errors are surfaced as HostError.

Source§

type Handle = BootstrapProcHandle

Concrete handle type this manager returns.

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

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

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