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 fromProcId
toBootstrapProcHandle
, used for lifecycle queries (status
) and exit monitoring. - [
pid_table
]: synchronous map fromProcId
to raw PIDs, used inDrop
to synchronously sendSIGKILL
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
impl BootstrapProcManager
Sourcepub fn command(&self) -> &BootstrapCommand
pub fn command(&self) -> &BootstrapCommand
The bootstrap command used to launch processes.
Sourcepub async fn status(&self, proc_id: &ProcId) -> Option<ProcStatus>
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
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,
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
impl Debug for BootstrapProcManager
Source§impl Drop for BootstrapProcManager
impl Drop for BootstrapProcManager
Source§fn drop(&mut self)
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 inDrop
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
impl ProcManager for BootstrapProcManager
Source§fn transport(&self) -> ChannelTransport
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,
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
asProcStatus::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
type Handle = BootstrapProcHandle
Auto Trait Implementations§
impl Freeze for BootstrapProcManager
impl !RefUnwindSafe for BootstrapProcManager
impl Send for BootstrapProcManager
impl Sync for BootstrapProcManager
impl Unpin for BootstrapProcManager
impl !UnwindSafe for BootstrapProcManager
Blanket Implementations§
§impl<T> AnySync for T
impl<T> AnySync for T
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
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<A, M> Handler<IndexedErasedUnbound<M>> for A
impl<A, M> Handler<IndexedErasedUnbound<M>> for A
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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