Controle de estado de buffer

O RDBSS fornece um gerenciador de buffers, um mecanismo para fornecer coerência de cache distribuído em conjunto com os vários minidiretórios de rede. Esse serviço é encapsulado no gerenciador de buffers no RDBSS que processa solicitações para alterar o estado de buffer. O gerenciador de buffers no RDBSS rastreia e inicia ações em todas as solicitações de estado de buffer de alterações geradas pelos vários minidiretórios de rede, bem como pelo RDBSS.

Há vários componentes comuns na implementação da coerência de cache em um minidiretório de rede típico:

  • Modificações para criar e abrir rotinas de arquivo.

    Nesse caminho, o tipo de solicitação de buffer é determinado e a solicitação apropriada é feita ao servidor. No retorno do minidiretório de rede e, possivelmente, do servidor, o estado de buffer associado ao FCB é atualizado com base no resultado da chamada de criação ou abertura.

  • Modificações para receber um código de indicação para lidar com alterações de notificações de estado de buffer do servidor.

    Se essa solicitação for detectada, o mecanismo local para coordenar os estados de buffer deverá ser disparado.

  • Um mecanismo para alterar o estado de buffer implementado como parte do RDBSS. Qualquer solicitação de estado de buffer de alteração deve identificar a estrutura SRV_OPEN à qual a solicitação se aplica.

A quantidade de esforço computacional envolvido na identificação da estrutura de SRV_OPEN depende do protocolo e dos detalhes do minidiretório de rede. No protocolo SMB, os bloqueios oportunistas (oplocks) fornecem a infraestrutura necessária para a coerência do cache. Na implementação do protocolo SMB no Windows, as APIs de ID multiplex fornecidas pelo RDBSS são usadas. O servidor pode escolher a ID multiplex usada para identificar um arquivo aberto no servidor. As IDs multiplex são relativas à NET_ROOT (compartilhamento) em que são abertas. Portanto, cada solicitação de estado de buffer de alteração é identificada por duas chaves: NetRootKey e SrvOpenKey, que precisam ser convertidas para a estrutura de NET_ROOT e SRV_OPEN apropriadas, respectivamente. Para proporcionar uma melhor integração com o mecanismo de aquisição/liberação de recursos e evitar a duplicação desse esforço nos vários minidiretórios de rede, o RDBSS fornece esse serviço.

Há duas rotinas fornecidas no RDBSS para indicar alterações de estado de buffer em estruturas de SRV_OPEN:

Observe que as principais associações são irreversíveis e durarão o tempo de vida da estrutura SRV_OPEN associada.

Os minidiretórios de rede que precisam de um mecanismo auxiliar para estabelecer o mapeamento de IDs multiplex para a estrutura SRV_OPEN podem usar RxIndicateChangeOfBufferingState, enquanto os minidiretórios de rede que não exigem essa assistência podem usar RxIndicateChangeOfBufferingStateForSrvOpen.

O gerenciador de buffers no RDBSS processa essas solicitações em estágios diferentes. Ele mantém as solicitações recebidas dos vários minidiretórios de rede subjacentes em uma das várias listas.

  • A lista Dispatcher contém todas as solicitações para as quais o mapeamento apropriado para uma estrutura de SRV_OPEN não foi estabelecido.

  • A lista Manipulador contém todas as solicitações para as quais o mapeamento apropriado foi estabelecido, mas ainda não foi processada.

  • O LastChanceHandlerList contém todas as solicitações para as quais o processamento inicial não foi bem-sucedido. Isso normalmente acontece quando o FCB foi adquirido em um modo compartilhado no momento em que a solicitação de estado de buffer de alteração foi recebida. Nesses casos, a solicitação de interrupção do oplock só pode ser processada por um thread de trabalho atrasado.

O processamento de solicitação de estado de buffer de alterações em um driver de minidiretório de rede está entrelaçado com o protocolo de aquisição e lançamento da FCB. Isso ajuda a garantir tempos de reviravolta mais curtos.

O RDBSS fornece as seguintes rotinas para gerenciar o estado de buffer que pode ser usado por drivers de minidiretório de rede:

Rotina Descrição

RxChangeBufferingState

Essa rotina é chamada para processar uma solicitação de alteração de estado de buffer.

RxIndicateChangeOfBufferingState

Essa rotina é chamada para registrar uma solicitação de alteração de estado de buffer (uma indicação de interrupção de oplock, por exemplo) para processamento posterior.

RxIndicateChangeOfBufferingStateForSrvOpen

Essa rotina é chamada para registrar uma solicitação de alteração de estado de buffer (uma indicação de interrupção de oplock, por exemplo) para processamento posterior.