Tipos de bloqueios oportunistas

As operações de bloqueio oportunista funcionam com quatro tipos de bloqueios oportunistas: nível 1, nível 2, lote e filtro. Bloqueios oportunistas exclusivos são bloqueios de nível 1, lote e filtro. Se um thread tiver qualquer tipo de bloqueio exclusivo em um arquivo, ele também não poderá ter um bloqueio de nível 2 no mesmo arquivo.

Bloqueios oportunistas de nível 1

Um bloqueio oportunista de nível 1 em um arquivo permite que um cliente leia antecipadamente no arquivo e armazene em cache dados de leitura antecipada e gravação do arquivo localmente. Desde que o cliente tenha acesso exclusivo a um arquivo, não há perigo para a coerência de dados em fornecer um bloqueio oportunista de nível 1.

O cliente pode solicitar um bloqueio oportunista de nível 1 depois de abrir um arquivo. Se nenhum outro cliente (ou nenhum outro thread no mesmo cliente) tiver o arquivo aberto, o servidor poderá conceder o bloqueio oportunista. Em seguida, o cliente pode armazenar em cache dados de leitura e gravação do arquivo localmente. Se outro cliente tiver aberto o arquivo, o servidor recusará o bloqueio oportunista e o cliente não fará cache local. (O servidor também pode recusar o bloqueio oportunista por outros motivos, como não dar suporte a bloqueios oportunistas.)

Quando o servidor abre um arquivo que já tem um bloqueio oportunista de nível 1, o servidor examina o estado de compartilhamento do arquivo antes de quebrar o bloqueio oportunista de nível 1. Se o servidor quebrar o bloqueio após esse exame, o tempo que o cliente com o bloqueio anterior gasta liberando seu cache de gravação é o tempo que o cliente que solicita o arquivo deve aguardar. Esse gasto de tempo significa que bloqueios oportunistas de nível 1 devem ser evitados em arquivos que muitos clientes abrem.

No entanto, como o servidor verifica o estado de compartilhamento antes de quebrar o bloqueio, no caso em que o servidor negaria uma solicitação aberta devido a um conflito de compartilhamento, o servidor não quebra o bloqueio. Por exemplo, se você abriu um arquivo, negou compartilhamento para operações de gravação e obteve um bloqueio de nível 1, o servidor nega a solicitação de outro cliente para abrir o arquivo para gravação antes mesmo de examinar o bloqueio no arquivo. Neste caso, seu bloqueio oportunista não está quebrado.

Para obter um exemplo de como funciona um bloqueio oportunista de nível 1, consulte Exemplo de bloqueio oportunista de nível 1. Para obter mais informações sobre como quebrar bloqueios oportunistas, consulte Quebrando bloqueios oportunistas.

Bloqueios oportunistas de nível 2

Um bloqueio oportunista de nível 2 informa a um cliente que há vários clientes simultâneos de um arquivo e que nenhum deles ainda o modificou. Esse bloqueio permite que o cliente execute operações de leitura e obtenha atributos de arquivo usando informações locais armazenadas em cache ou lidas, mas o cliente deve enviar todas as outras solicitações (como para operações de gravação) para o servidor. Seu aplicativo deve usar o bloqueio oportunista de nível 2 quando você espera que outros aplicativos escrevam no arquivo aleatoriamente ou leiam o arquivo aleatoriamente ou sequencialmente.

Um bloqueio oportunista de nível 2 é muito semelhante a um bloqueio oportunista de filtro. Na maioria das situações, seu aplicativo deve usar o bloqueio oportunista de nível 2. Use apenas o bloqueio de filtro se você não quiser operações abertas para leitura para causar violações do modo de compartilhamento no intervalo de tempo entre a abertura do arquivo do aplicativo e o recebimento do bloqueio. Para obter mais informações, consulte Filtrar bloqueios oportunistas e resposta do servidor a solicitações abertas em arquivos bloqueados.

Para obter mais informações sobre como quebrar bloqueios oportunistas, consulte Quebrando bloqueios oportunistas.

Bloqueios oportunistas em lotes

Um bloqueio oportunista em lote manipula aberturas e fechamentos de arquivos. Por exemplo, na execução de um arquivo em lote, o arquivo em lote pode ser aberto e fechado uma vez para cada linha do arquivo. Um bloqueio oportunista em lote abre o arquivo em lote no servidor e o mantém aberto. À medida que o processador de comando "abre" e "fecha" o arquivo em lote, o redirecionador de rede intercepta os comandos open e close. Todos os recebimentos do servidor são os comandos de busca e leitura. Se o cliente também estiver lendo antecipadamente, o servidor receberá uma solicitação de leitura específica no máximo uma vez.

Ao abrir um arquivo que já tem um bloqueio oportunista em lote, o servidor verifica o estado de compartilhamento do arquivo depois de quebrar o bloqueio. Esse marcar dá ao detentor do bloqueio a chance de concluir a liberação do cache e fechar o identificador de arquivo. Uma operação aberta tentada durante o marcar de compartilhamento não faz com que o marcar de compartilhamento falhe se o detentor do bloqueio liberar o bloqueio.

Para obter um exemplo de como funciona um bloqueio oportunista em lotes, consulte Exemplo de bloqueio oportunista em lote. Para obter mais informações sobre como quebrar bloqueios oportunistas, consulte Quebrando bloqueios oportunistas.

Filtrar bloqueios oportunistas

Um bloqueio oportunista de filtro bloqueia um arquivo para que ele não possa ser aberto para acesso de gravação ou exclusão. Todos os clientes devem ser capazes de compartilhar o arquivo. Os bloqueios de filtro permitem que os aplicativos executem operações de filtragem não intrusivas em dados de arquivo (por exemplo, um compilador abrindo o código-fonte ou um programa de catalogação).

Um bloqueio oportunista de filtro difere de um bloqueio oportunista de nível 2, pois permite que as operações abertas para leitura ocorram sem violações do modo de compartilhamento no intervalo de tempo entre a abertura do arquivo do aplicativo e o recebimento do bloqueio. O bloqueio oportunista de filtro é o melhor bloqueio a ser usado quando é importante permitir que outros clientes leiam o acesso. Em outros casos, seu aplicativo deve usar um bloqueio oportunista de nível 2. Um bloqueio oportunista de filtro difere de um bloqueio oportunista em lote, pois não permite que várias aberturas e fechamentos sejam tratados pelo redirecionador de rede da maneira como um bloqueio oportunista em lotes faz.

Seu aplicativo deve solicitar um bloqueio oportunista de filtro em um arquivo em três etapas:

  1. Use a função CreateFile para abrir um identificador para o arquivo com o parâmetro DesiredAccess definido como zero, indicando nenhum acesso e o parâmetro dwShareMode definido como o sinalizador FILE_SHARE_READ para permitir o compartilhamento para leitura. O identificador obtido neste ponto é chamado de identificador de bloqueio.
  2. Solicite um bloqueio nesse identificador com o código de controle FSCTL_REQUEST_FILTER_OPLOCK .
  3. Quando o bloqueio for concedido, use CreateFile para abrir o arquivo novamente com DesiredAccess definido como o sinalizador GENERIC_READ . Defina dwShareMode como o sinalizador FILE_SHARE_READ para permitir que outras pessoas leiam o arquivo enquanto você o tiver aberto, o sinalizador FILE_SHARE_DELETE para permitir que outras pessoas marquem o arquivo para exclusão enquanto você o tiver aberto ou ambos. O identificador obtido neste ponto é chamado de identificador de leitura.

Use o identificador de leitura para ler ou gravar no conteúdo do arquivo.

Ao abrir um arquivo que já tem um bloqueio oportunista de filtro, o servidor quebra o bloqueio e verifica o estado de compartilhamento do arquivo. Esse marcar dá ao cliente que manteve o antigo bloqueio oportunista a chance de abandonar quaisquer dados armazenados em cache e reconhecer a interrupção. Uma operação aberta tentada durante esse marcar de compartilhamento não faz com que o marcar de compartilhamento falhe se o antigo detentor do bloqueio liberar o bloqueio. O sistema de arquivos mantém a operação aberta até que o proprietário do bloqueio feche o identificador de leitura e, em seguida, o identificador de bloqueio. Depois que isso for feito, a solicitação aberta do outro cliente poderá continuar.

Para obter mais informações sobre como quebrar bloqueios oportunistas, consulte Quebrando bloqueios oportunistas.