Quebrando bloqueios oportunistas
Quebrar um bloqueio oportunista é o processo de degradar o bloqueio que um cliente tem em um arquivo para que outro cliente possa abrir o arquivo, com ou sem um bloqueio oportunista. Quando o outro cliente solicita a operação de abertura, o servidor atrasa a operação de abertura e notifica o cliente que detém o bloqueio oportunista.
O cliente que mantém o bloqueio toma ações apropriadas ao tipo de bloqueio, por exemplo, abandonando buffers de leitura, fechando o arquivo e assim por diante. Somente quando o cliente que detém o bloqueio oportunista notifica o servidor de que isso foi feito é que o servidor abre o arquivo para o cliente que solicita a operação de abertura. No entanto, quando um bloqueio de nível 2 é quebrado, o servidor informa ao cliente que ele foi quebrado, mas não espera por qualquer confirmação, pois não há dados armazenados em cache para serem liberados para o servidor.
Ao reconhecer uma quebra de qualquer fechadura exclusiva (filtro, nível 1 ou lote), o titular de uma fechadura quebrada não pode solicitar outra fechadura exclusiva. Pode degradar um bloqueio exclusivo para um bloqueio de nível 2 ou sem bloqueio algum. O titular normalmente libera o bloqueio e fecha o arquivo quando está prestes a fechá-lo de qualquer maneira.
Os aplicativos são notificados de que um bloqueio oportunista é quebrado usando o hEvent membro da estrutura de OVERLAPPED associada ao arquivo no qual o bloqueio está quebrado. Os aplicativos também podem usar funções como GetOverlappedResult e HasOverlappedIoCompleted.