pub struct RootDirCache<S> { /* private fields */ }
Expand description

RootDirCache is a cache of Arc<RootDir>s indexed by their hash. The cache internally stores Weak<RootDir>s and installs a custom dropper in its managed RootDirs that removes the corresponding entry when dropped, so it is a cache of Arc<RootDir>s that are actively in use by its clients. This is useful for deduplicating the Arc<RootDir>s used by VFS to serve package directory connections while also keeping track of which connections are open.

Because of how RootDir`` is implemented, a package will have alive Arc`s if there are:

  1. fuchsia.io.Directory connections to the package’s root directory or any sub directory.
  2. fuchsia.io.File connections to the package’s files under meta/.
  3. fuchsia.io.File connections to the package’s content blobs (files not under meta/) iff the crate::NonMetaStorage impl serves the connections itself (instead of forwarding to a remote server).

The NonMetaStorage impl we use for Fxblob does serve the File connections itself. The impl we use for Blobfs does not, but Blobfs will wait to delete blobs that have open connections until the last connection closes. Similarly, both Blobfs and Fxblob will wait to delete blobs until the last VMO is closed (VMOs obtained from fuchsia.io.File.GetBackingMemory will not keep a package alive), so it is safe to delete packages that RootDirCache says are not open.

Clients close connections to packages by closing their end of the Zircon channel over which the fuchsia.io.[File|Directory] messages were being sent. Some time after the client end of the channel is closed, the server (usually in a different process) will be notified by the kernel, and the task serving the connection will finish, dropping its Arc<RootDir>. When the last Arc is dropped, the strong count of the corresponding std::sync::Weak in the RootDirCache will decrement to zero. At this point the RootDirCache will no longer report the package as open. All this is to say that there will be some delay between a package no longer being in use and clients of RootDirCache finding out about that.

Implementations§

source§

impl<S: NonMetaStorage + Clone> RootDirCache<S>

source

pub fn new(non_meta_storage: S) -> Self

Creates a RootDirCache that uses non_meta_storage as the backing for the internally managed crate::RootDirs.

source

pub async fn get_or_insert( &self, hash: Hash, root_dir: Option<RootDir<S>> ) -> Result<Arc<RootDir<S>>, Error>

Returns an Arc<RootDir> corresponding to hash. If there is not already one in the cache, root_dir will be used if provided, otherwise a new one will be created using the non_meta_storage provided to Self::new.

If provided, root_dir must be backed by the same NonMetaStorage that Self::new was called with. The provided root_dir must not have a dropper set.

source

pub fn get(&self, hash: &Hash) -> Option<Arc<RootDir<S>>>

Returns the Arc<RootDir> with the given hash, if one exists in the cache. Otherwise returns None. Holding on to the returned Arc will keep the package open (as reported by Self::list).

source

pub fn list(&self) -> Vec<Arc<RootDir<S>>>

Packages with live Arc<RootDir>s. Holding on to the returned Arcs will keep the packages open.

source

pub fn record_lazy_inspect( &self ) -> impl Fn() -> BoxFuture<'static, Result<Inspector, Error>> + Send + Sync + 'static

Returns a callback to be given to fuchsia_inspect::Node::record_lazy_child. Records the package hashes and their corresponding Arc<RootDir> strong counts.

Trait Implementations§

source§

impl<S: Clone> Clone for RootDirCache<S>

source§

fn clone(&self) -> RootDirCache<S>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<S: Debug> Debug for RootDirCache<S>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<S> Freeze for RootDirCache<S>
where S: Freeze,

§

impl<S> RefUnwindSafe for RootDirCache<S>
where S: RefUnwindSafe,

§

impl<S> Send for RootDirCache<S>
where S: Send + Sync,

§

impl<S> Sync for RootDirCache<S>
where S: Sync + Send,

§

impl<S> Unpin for RootDirCache<S>
where S: Unpin,

§

impl<S> UnwindSafe for RootDirCache<S>
where S: UnwindSafe,

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> Encode<Ambiguous1> for T

source§

unsafe fn encode( self, _encoder: &mut Encoder<'_>, _offset: usize, _depth: Depth ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
source§

impl<T> Encode<Ambiguous2> for T

source§

unsafe fn encode( self, _encoder: &mut Encoder<'_>, _offset: usize, _depth: Depth ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

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> IntoAny for T
where T: 'static + Send + Sync,

§

fn into_any(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Cast the given object into a dyn std::any::Any.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where T: Clone,

§

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

§

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

§

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

impl<St> WithTag for St

source§

fn tagged<T>(self, tag: T) -> Tagged<T, St>

Produce a new stream from this one which yields item tupled with a constant tag
source§

impl<T> OnRootDirDrop for T
where T: Send + Sync + Debug,