pub struct HostMesh { /* private fields */ }Expand description
An owned mesh of hosts.
§Lifecycle
HostMesh owns host lifecycles. Callers must invoke
HostMesh::shutdown for deterministic teardown.
In tests and production, prefer explicit shutdown to guarantee
that host agents drop their BootstrapProcManagers and that all
child procs are reaped. You can use shutdown_guard to get a wrapper
which will try to do a best-effort shutdown on Drop.
Implementations§
Source§impl HostMesh
impl HostMesh
Sourcepub async fn local() -> Result<HostMesh>
pub async fn local() -> Result<HostMesh>
Bring up a local single-host mesh and, in the launcher
process, return a HostMesh handle for it.
There are two execution modes:
-
bootstrap-child mode: if
Bootstrap::get_from_env()says this process was launched as a bootstrap child, we callboot.bootstrap().await, which hands control to the bootstrap logic for this process (as defined by theBootstrapCommandthe parent used to spawn it). if that call returns, we log the error and terminate. this branch does not produce aHostMesh. -
launcher mode: otherwise, we are the process that is setting up the mesh. we create a
Host, spawn aHostAgentin it, and build a single-hostHostMesharound that. thatHostMeshis returned to the caller.
This API is intended for tests, examples, and local bring-up, not production.
TODO: fix up ownership
Sourcepub async fn local_with_bootstrap(
bootstrap_cmd: BootstrapCommand,
) -> Result<HostMesh>
pub async fn local_with_bootstrap( bootstrap_cmd: BootstrapCommand, ) -> Result<HostMesh>
Same as [local], but the caller supplies the
BootstrapCommand instead of deriving it from the current
process.
The provided bootstrap_cmd is used when spawning bootstrap
children and determines the behavior of
boot.bootstrap().await in those children.
Sourcepub async fn local_in_process() -> Result<HostMesh>
pub async fn local_in_process() -> Result<HostMesh>
Create a local in-process host mesh where all procs run in the current OS process.
Unlike [local] which spawns child processes for each proc,
this method uses LocalProcManager to run everything
in-process. This makes all actors visible in the admin tree
(useful for debugging with the TUI).
This API is intended for tests, examples, and debugging.
Sourcepub async fn process(
extent: Extent,
command: BootstrapCommand,
) -> Result<HostMesh>
pub async fn process( extent: Extent, command: BootstrapCommand, ) -> Result<HostMesh>
Create a new process-based host mesh. Each host is represented by a local process,
which manages its set of procs. This is not a true host mesh the sense that each host
is not independent. The intent of process is for testing, examples, and experimentation.
The bootstrap command is used to bootstrap both hosts and processes, thus it should be
a command that reaches crate::bootstrap_or_die. process is itself a valid bootstrap
entry point; thus using BootstrapCommand::current works correctly as long as process
is called early in the lifecycle of the process and reached unconditionally.
TODO: thread through ownership
Sourcepub fn take(mesh: HostMeshRef) -> Self
pub fn take(mesh: HostMeshRef) -> Self
Take ownership of an existing host mesh reference.
Consumes the HostMeshRef, captures its region/hosts, and
returns an owned HostMesh that assumes lifecycle
responsibility for those hosts (i.e., will shut them down on
Drop).
Sourcepub async fn attach(
cx: &impl Actor,
id: HostMeshId,
addresses: Vec<ChannelAddr>,
) -> Result<Self>
pub async fn attach( cx: &impl Actor, id: HostMeshId, addresses: Vec<ChannelAddr>, ) -> Result<Self>
Attach to pre-existing workers and push client config.
This is the “simple bootstrap” attach protocol:
- Wraps the provided addresses into a
HostMeshRef. - Snapshots
propagatable_attrs()from the client’s global config. - Pushes the config to each host agent as
Source::ClientOverride, awaiting per-host installation acknowledgement. - Returns the owned
HostMesh.
HM-1 / HM-2 / HM-3 / HM-4 (see module docs): if config push
fails on any host, this returns Err. A successful return
means every attached host installed the propagatable config
snapshot.
Sourcepub async fn shutdown(&mut self, cx: &impl Actor) -> Result<()>
pub async fn shutdown(&mut self, cx: &impl Actor) -> Result<()>
Request a clean shutdown of all hosts owned by this
HostMesh.
Uses a two-phase approach:
- Terminate children on every host concurrently. Service infrastructure (host agent, comm proc, networking) stays alive so that forwarder flushes can still reach remote hosts.
- Shut down hosts concurrently. No user procs remain, so this is fast and cannot deadlock on cross-host flush timeouts.
Sourcepub fn shutdown_guard(self) -> HostMeshShutdownGuard
pub fn shutdown_guard(self) -> HostMeshShutdownGuard
Consumes and wraps this HostMesh with a HostMeshShutdownGuard, which will ensure shutdown is run on Drop.
Source§impl HostMesh
impl HostMesh
Sourcepub fn set_bootstrap(&mut self, cmd: BootstrapCommand)
pub fn set_bootstrap(&mut self, cmd: BootstrapCommand)
Set the bootstrap command on the underlying HostMeshRef,
so that future spawn calls use it. Unlike
HostMeshRef::with_bootstrap this mutates in place,
preserving ownership.
Methods from Deref<Target = HostMeshRef>§
Sourcepub async fn spawn<C: Actor>(
&self,
cx: &C,
name: &str,
per_host: Extent,
proc_bind: Option<Vec<ProcBind>>,
per_rank_bootstrap: Option<Box<PerRankBootstrapFn>>,
) -> Result<ProcMesh>
pub async fn spawn<C: Actor>( &self, cx: &C, name: &str, per_host: Extent, proc_bind: Option<Vec<ProcBind>>, per_rank_bootstrap: Option<Box<PerRankBootstrapFn>>, ) -> Result<ProcMesh>
Spawn a ProcMesh onto this host mesh. The per_host extent specifies the shape of the procs to spawn on each host.
proc_bind, when provided, is a per-process CPU/NUMA binding
configuration. Its length must equal the number of ranks in
per_host. Each entry maps binding keys (cpunodebind,
membind, physcpubind, cpus) to their values.
Only takes effect when running on Linux.
per_rank_bootstrap, when provided, is a function called once
per proc to produce that proc’s BootstrapCommand. The
function receives a view::Point over the combined
host_extent ⊕ per_host extent. Its return value takes
precedence over self.bootstrap_command for that proc only.
Currently, spawn issues direct calls to each host agent. This will be fixed by maintaining a comm actor on the host service procs themselves.
Sourcepub fn id(&self) -> &HostMeshId
pub fn id(&self) -> &HostMeshId
The identity of the referenced host mesh.
Trait Implementations§
Source§impl AsRef<HostMeshRef> for HostMesh
impl AsRef<HostMeshRef> for HostMesh
Source§fn as_ref(&self) -> &HostMeshRef
fn as_ref(&self) -> &HostMeshRef
Auto Trait Implementations§
impl Freeze for HostMesh
impl RefUnwindSafe for HostMesh
impl Send for HostMesh
impl Sync for HostMesh
impl Unpin for HostMesh
impl UnsafeUnpin for HostMesh
impl UnwindSafe for HostMesh
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].