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
RootDir
s 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:
- fuchsia.io.Directory connections to the package’s root directory or any sub directory.
- fuchsia.io.File connections to the package’s files under meta/.
- 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>
impl<S: NonMetaStorage + Clone> RootDirCache<S>
Sourcepub fn new(non_meta_storage: S) -> Self
pub fn new(non_meta_storage: S) -> Self
Creates a RootDirCache
that uses non_meta_storage
as the backing for the
internally managed crate::RootDir
s.
Sourcepub async fn get_or_insert(
&self,
hash: Hash,
root_dir: Option<RootDir<S>>,
) -> Result<Arc<RootDir<S>>, Error>
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.
Sourcepub fn get(&self, hash: &Hash) -> Option<Arc<RootDir<S>>>
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
).
Trait Implementations§
Source§impl<S: Clone> Clone for RootDirCache<S>
impl<S: Clone> Clone for RootDirCache<S>
Source§fn clone(&self) -> RootDirCache<S>
fn clone(&self) -> RootDirCache<S>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto 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>
impl<S> Sync for RootDirCache<S>
impl<S> Unpin for RootDirCache<S>where
S: Unpin,
impl<S> UnwindSafe for RootDirCache<S>where
S: UnwindSafe,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)