docs: def Getattr(self, path, fh=None):
      """Performs a stat on a file or directory.
  
      Args:
        path: The path to stat.
        fh: A file handler. Not used.
  
      Returns:
        A dictionary mapping st_ names to their values.
  
      Raises:
        FuseOSError: When a path is supplied that grr doesn't know about, ie an
        invalid file path.
        ValueError: If an empty path is passed. (The empty string, when passed to
        self.root.Add, returns a path for aff4:/, the root directory, which is not
        the behaviour we want.)
      """
      del fh
  
      if not path:
        raise fuse.FuseOSError(errno.ENOENT)
  
      if path != self.root:
        full_path = self.root.Add(path)
      else:
        full_path = path
  
      fd = aff4.FACTORY.Open(full_path, token=self.token)
  
      # The root aff4 path technically doesn't exist in the data store, so
      # it is a special case.
      if full_path == "/":
        return self.MakePartialStat(fd)
  
      fd = aff4.FACTORY.Open(full_path, token=self.token)
      # Grab the stat according to aff4.
      aff4_stat = fd.Get(fd.Schema.STAT)
  
      # If the Schema for the object has a STAT attribute, go ahead and return
      # it as a dictionary.
      if aff4_stat:
        return aff4_stat.AsDict()
  
      # If the object didn't have a stored stat, we figure out if it is a special
      # grr object, or just doesn't exist.
  
      # We now check if the aff4 object actually has a row in the data store.
      # This prevents us from being able to cd to directories that don't exist,
      # since such directories have a newly-created empty AFF4Object,
      # but no row in the data store. Anything that is a
      # row in the data store will have a LAST attribute, so we check that.
      elif fd.Get(fd.Schema.LAST) is None:
        # We raise the "no such file or directory" error.
        raise fuse.FuseOSError(errno.ENOENT)
      else:
        # This is an object that exists in the datastore, but has no STAT, so we
        # don't know how to handle it.
        pass
  
      # If the object was in the data store, but didn't have a stat, we just
      # try and guess some sensible values.
      return self.MakePartialStat(fd)