Gerenciamento de Cache de Nomes

A estrutura NAME_CACHE armazena em cache as cadeias de caracteres de nome de operações recentes executadas no servidor para que o cliente possa suprimir solicitações redundantes. Por exemplo, se uma solicitação aberta falhou recentemente com uma mensagem "arquivo não encontrado" e o aplicativo cliente tentar a solicitação aberta novamente com uma cadeia de caracteres maiúscula e o minidiretório de rede não oferecer suporte a nomes que diferenciam maiúsculas de minúsculas, o RDBSS poderá falhar a solicitação imediatamente sem atingir o servidor.

Em geral, o algoritmo é colocar uma janela de tempo e um limite de contagem de operações na entrada de NAME_CACHE. A janela de tempo geralmente é de dois segundos. Portanto, se a entrada de NAME_CACHE for maior que dois segundos, a correspondência falhará e a solicitação irá para o servidor. Se a solicitação falhar novamente no servidor, a entrada de NAME_CACHE será atualizada com outra janela de dois segundos. Se a contagem de operações de solicitação não corresponder, uma ou mais solicitações foram enviadas ao servidor, o que pode tornar essa entrada NAME_CACHE inválida. Portanto, novamente, essa operação será enviada ao servidor.

Uma estrutura NAME_CACHE tem uma parte pública exposta ao minidiretório de rede, MRX_NAME_CACHE e uma seção privada para uso exclusivamente pelo RDBSS. A parte do minidiretório tem um campo de contexto, NTSTATUS, para o resultado de uma operação de servidor anterior nessa entrada de nome e um ponteiro de extensão de contexto para algum armazenamento específico de minidiretório adicional que pode ser co-alocado com a estrutura NAME_CACHE. Para obter mais informações, consulte RxNameCacheInitialize.

Para a rede do Windows, a contagem de operações SMB é um exemplo de um estado específico do minidiretório, que pode ser salvo no campo de contexto de MRX_NAME_CACHE. Quando RxNameCacheCheckEntry for chamado, ele executará uma marcar de igualdade entre o campo de contexto e um parâmetro fornecido como parte da localização de uma correspondência no cache de nomes. Quando uma entrada de NAME_CACHE é criada ou atualizada, é trabalho do minidiretório de rede fornecer um valor apropriado para esse campo e o tempo de vida, em segundos, para a entrada de NAME_CACHE.

A parte RDBSS privada da estrutura NAME_CACHE contém o nome como uma cadeia de caracteres Unicode, um valor de hash do nome para acelerar pesquisas, uma hora de expiração da entrada e um sinalizador que indica se o servidor dá suporte a nomes que diferenciam maiúsculas de minúsculas.

A estrutura NAME_CACHE_CONTROL gerencia um determinado cache de nomes. Ele tem uma lista gratuita, uma lista ativa e um bloqueio para sincronizar atualizações. A estrutura NAME_CACHE_CONTROL também tem campos para armazenar o número atual de entradas NAME_CACHE alocadas, um valor para o número máximo de entradas a serem alocadas, o tamanho de qualquer armazenamento adicional de minidiretório de rede usado para cada entrada de NAME_CACHE e valores para estatísticas (o número de vezes que o cache foi atualizado, verificado, uma correspondência válida foi retornada, e quando o minidiretório de rede salvou uma operação de rede). O campo MaximumEntries limita o número de entradas NAME_CACHE criadas caso um programa mal comportado gere um grande número de solicitações abertas com nomes de arquivo inválidos que consomem grandes quantidades de memória.

Atualmente, há caches de nomes mantidos pelo RDBSS para OBJECT_NAME_NOT_FOUND. Para esse cache de nomes, uma janela de dois segundos é mantida, que será invalidada se qualquer operação for enviada ao servidor. Isso pode acontecer quando o aplicativo cliente tem um arquivo (sample1) aberto que um aplicativo no servidor pode usar para sinalizar a criação de um arquivo diferente (sample2) no servidor. Quando o cliente lê o primeiro arquivo (sample1) e descobre que o segundo arquivo (sample2) foi criado no servidor, uma ocorrência no cache de nomes que corresponde ao segundo arquivo (sample2) não pode retornar um erro. Essa otimização trata apenas o caso de operações sucessivas de abertura de arquivo no mesmo arquivo que ainda não existe. Esse cenário acontece usando o Microsoft Word.

As rotinas de gerenciamento de cache de nome RDBSS incluem o seguinte:

Rotina Descrição

RxNameCacheActivateEntry

Essa rotina usa uma entrada de cache de nome e atualiza o tempo de expiração e o contexto do minidiretório de rede. Em seguida, ele coloca a entrada na lista ativa.

RxNameCacheCheckEntry

Essa rotina verifica a validade de uma entrada de NAME_CACHE.

RxNameCacheCreateEntry

Essa rotina aloca e inicializa uma estrutura NAME_CACHE com a cadeia de caracteres de nome fornecida. Espera-se que o chamador inicialize todos os elementos adicionais de minidiretório de rede do contexto de cache de nomes e, em seguida, coloque a entrada na lista ativa do cache de nomes.

RxNameCacheExpireEntry

Essa rotina coloca uma entrada de NAME_CACHE na lista gratuita.

RxNameCacheExpireEntryWithShortName

Essa rotina expira todas as entradas NAME_CACHE cujo prefixo de nome corresponde ao nome de arquivo curto fornecido.

RxNameCacheFetchEntry

Essa rotina procura uma correspondência com uma cadeia de caracteres de nome especificada para uma entrada de NAME_CACHE.

RxNameCacheFinalize

Essa rotina libera o armazenamento de todas as entradas de NAME_CACHE associadas a uma estrutura NAME_CACHE_CONTROL.

RxNameCacheFreeEntry

Essa rotina libera o armazenamento de uma entrada de NAME_CACHE e diminui a contagem de entradas de cache NAME_CACHE associadas a uma estrutura de NAME_CACHE_CONTROL.

RxNameCacheInitialize

Essa rotina inicializa um cache de nomes (uma estrutura NAME_CACHE_CONTROL).