Skip to main content

SharedWatcher

Struct SharedWatcher 

Source
pub(super) struct SharedWatcher {
    inotify: Arc<Inotify>,
    watches: Arc<Mutex<Watches>>,
    failed: Arc<AtomicBool>,
    given_up: AtomicBool,
    reader: JoinHandle<()>,
    next_id: AtomicU64,
}
Expand description

A single inotify instance shared by all OOM watchers.

Creating an inotify instance per container does not scale with the number of containers in a pod. All memory event files are watched through this instance instead, a task reads its events and dispatches them to the subscribers of their path. Adding and removing a watch does not block, the subscribers do that right away.

Fields§

§inotify: Arc<Inotify>§watches: Arc<Mutex<Watches>>

The subscribers and the watches. The reader of the events takes this lock as well, it never waits while holding it.

§failed: Arc<AtomicBool>

Set once the reader of the events stopped, the next subscription gets a new watcher then.

§given_up: AtomicBool

Set once a subscriber gave up watching after the reader stopped, see Subscription::give_up.

§reader: JoinHandle<()>

The task which reads the events, it ends with the watcher.

§next_id: AtomicU64

Source of unique subscription identifiers.

Implementations§

Source§

impl SharedWatcher

Source

pub(super) fn get() -> Result<Arc<Self>>

Retrieve the shared watcher, creating it if necessary.

Source

fn get_in(slot: &Mutex<Weak<SharedWatcher>>) -> Result<Arc<Self>>

Retrieve the watcher kept in the slot, or create one there.

Source

fn slot(_: &Handle) -> &'static Mutex<Weak<SharedWatcher>>

Source

fn new() -> Result<Self>

Source

async fn read_events( registered: AsyncFd<Fd<Arc<Inotify>>>, watches: Arc<Mutex<Watches>>, failed: Arc<AtomicBool>, )

Read the events of the kernel and dispatch them, until the watcher got dropped or reading failed.

After a dispatch, the events which come meanwhile get dispatched together once MIN_DISPATCH_INTERVAL passed. The instance gets deregistered until then: tokio registers it edge triggered, and every new event would wake the runtime while it stays registered, even if nothing reads it.

Source

fn read_queued(inotify: &Inotify) -> Result<Vec<InotifyEvent>>

Read all queued events, which a single read takes up to 4 KiB of. Fails with WouldBlock only if there is none.

Source

fn stopped(watches: &Mutex<Watches>, failed: &AtomicBool)

The reader stopped. The next subscription gets a new watcher. The watches get dropped with their senders, so that the channels of the subscribers end once they took the events so far, they watch again then.

Source

pub(super) fn subscribe( self: &Arc<Self>, path: &Path, tx: Sender<WatchEvent>, ) -> Result<Subscription>

Start watching path on behalf of tx. The watch gets removed when the returned subscription is dropped and no other subscriber of the watch is left.

Source

fn unsubscribe(&self, id: u64, wd: WatchDescriptor)

Trait Implementations§

Source§

impl Drop for SharedWatcher

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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
§

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.

§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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