Skip to main content

DiscoveryLimiter

Struct DiscoveryLimiter 

Source
struct DiscoveryLimiter {
    restart_imminent_lock: Arc<RwLock<bool>>,
    restart_imminent_cached: OnceCell<()>,
}
Expand description

Encapsulates the handling of running just one discovery process per server

Fields§

§restart_imminent_lock: Arc<RwLock<bool>>

Lock that makes sure only one discovery task is running at the same time.

The protected value is true when restart due to a changed constellation is imminent.

§restart_imminent_cached: OnceCell<()>

Set when contents of restart_imminent_lock lock was observed to be true, reducing the load on this lock.

Implementations§

Source§

impl DiscoveryLimiter

Source

fn new() -> Self

Source

async fn request_discovery<S: Server>( &self, app: Rc<S::AppT>, ) -> Result<DiscoveryRunResp>

This functions contains the discovery logic that’s shared between servers.

Discovery can be invoked for two reasons:

  1. This server has just been restarted and is not aware of the current constellation. Perhaps part of our configuration has changed that makes the current constellation obsolete.

  2. The .ph/discovery/run endpoint was triggered. This should happen when another server detects that our constellation is out-of-date, but since the .ph/discovery/run endpoint is unprotected, anyone can invoke it at any time.

    The non-PHC servers check during their discovery whether the constellation PHC advertises is up-to-date with respect to their own configuration. If it isn’t, the non-PHC server triggers PHC to run discovery.

    PHC checks during its discovery (after it obtained recent details from each of the other servers) whether the constellations of the other servers are up-to-date, and will trigger their discovery routine when these aren’t.

Thus the procedure for discovery is as follows.

Non-PHC:

  1. Obtain constellation from PHC. Return if it coincides with the constellation that we already got - if we already got one.
  2. Check the constellation against our own configuration. If it’s up-to-date, restart this server but with the new constellation.
  3. Invoke discovery on PHC, and return a retryable error - effectively go back to step 1.

PHC:

  1. Obtain discovery info from ourselves - i.e. check whether phc_url is configured correctly.
  2. Retrieve discovery info from the other servers and construct a constellation from it.
  3. If the constellation has changed, restart to update it.
  4. Invoke discovery on those servers that have no or outdated constellations, and return a retryable error - effectively go back to step 1.
Source

async fn obtain_lock(&self) -> Option<RwLockWriteGuard<'_, bool>>

Obtains write lock to self.restart_imminent_lock when restart is not imminent.

Trait Implementations§

Source§

impl Clone for DiscoveryLimiter

Source§

fn clone(&self) -> Self

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

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

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

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

impl<T> PolicyExt for T
where T: ?Sized,

Source§

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

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> Same for T

Source§

type Output = T

Should always be Self
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

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more