pub struct GearManager { /* private fields */ }Expand description
Central registry that tracks all running gear instances in the system. Provides discovery, health tracking, and round-robin load balancing.
Always shared as an Arc<GearManager> and NOT Clone: a by-value clone
would deep-copy the DashMap directories while sharing the guards, so the
registration lock would no longer serialize the map it guards.
Implementations§
Source§impl GearManager
impl GearManager
pub fn new() -> Self
pub fn with_heartbeat_policy(self, ttl: Duration, grace: Duration) -> Self
Sourcepub fn set_grpc_service_owners(&self, owners: HashMap<String, String>)
pub fn set_grpc_service_owners(&self, owners: HashMap<String, String>)
Install the authoritative gRPC-service-name -> owning-gear map.
A listed name may be advertised only by its owner (enforced in
register_instance), closing the hole where a
gear could squat another’s service name by registering first; unlisted
names keep first-registration ownership. Seeded from operator config, then
layered with the compiled-in owners via
merge_authoritative_grpc_service_owners —
both at startup, before any gear self-registers.
Taken under reg_lock so it can’t interleave with an in-flight
register_instance check + commit.
Merge a compiled-in service_name -> gear map into the ownership map,
overriding any conflicting operator-configured entry.
The compiled binary is ground truth — a gear physically provides the service — so config must not reassign that name elsewhere (that would re-open the squat); a disagreeing entry is overridden and warned. Names absent here (e.g. remote / out-of-process gears) keep their configured owner.
Runs once in the runtime’s gRPC phase before self-registration, under
reg_lock like set_grpc_service_owners.
Sourcepub fn register_instance(
&self,
instance: Arc<GearInstance>,
) -> Result<(), GrpcServiceNameConflict>
pub fn register_instance( &self, instance: Arc<GearInstance>, ) -> Result<(), GrpcServiceNameConflict>
Register or update a gear instance, enforcing single-gear ownership of every gRPC service name it advertises — atomically.
The ownership check (check_grpc_service_ownership)
and the insert run under one registration lock, so two gears cannot both
pass an “unowned” check and then both commit the same name — a
check-then-write race the per-entry DashMap locks do not prevent. On a
conflict the store is left untouched.
Re-registering an existing instance_id is an idempotent endpoint /
metadata refresh, NOT a liveness reset: the existing runtime state
(last_heartbeat + InstanceState) is carried over onto the new
record by preserving the same Arc<RwLock<InstanceRuntimeState>>.
Without this, a periodic self-heal re-registration (see
oop_registration::presence_loop) would knock a Healthy instance back
to Registered, dropping it out of gRPC round-robin until the next
heartbeat. It would also race with concurrent update_heartbeat calls.
§Errors
Returns GrpcServiceNameConflict if an advertised gRPC service name is
owned by, or currently advertised by, another gear.
Sourcepub fn mark_ready(&self, gear: &str, instance_id: Uuid)
pub fn mark_ready(&self, gear: &str, instance_id: Uuid)
Mark an instance as ready
Sourcepub fn update_heartbeat(&self, gear: &str, instance_id: Uuid, at: Instant)
pub fn update_heartbeat(&self, gear: &str, instance_id: Uuid, at: Instant)
Update the heartbeat timestamp for an instance
Sourcepub fn mark_quarantined(&self, gear: &str, instance_id: Uuid)
pub fn mark_quarantined(&self, gear: &str, instance_id: Uuid)
Mark an instance as quarantined
Sourcepub fn mark_draining(&self, gear: &str, instance_id: Uuid)
pub fn mark_draining(&self, gear: &str, instance_id: Uuid)
Mark an instance as draining (graceful shutdown in progress)
Sourcepub fn deregister(&self, gear: &str, instance_id: Uuid)
pub fn deregister(&self, gear: &str, instance_id: Uuid)
Remove an instance from the directory
Sourcepub fn instances_of(&self, gear: &str) -> Vec<Arc<GearInstance>>
pub fn instances_of(&self, gear: &str) -> Vec<Arc<GearInstance>>
Get all instances of a specific gear
Sourcepub fn all_instances(&self) -> Vec<Arc<GearInstance>>
pub fn all_instances(&self) -> Vec<Arc<GearInstance>>
Get all instances across all gears
Sourcepub fn evict_stale(&self, now: Instant)
pub fn evict_stale(&self, now: Instant)
Quarantine or evict stale instances based on heartbeat policy
Sourcepub fn pick_instance_round_robin(&self, gear: &str) -> Option<Arc<GearInstance>>
pub fn pick_instance_round_robin(&self, gear: &str) -> Option<Arc<GearInstance>>
Pick an instance using round-robin selection, preferring healthy instances
Sourcepub fn pick_service_round_robin(
&self,
service_name: &str,
) -> Option<(String, Arc<GearInstance>, Endpoint)>
pub fn pick_service_round_robin( &self, service_name: &str, ) -> Option<(String, Arc<GearInstance>, Endpoint)>
Pick a service endpoint using round-robin, returning (gear, instance, endpoint). Prefers healthy/ready instances and automatically rotates among them.
Sourcepub fn pick_rest_endpoint_round_robin(&self, gear: &str) -> Option<Endpoint>
pub fn pick_rest_endpoint_round_robin(&self, gear: &str) -> Option<Endpoint>
Resolve a REST endpoint for a gear using round-robin over instances that expose one, preferring healthy/ready instances.
Sourcepub fn openapi_spec_of(&self, gear: &str) -> Option<String>
pub fn openapi_spec_of(&self, gear: &str) -> Option<String>
Retrieve the OpenAPI spec of a gear, taken from the first registered
instance that published one.
Trait Implementations§
Source§impl Debug for GearManager
impl Debug for GearManager
Auto Trait Implementations§
impl !Freeze for GearManager
impl !RefUnwindSafe for GearManager
impl !UnwindSafe for GearManager
impl Send for GearManager
impl Sync for GearManager
impl Unpin for GearManager
impl UnsafeUnpin for GearManager
Blanket Implementations§
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
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> ServiceExt for T
impl<T> ServiceExt for T
Source§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
Source§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
Source§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
Source§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
Source§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
Source§fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
Source§fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
x-request-id as the header name. Read moreSource§fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
Source§fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
x-request-id as the header name. Read moreSource§fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
500 Internal Server responses. Read moreSource§fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
413 Payload Too Large responses. Read moreSource§impl<T> WithSecurityContext for T
impl<T> WithSecurityContext for T
Source§fn security_ctx<'a>(&'a self, ctx: &'a SecurityContext) -> Secured<'a, T>where
T: Sized,
fn security_ctx<'a>(&'a self, ctx: &'a SecurityContext) -> Secured<'a, T>where
T: Sized,
Secured wrapper. Read more