Compartir a través de


Administración de caché de nombres

La estructura NAME_CACHE almacena en caché las cadenas de nombre de las operaciones recientes realizadas en el servidor para que el cliente pueda suprimir las solicitudes redundantes. Por ejemplo, si recientemente se ha producido un error en una solicitud abierta con un mensaje de "archivo no encontrado" y la aplicación cliente vuelve a intentar la solicitud abierta con una cadena de mayúsculas y minúsculas y el minidirector de red no admite nombres que distinguen mayúsculas de minúsculas, RDBSS puede producir un error en la solicitud inmediatamente sin alcanzar el servidor.

En general, el algoritmo consiste en poner un límite de período de tiempo y recuento de operaciones en la entrada NAME_CACHE. La ventana de tiempo suele ser de dos segundos. Por lo tanto, si la entrada de NAME_CACHE es mayor de dos segundos, se producirá un error en la coincidencia y la solicitud irá al servidor. Si se produce un error de nuevo en la solicitud en el servidor, la entrada NAME_CACHE se actualiza con otra ventana de dos segundos. Si el recuento de operaciones de solicitud no coincide, se han enviado una o varias solicitudes al servidor, lo que podría hacer que esta entrada NAME_CACHE no sea válida. Por lo tanto, esta operación se enviará al servidor.

Una estructura de NAME_CACHE tiene una parte pública expuesta al minidirector de red, MRX_NAME_CACHE y una sección privada para su uso únicamente mediante RDBSS. La parte del mini-redirector tiene un campo de contexto, NTSTATUS, para el resultado de una operación de servidor anterior en esta entrada de nombre y un puntero de extensión de contexto para un almacenamiento específico de minidirector adicional que se puede coasignar con la estructura NAME_CACHE. Para obtener más información, vea RxNameCacheInitialize.

En el caso de las redes de Windows, el recuento de operaciones SMB es un ejemplo de un estado específico del minidirector, que se puede guardar en el campo de contexto de MRX_NAME_CACHE. Cuando se llama a RxNameCacheCheckEntry , realizará una comprobación de igualdad entre el campo de contexto y un parámetro proporcionado como parte de la búsqueda de una coincidencia en la memoria caché de nombres. Cuando se crea o actualiza una entrada de NAME_CACHE, es el trabajo del minidirector de red para proporcionar un valor adecuado para este campo y la duración, en segundos, para la entrada de NAME_CACHE.

La parte privada de RDBSS de la estructura de NAME_CACHE contiene el nombre como una cadena Unicode, un valor hash del nombre para acelerar las búsquedas, una hora de expiración de la entrada y una marca que indica si el servidor admite nombres que distinguen mayúsculas de minúsculas.

La estructura de NAME_CACHE_CONTROL administra una caché de nombres determinada. Tiene una lista gratuita, una lista activa y un bloqueo para sincronizar las actualizaciones. La estructura de NAME_CACHE_CONTROL también tiene campos para almacenar el número actual de entradas de NAME_CACHE asignadas, un valor para el número máximo de entradas que se asignarán, el tamaño de cualquier almacenamiento adicional de minidirector de red usado para cada entrada de NAME_CACHE y los valores de las estadísticas (el número de veces que se actualizó la memoria caché, se ha comprobado, se devolvió una coincidencia válida, y cuando el minidirector de red guardó una operación de red). El campo MaximumEntries limita el número de NAME_CACHE entradas creadas en caso de que un programa mal comportamiento generara un gran número de solicitudes abiertas con nombres de archivo incorrectos que consuman grandes cantidades de memoria.

Actualmente hay cachés de nombres mantenidas por RDBSS para OBJECT_NAME_NOT_FOUND. Para esta caché de nombres, se mantiene una ventana de dos segundos, que se invalida si se envía alguna operación al servidor. Esto podría ocurrir cuando la aplicación cliente tiene un archivo (sample1) abierto que una aplicación en el servidor podría usar para indicar la creación de un archivo diferente (sample2) en el servidor. Cuando el cliente lee el primer archivo (sample1) y aprende que se ha creado el segundo archivo (sample2) en el servidor, un acierto en la caché de nombres que coincide con el segundo archivo (sample2) no puede devolver un error. Esta optimización solo controla el caso de operaciones sucesivas de apertura de archivos en el mismo archivo que aún no existe. Este escenario se produce mediante Microsoft Word.

Las rutinas de administración de caché de nombres RDBSS incluyen lo siguiente:

Rutina Descripción

RxNameCacheActivateEntry

Esta rutina toma una entrada de caché de nombres y actualiza la hora de expiración y el contexto del minidirector de red. A continuación, coloca la entrada en la lista activa.

RxNameCacheCheckEntry

Esta rutina comprueba una entrada de NAME_CACHE para comprobar la validez.

RxNameCacheCreateEntry

Esta rutina asigna e inicializa una estructura de NAME_CACHE con la cadena de nombre especificada. Se espera que el autor de la llamada inicialice los elementos minidirector de red adicionales del contexto de caché de nombres y, a continuación, colocará la entrada en la lista activa de caché de nombres.

RxNameCacheExpireEntry

Esta rutina coloca una entrada de NAME_CACHE en la lista gratuita.

RxNameCacheExpireEntryWithShortName

Esta rutina expira todas las entradas de NAME_CACHE cuyo prefijo de nombre coincide con el nombre de archivo corto especificado.

RxNameCacheFetchEntry

Esta rutina busca una coincidencia con una cadena de nombre especificada para una entrada de NAME_CACHE.

RxNameCacheFinalize

Esta rutina libera el almacenamiento de todas las entradas de NAME_CACHE asociadas a una estructura de NAME_CACHE_CONTROL.

RxNameCacheFreeEntry

Esta rutina libera el almacenamiento de una entrada de NAME_CACHE y disminuye el recuento de NAME_CACHE entradas de caché asociadas a una estructura de NAME_CACHE_CONTROL.

RxNameCacheInitialize

Esta rutina inicializa una memoria caché de nombres (una estructura de NAME_CACHE_CONTROL).