Quebra de bloqueios oportunistas

Quebrar um bloqueio oportunista é o processo de degradação do 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 aberta, o servidor atrasa a operação aberta e notifica o cliente que mantém o bloqueio oportunista.

O cliente que mantém o bloqueio executa ações apropriadas para o tipo de bloqueio, por exemplo, abandonando buffers de leitura, fechando o arquivo e assim por diante. Somente quando o cliente que mantém o bloqueio oportunista notifica o servidor de que ele é feito, o servidor abre o arquivo para o cliente que solicita a operação aberta. No entanto, quando um bloqueio de nível 2 é interrompido, o servidor relata ao cliente que ele foi quebrado, mas não aguarda nenhuma confirmação, pois não há dados armazenados em cache a serem liberados para o servidor.

Ao reconhecer uma quebra de qualquer bloqueio exclusivo (filtro, nível 1 ou lote), o titular de um bloqueio quebrado não pode solicitar outro bloqueio exclusivo. Ele pode degradar um bloqueio exclusivo para um bloqueio de nível 2 ou nenhum bloqueio. O titular normalmente libera o bloqueio e fecha o arquivo quando ele está prestes a fechar o arquivo de qualquer maneira.

Os aplicativos são notificados de que um bloqueio oportunista é interrompido usando o membro hEvent da estrutura OVERLAPPED associada ao arquivo no qual o bloqueio está quebrado. Os aplicativos também podem usar funções como GetOverlappedResult e HasOverlappedIoCompleted.