Gestion du cache de noms

La structure NAME_CACHE met en cache les chaînes de nom des opérations récentes effectuées sur le serveur afin que le client puisse supprimer les demandes redondantes. Par exemple, si une demande ouverte a récemment échoué avec un message « fichier introuvable » et que l’application cliente tente à nouveau la demande d’ouverture avec une chaîne en majuscules, et que le mini-redirecteur réseau ne prend pas en charge les noms respectant la casse, RDBSS peut échouer immédiatement la demande sans toucher le serveur.

En général, l’algorithme consiste à placer une fenêtre de temps et une limite de nombre d’opérations sur l’entrée NAME_CACHE. La fenêtre de temps est généralement de deux secondes. Par conséquent, si l’entrée NAME_CACHE est supérieure à deux secondes, la correspondance échoue et la demande est envoyée au serveur. Si la demande échoue à nouveau sur le serveur, l’entrée NAME_CACHE est mise à jour avec une autre fenêtre de deux secondes. Si le nombre d’opérations de requête ne correspond pas, une ou plusieurs demandes ont été envoyées au serveur, ce qui peut rendre cette entrée NAME_CACHE non valide. Donc, là encore, cette opération sera envoyée au serveur.

Une structure de NAME_CACHE a une partie publique exposée au mini-redirecteur réseau, MRX_NAME_CACHE et une section privée à utiliser uniquement par RDBSS. La partie mini-redirecteur a un champ de contexte, NTSTATUS, pour le résultat d’une opération serveur antérieure sur cette entrée de nom et un pointeur d’extension de contexte pour un stockage spécifique au mini-redirecteur supplémentaire qui peut être alloué avec la structure NAME_CACHE. Pour plus d’informations, consultez RxNameCacheInitialize.

Pour la mise en réseau Windows, le nombre d’opérations SMB est un exemple d’état spécifique au mini redirecteur, qui peut être enregistré dans le champ de contexte de MRX_NAME_CACHE. Lorsque RxNameCacheCheckEntry est appelé, il effectue une case activée d’égalité entre le champ de contexte et un paramètre fourni dans le cadre de la recherche d’une correspondance dans le cache de noms. Lorsqu’une entrée de NAME_CACHE est créée ou mise à jour, le travail du mini-redirecteur réseau est de fournir une valeur appropriée pour ce champ et la durée de vie, en secondes, pour l’entrée NAME_CACHE.

La partie RDBSS privée de la structure NAME_CACHE contient le nom sous forme de chaîne Unicode, une valeur de hachage du nom pour accélérer les recherches, une heure d’expiration de l’entrée et un indicateur qui indique si le serveur prend en charge les noms respectant la casse.

La structure NAME_CACHE_CONTROL gère un cache de noms donné. Il dispose d’une liste gratuite, d’une liste active et d’un verrou pour synchroniser les mises à jour. La structure NAME_CACHE_CONTROL a également des champs pour stocker le nombre actuel d’entrées NAME_CACHE allouées, une valeur pour le nombre maximal d’entrées à allouer, la taille de tout stockage réseau-mini-redirecteur supplémentaire utilisé pour chaque entrée NAME_CACHE, et des valeurs pour les statistiques (le nombre de fois où le cache a été mis à jour, vérifié, une correspondance valide a été retournée, et lorsque le mini-redirecteur réseau a enregistré une opération réseau). Le champ MaximumEntries limite le nombre d’entrées NAME_CACHE créées dans le cas où un programme mal conçu génère un grand nombre de requêtes ouvertes avec des noms de fichiers incorrects qui consomment de grandes quantités de mémoire.

Il existe actuellement des caches de noms gérés par RDBSS pour OBJECT_NAME_NOT_FOUND. Pour ce cache de noms, une fenêtre de deux secondes est conservée, qui est invalidée si une opération est envoyée au serveur. Cela peut se produire lorsque l’application cliente dispose d’un fichier (exemple1) ouvert qu’une application sur le serveur peut utiliser pour signaler la création d’un autre fichier (exemple2) sur le serveur. Lorsque le client lit le premier fichier (sample1) et apprend que le deuxième fichier (sample2) a été créé sur le serveur, un accès dans le cache de noms correspondant au deuxième fichier (sample2) ne peut pas renvoyer une erreur. Cette optimisation gère uniquement le cas d’opérations d’ouverture de fichier successives sur le même fichier qui n’existe pas encore. Ce scénario se produit à l’aide de Microsoft Word.

Les routines de gestion du cache de noms RDBSS incluent les éléments suivants :

Routine Description

RxNameCacheActivateEntry

Cette routine prend une entrée de cache de noms et met à jour l’heure d’expiration et le contexte du mini-redirecteur réseau. Il place ensuite l’entrée dans la liste active.

RxNameCacheCheckEntry

Cette routine vérifie la validité d’une entrée NAME_CACHE.

RxNameCacheCreateEntry

Cette routine alloue et initialise une structure NAME_CACHE avec la chaîne de nom donnée. On s’attend à ce que l’appelant initialise ensuite tous les éléments de mini-redirecteur réseau supplémentaires du contexte de cache de noms, puis place l’entrée sur la liste active du cache de noms.

RxNameCacheExpireEntry

Cette routine place une entrée NAME_CACHE dans la liste gratuite.

RxNameCacheExpireEntryWithShortName

Cette routine expire toutes les entrées NAME_CACHE dont le préfixe de nom correspond au nom de fichier court donné.

RxNameCacheFetchEntry

Cette routine recherche une correspondance avec une chaîne de nom spécifiée pour une entrée NAME_CACHE.

RxNameCacheFinalize

Cette routine libère le stockage de toutes les entrées NAME_CACHE associées à une structure NAME_CACHE_CONTROL.

RxNameCacheFreeEntry

Cette routine libère le stockage d’une entrée NAME_CACHE et décrémente le nombre d’entrées de cache NAME_CACHE associées à une structure NAME_CACHE_CONTROL.

RxNameCacheInitialize

Cette routine initialise un cache de noms (structure NAME_CACHE_CONTROL).