État du cache dans la racine de virtualisation
Le fournisseur utilise le système de fichiers local sous la racine de virtualisation comme cache des éléments qu’il gère. Un élément (fichier ou répertoire) peut se trouver dans l’un des six états du système de fichiers local :
Virtuel
L’élément n’existe pas localement sur le disque. Il est projeté, c’est-à-dire synthétisé, pendant les énumérations de son répertoire parent. Les éléments virtuels sont fusionnés avec tous les éléments qui peuvent exister sur le disque pour présenter le contenu complet du répertoire parent.
Espace réservé
Pour les fichiers : le contenu du fichier (flux de données principal) n’est pas présent sur le disque. Les métadonnées du fichier (nom, taille, horodatages, attributs, etc.) sont mises en cache sur le disque.
Pour les répertoires : Certains ou tous les descendants immédiats du répertoire (les fichiers et répertoires du répertoire) ne sont pas présents sur le disque, c’est-à-dire qu’ils sont toujours virtuels. Les métadonnées du répertoire (nom, horodatages, attributs, etc.) sont mises en cache sur le disque.
Espace réservé hydraté
Pour les fichiers : le contenu et les métadonnées du fichier ont été mis en cache sur le disque. Également appelé « fichier partiel ».
Pour les répertoires : répertoire créé sur le disque en tant qu’espace réservé ne devient jamais un répertoire d’espace réservé hydraté. Cela permet au fournisseur d’ajouter ou de supprimer des éléments du répertoire dans son magasin de stockage et de refléter ces modifications dans le cache local.
Espace réservé sale (hydraté ou non)
Les métadonnées de l’élément ont été modifiées localement et ne sont plus un cache de son état dans le magasin du fournisseur. Notez que la création ou la suppression d’un fichier ou d’un répertoire sous un répertoire d’espace réservé entraîne la sale mise en place du répertoire d’espace réservé.
Fichier/répertoire complet
Pour les fichiers : le contenu du fichier (flux de données principal) a été modifié. Le fichier n’est plus un cache de son état dans le magasin du fournisseur. Les fichiers créés sur le système de fichiers local (c’est-à-dire qui n’existent pas dans le magasin du fournisseur du tout) sont également considérés comme des fichiers complets.
Pour les répertoires : les répertoires créés sur le système de fichiers local (c’est-à-dire qui n’existent pas dans le magasin du fournisseur) sont considérés comme des répertoires complets. Un répertoire créé sur le disque en tant qu’espace réservé ne devient jamais un répertoire complet.
Pierre tombale
Espace réservé masqué spécial qui représente un élément qui a été supprimé du système de fichiers local. Lorsqu’un répertoire est énuméré, ProjFS fusionne l’ensemble d’éléments locaux (espaces réservés, fichiers complets, etc.) avec l’ensemble d’éléments projetés virtuels. Si un élément apparaît à la fois dans les ensembles locaux et projetés, l’élément local est prioritaire. Si un fichier n’existe pas dans le système de fichiers local, il n’existe pas d’état local. Il apparaît donc dans l’énumération. Toutefois, si cet élément avait été supprimé, son affichage dans l’énumération serait inattendu. Le remplacement d’un élément supprimé par une pierre tombstone entraîne les effets suivants :
- Énumérations pour ne pas révéler l’élément.
- Le fichier s’ouvre et s’attend à ce que l’élément existe échoue, par exemple « fichier introuvable ».
- Le fichier crée qui s’attend à réussir uniquement si l’élément n’existe pas ; ProjFS supprime la pierre tombale dans le cadre de l’opération.
Pour illustrer les états ci-dessus, tenez compte de la séquence suivante, en fonction d’un fournisseur ProjFS qui a un seul fichier «foo.txt» situé dans la racine de virtualisation C :\root.
- Une application énumère C :\root. Il voit le fichier virtuel «foo.txt». Étant donné que le fichier n’a pas encore été accédé, le fichier n’existe pas sur le disque.
- L’application ouvre un handle pour C:\root\foo.txt. ProjFS indique au fournisseur de créer un espace réservé pour celui-ci.
- L’application lit le contenu du fichier. Le fournisseur fournit le contenu du fichier à ProjFS et il est mis en cache sur C:\root\foo.txt. Le fichier est maintenant un espace réservé hydraté.
- L’application met à jour l’horodatage Last Modified. Le fichier est maintenant un espace réservé hydraté sale.
- L’application ouvre un handle pour l’accès en écriture au fichier. C:\root\foo.txt est maintenant un fichier complet.
- L’application supprime C:\root\foo.txt. ProjFS remplace le fichier par une pierre tombstone. À présent, lorsque l’application énumère C:\root it does not see foo.txt. S’il tente d’ouvrir le fichier, l’ouverture échoue avec ERROR_FILE_NOT_FOUND.