Gerir bloqueios de ficheiros
Ficheiros do Azure fornece acesso a partilhas de ficheiros na cloud através dos seguintes protocolos:
- Bloco de Mensagem de Servidor (SMB)
- NFS (Network File System)
- FileREST (HTTPS)
Este tópico descreve como gerir interações de bloqueio de ficheiros entre SMB e FileREST. As partilhas de ficheiros NFS têm semântica de bloqueio diferente e suportam um subconjunto das APIs FileREST. Este tópico não é aplicável a partilhas de ficheiros NFS.
Bloqueio de ficheiros SMB
Os clientes SMB que montam partilhas de ficheiros podem utilizar mecanismos de bloqueio do sistema de ficheiros para gerir o acesso a ficheiros partilhados. Incluem-se:
- Partilha de acesso a ficheiros inteira para leitura, escrita e eliminação.
- O intervalo de bytes bloqueia para gerir o acesso de leitura e escrita a regiões num único ficheiro.
Quando um cliente SMB abre um ficheiro, especifica o acesso ao ficheiro e o modo de partilha. Normalmente, as seguintes opções de acesso a ficheiros são utilizadas por clientes SMB, embora todas as combinações sejam permitidas:
- Nenhum: Abre um ficheiro apenas para acesso a atributos de consulta.
- Leia: Abre um ficheiro apenas para acesso de leitura.
- Escrever: Abre um ficheiro apenas para acesso de escrita.
- Leitura/Escrita: Abre um ficheiro com permissões de leitura/escrita.
- Eliminar: Abre um ficheiro apenas para eliminar o acesso.
Normalmente, os seguintes modos de partilha de ficheiros são utilizados pelos clientes SMB:
- Nenhum: Recusa a partilha do ficheiro atual. Qualquer pedido para abrir o ficheiro com acesso de leitura, escrita ou eliminação falhará até que o ficheiro seja fechado.
- Leitura Partilhada: Permite a abertura subsequente do ficheiro para leitura. Se este sinalizador não for especificado, qualquer pedido para abrir o ficheiro para leitura falhará até que o ficheiro seja fechado.
- Escrita Partilhada: Permite a abertura subsequente do ficheiro para escrita. Se este sinalizador não for especificado, qualquer pedido para abrir o ficheiro para escrita falhará até que o ficheiro seja fechado.
- Leitura/Escrita Partilhada: Permite a abertura subsequente do ficheiro para leitura ou escrita. Se este sinalizador não for especificado, qualquer pedido para abrir o ficheiro para leitura ou escrita falhará até que o ficheiro seja fechado.
- Eliminação Partilhada: Permite a eliminação subsequente de um ficheiro. Se este sinalizador não for especificado, qualquer pedido para eliminar o ficheiro falhará até que o ficheiro seja fechado.
Exemplos de ficheiros abertos do cliente SMB
Considere os seguintes exemplos de ficheiro aberto:
O ficheiro é aberto sem violação de partilha
- O Cliente A abre o ficheiro com
FileAccess.Read
e FileShare.Write (nega a leitura/eliminação subsequente enquanto está aberto). - Em seguida, o cliente B abre o ficheiro com
FileAccess.Write
FileShare.Read (nega escrita/eliminação subsequente enquanto está aberto). - Resultado: Isto é permitido, uma vez que não existe nenhum conflito entre o acesso a ficheiros e os modos de partilha de ficheiros.
- O Cliente A abre o ficheiro com
Violação da partilha devido ao acesso a ficheiros
- O Cliente A abre o ficheiro com
FileAccess.Write
e FileShare.Read (nega escrita/eliminação subsequente enquanto está aberto). - Em seguida, o cliente B abre o ficheiro com
FileAccess.Write
FileShare.Write (nega a leitura/eliminação subsequente enquanto está aberto). - Resultado: O cliente B encontra uma violação de partilha. O cliente especificou um acesso de ficheiro negado pelo modo de partilha especificado anteriormente pelo Cliente A.
- O Cliente A abre o ficheiro com
Violação da partilha devido ao modo de partilha
- O Cliente A abre o ficheiro com
FileAccess.Write
e FileShare.Write (nega a leitura/eliminação subsequente enquanto está aberto). - Em seguida, o cliente B abre o ficheiro com
FileAccess.Write
FileShare.Read (nega escrita/eliminação subsequente enquanto está aberto). - Resultado: O cliente B encontra uma violação de partilha. O cliente especificou um modo de partilha que nega o acesso de escrita a um ficheiro que ainda está aberto para acesso de escrita.
- O Cliente A abre o ficheiro com
Acesso ao ficheiro FileREST
Quando executa uma operação FileREST, esta operação tem de respeitar o modo de partilha especificado para qualquer ficheiro aberto num cliente SMB. Utilize o seguinte modo de acesso a ficheiros para determinar se a operação pode ser concluída:
Operação FileREST | Equivalente ao acesso a ficheiros |
---|---|
Listar Diretórios e Ficheiros | N/D. |
Criar Ficheiro | Escreva, Elimine. |
Obter Ficheiro | Ler. |
Definir Propriedades do Ficheiro | Escreva. |
Obter Propriedades do Ficheiro | N/D. |
Definir Metadados de Ficheiro | Escreva. |
Obter Metadados de Ficheiro | N/D. |
Eliminar Ficheiro | Eliminar. |
Colocar Intervalo | Escreva. |
Intervalos de Lista | Ler. |
Ficheiro de Concessão | Escrita, Eliminação e Leitura Partilhada durante a concessão. |
Listar Diretórios e Ficheiros, Obter Propriedades de Ficheiro e Obter Metadados de Ficheiro não funcionam em conteúdo de ficheiro. Estas operações não requerem acesso de leitura ao ficheiro (ou seja, estas operações são bem-sucedidas mesmo que um cliente SMB tenha o ficheiro aberto para acesso de leitura exclusivo).
Seguem-se exemplos de pedidos FileREST que interagem com os modos de partilha SMB:
FileREST Obter Violação de partilha de ficheiros
- O cliente SMB abre o ficheiro com
FileAccess.Read
e FileShare.Write (nega a leitura/eliminação subsequente enquanto está aberto). - Em seguida, o cliente REST executa uma operação Obter Ficheiro no ficheiro (utilizando
FileAccess.Read
assim, conforme especificado na tabela anterior). -
Resultado: O pedido do cliente REST falha com o código de estado 409 (Conflito) e o código
SharingViolation
de erro . O cliente SMB ainda tem o ficheiro aberto e nega o acesso de Leitura/Eliminação.
- O cliente SMB abre o ficheiro com
Violação da partilha fileREST Put Range
- O cliente SMB abre o ficheiro com
FileAccess.Write
e FileShare.Read (nega escrita/eliminação subsequente enquanto está aberto). - Em seguida, o cliente REST executa uma operação Colocar Intervalo no ficheiro (utilizando
FileAccess.Write
assim, conforme especificado na tabela anterior). -
Resultado: O pedido do cliente REST falha com o código de estado 409 (Conflito) e o código
SharingViolation
de erro . O cliente SMB ainda tem o ficheiro aberto e nega o acesso de Escrita/Eliminação.
- O cliente SMB abre o ficheiro com
A secção seguinte inclui uma tabela abrangente de cenários de violação da partilha da API FileREST.
Implicações do modo de partilha de cliente SMB no FileREST
Dependendo do modo de partilha que especificar quando um cliente SMB abre um ficheiro, é possível que FileREST devolva o código de estado 409 (Conflito) com o código SharingViolation
de erro . A tabela seguinte lista vários cenários.
Modo de partilha de ficheiros de cliente SMB | As operações fileREST falham com uma violação de partilha |
---|---|
None (Deny Read, Write, Delete) |
As seguintes operações de leitura, escrita, concessão e eliminação no ficheiro falharão:
|
Shared Read Deny Write, Delete) |
As seguintes operações de escrita, concessão e eliminação no ficheiro falharão:
|
Shared Write (Deny Read, Delete) |
As seguintes operações de leitura, concessão e eliminação no ficheiro falharão:
|
Shared Delete (Deny Read, Write) |
As seguintes operações de leitura, escrita e concessão no ficheiro falharão:
|
Shared Read/Write (Deny Delete) |
As seguintes operações de concessão e eliminação no ficheiro falharão:
|
Shared Read/Delete (Deny Write) |
As seguintes operações de escrita, concessão e eliminação no ficheiro falharão:
|
Shared Write/Delete (Deny Read) |
As seguintes operações de leitura e concessão no ficheiro falharão:
|
Shared Read/Write/Delete (Deny Nothing) |
Eliminar Ficheiro |
Ficheiros do Azure devolve violações de partilha apenas quando os ficheiros estão abertos em clientes SMB. Para que uma operação FileREST Delete File seja bem-sucedida, não podem existir clientes SMB com identificadores abertos nesse ficheiro. Para obter mais informações, veja a operação Eliminar Ficheiro e Interação entre bloqueios oportunistas FileREST e SMB.
Implicações de bloqueio de ficheiros SMB na API de Ficheiro de Concessão FileREST
Dependendo das opções de acesso a ficheiros que especificar quando um cliente SMB abre um ficheiro, é possível que a API de Ficheiro de Concessão FileREST devolva o código de estado 409 (Conflito), com o código SharingViolation
de erro . A tabela seguinte fornece mais informações:
Opção de acesso a ficheiros de cliente SMB | Adquirir concessão no ficheiro sem uma concessão ativa com a API de Ficheiro de Concessão |
---|---|
Nenhuma | Com êxito |
Leitura | Com êxito |
Escrita | Falha devido a SharingViolation |
Eliminar | Falha devido a SharingViolation |
Leitura|Escrever | Falha devido a SharingViolation |
Leitura|Eliminar | Falha devido a SharingViolation |
Escrita|Eliminar | Falha devido a SharingViolation |
Leitura|Escrita|Eliminar | Falha devido a SharingViolation |
Ficheiros do Azure devolve violações de partilha apenas quando os ficheiros estão abertos em clientes SMB. Tenha em atenção que, para que uma operação ficheiro de concessão FileREST seja bem-sucedida, não podem existir clientes SMB com alças de Escrita ou Eliminação abertas nesse ficheiro. Para obter mais informações, veja a operação Ficheiro de Concessão e Interação entre bloqueios oportunistas FileREST e SMB.
Implicações do Ficheiro de Concessão FileREST para o bloqueio de ficheiros SMB
Uma concessão num ficheiro fornece acesso exclusivo de escrita e eliminação ao ficheiro. Quando um cliente SMB abre um ficheiro, tem de respeitar o bloqueio de qualquer ficheiro arrendado pela operação Ficheiro de Concessão FileREST. Pode utilizar a tabela seguinte para determinar se a operação de ficheiro aberto SMB pode ser concluída:
FileREST file lease state (Estado de concessão de ficheiros FileREST) | As operações SMB falham com uma violação de partilha |
---|---|
Arrendado | Os clientes SMB que abrirem o ficheiro com o seguinte acesso ao ficheiro falharão:
|
Disponível | Nenhuma |
Quebrado | Nenhuma |
SMB delete implications on FileREST
Quando um cliente SMB abre um ficheiro para eliminação, marca o ficheiro como eliminação pendente, até que todas as outras alças de abertura do cliente SMB nesse ficheiro sejam fechadas. Enquanto um ficheiro está marcado como eliminação pendente, qualquer operação FileREST nesse ficheiro devolverá o código de estado 409 (Conflito), com o código de SMBDeletePending
erro . O código de estado 404 (Não Encontrado) não é devolvido porque é possível ao cliente SMB remover o sinalizador de eliminação pendente antes de fechar o ficheiro. Por outras palavras, o código de estado 404 (Não Encontrado) só é esperado quando o ficheiro tiver sido removido.
Enquanto um ficheiro estiver num estado de eliminação pendente de SMB, não será incluído nos List Files
resultados.
Tenha também em atenção que o FileREST Delete File
e Delete Directory
as operações são consolidados atomicamente e não resultam no estado de eliminação pendente.
Implicações de atributos de ficheiro no FileREST
É possível que os clientes SMB leiam e definam atributos de ficheiro, incluindo:
- Arquivo
- Só de leitura
- Oculto
- Sistema
Se um ficheiro ou diretório estiver marcado como só de leitura, qualquer operação FileREST que tente escrever no ficheiro falhará com o código de estado 412 (Falha na Pré-condição) e o código ReadOnlyAttribute
de erro . Estas operações incluem:
Create File
Set File Properties
Set File Metadata
Put Range
Estes atributos de ficheiro não podem ser definidos nem lidos a partir de clientes REST. Depois de um ficheiro ser tornado só de leitura, os clientes REST não poderão escrever no ficheiro até que o cliente SMB remova o atributo só de leitura.
Interação entre bloqueios oportunistas FileREST e SMB
O bloqueio oportunista SMB (oplock) é um mecanismo de colocação em cache que os clientes SMB pedem para melhorar o desempenho e reduzir as transferências de rede. Um cliente SMB pode colocar em cache o estado mais recente de um determinado ficheiro ou diretório. Existem vários tipos de bloqueio oportunistas, referidos como tipos de concessão SMB:
- Leitura (R): O cliente SMB pode ler a partir da cache local.
- Escrita (W): o cliente SMB pode escrever localmente, sem a necessidade de devolver os dados à partilha de ficheiros do Azure.
- Identificador (H): o cliente SMB não é obrigado a notificar imediatamente a partilha de ficheiros do Azure quando uma alça é fechada. Este tipo de bloqueio é útil quando uma aplicação continua a abrir e a fechar ficheiros com o mesmo modo de acesso e partilha.
Estes tipos de concessão são independentes do modo de acesso e partilha especificado. Normalmente, um cliente SMB tenta adquirir todos os tipos de concessão sempre que abre uma nova alça num ficheiro, independentemente do modo de acesso e partilha.
Dependendo da operação FileREST chamada, poderá ter de pedir para interromper um bloqueio oportunista existente. No caso de um oplock de escrita, o cliente SMB tem de remover as alterações em cache na partilha de ficheiros do Azure. Eis alguns casos em que cada tipo de oplock tem de ser quebrado:
Um oplock de Leitura (R) tem de ser interrompido sempre que for emitida uma operação de escrita, como
Put Range
.Um oplock de Escrita (W) tem de ser interrompido sempre que for emitida uma operação de leitura, como
Get File
.Um oplock handle (H) tem de ser quebrado sempre que um cliente emite uma operação de eliminação. Ficheiros do Azure requer que não sejam abertas alças se uma operação de eliminação for bem-sucedida.
Os bloqueios de identificador também são quebrados quando uma operação FileREST enfrenta uma violação de partilha com uma alça SMB existente. Isto ocorre para verificar se as alças ainda estão abertas por uma aplicação em execução nos clientes.
Interromper o oplock pode exigir a remoção de alterações do cliente SMB em cache, o que pode causar atrasos no tempo de resposta da operação. A remoção também pode fazer com que a operação falhe com o código de estado 408 (Tempo Limite do Pedido) e o código ClientCacheFlushDelay
de erro .
As secções seguintes abordam cenários em que os oplocks estão danificados.
É necessária uma interrupção do oplock e a descarga do cliente SMB e o cliente REST tem um atraso
Considere o exemplo seguinte:
O cliente SMB abre um ficheiro, adquire um oplock RWH e escreve dados localmente.
O cliente REST envia um
Get File
pedido.- A partilha de ficheiros do Azure interrompe o oplock de escrita (W), deixando o cliente com um oplock RH.
- O cliente SMB limpa os dados em cache na partilha de ficheiros do Azure e reconhece a quebra de oplock.
- A partilha de ficheiros do Azure processa o
Get File
pedido e responde com os dados pedidos.
Neste exemplo, o cliente REST tem atrasos. Esta situação é causada pela quebra do oplock e pelo tempo que o cliente SMB demorou a remover os dados da partilha de ficheiros do Azure.
As chamadas subsequentes para Get File
não sofreram atrasos adicionais, porque o oplock de escrita (W) já foi interrompido.
É necessária uma interrupção do oplock, mas o cliente REST não irá deparar-se com um atraso
Considere o exemplo seguinte:
O cliente SMB adquiriu um oplock RH.
O cliente REST envia um
Put Range
pedido.- A partilha de ficheiros do Azure envia um pedido de interrupção de oplock para o cliente SMB e não aguarda uma resposta.
- A partilha de ficheiros do Azure processa o
Put Range
pedido.
Neste exemplo, a interrupção do oplock é necessária, mas o Put Range
pedido não sofre atrasos adicionais. Não é necessária uma resposta ao quebrar o oplock de leitura.
Ficheiros do Azure comportamento
A tabela seguinte resume o comportamento de Ficheiros do Azure para cada operação FileREST. Este comportamento baseia-se no estado de oplock do cliente SMB que já adquiriu uma alça no mesmo ficheiro. Além disso, o comportamento pressupõe que o SMB processa o acesso e a partilha não entra em conflito com a operação FileREST.
Se existir um conflito, o identificador do oplock também será quebrado para garantir que a alça ainda está aberta no cliente. No caso de uma interrupção do oplock de bloqueio, Ficheiros do Azure tem de aguardar por uma confirmação de que a interrupção foi bem-sucedida. No caso de uma quebra de oplock sem bloqueio, Ficheiros do Azure não tem de esperar.
Operação FileREST | Tipos de oplock atuais | Interrupção do oplock executada | Oplock resultante |
---|---|---|---|
Obter Ficheiro | RWH | Sim (Bloqueio) | RH |
Obter Ficheiro | RH | No | RH |
Obter Ficheiro | RW | Sim (Bloqueio) | R |
Obter Propriedades do Ficheiro | RWH | Sim (Bloqueio) | RH |
Obter Propriedades do Ficheiro | RH | No | RH |
Obter Propriedades do Ficheiro | RW | Sim (Bloqueio) | R |
Intervalos de Lista | RWH | Sim (Bloqueio) | RH |
Intervalos de Lista | RH | No | RH |
Intervalos de Lista | RW | Sim (Bloqueio) | R |
Obter Metadados de Ficheiro | RWH | Sim (Bloqueio) | RH |
Obter Metadados de Ficheiro | RH | No | RH |
Obter Metadados de Ficheiro | RW | Sim (Bloqueio) | R |
Listar Ficheiros | RWH | No | RWH |
Listar Ficheiros | RH | No | RH |
Listar Ficheiros | RW | No | RW |
Colocar Intervalo | RWH | Sim (Bloqueio) | Nenhuma |
Colocar Intervalo | RH | Sim (Sem Bloqueio) | Nenhuma |
Colocar Intervalo | RW | Sim (Bloqueio) | Nenhuma |
Definir Propriedades do Ficheiro | RWH | Sim (Bloqueio) | Nenhuma |
Definir Propriedades do Ficheiro | RH | Sim (Sem Bloqueio) | Nenhuma |
Definir Propriedades do Ficheiro | RW | Sim (Bloqueio) | Nenhuma |
Definir Metadados de Ficheiro | RWH | Sim (Bloqueio) | Nenhuma |
Definir Metadados de Ficheiro | RH | Sim (Sem Bloqueio) | Nenhuma |
Definir Metadados de Ficheiro | RW | Sim (Bloqueio) | Nenhuma |
Eliminar Ficheiro | RWH | Sim (Bloqueio) | RW |
Eliminar Ficheiro | RH | Sim (Bloqueio) | R |
Eliminar Ficheiro | RW | No | RW |
No caso de ser necessária uma quebra de oplock de bloqueio, em determinadas condições, a operação FileREST falha. Se a quebra não for bem-sucedida dentro do tempo limite do pedido especificado ou dentro de 30 segundos, o que for concluído primeiro, o serviço devolve o código de estado 408 (Tempo Limite do Pedido) e o código ClientCacheFlushDelay
de erro .
O Delete File
pedido também requer a interrupção da concessão do identificador de oplock (H). Quebrar a alça garante que ainda não existem identificadores de ficheiros abertos por uma aplicação cliente SMB quando um cliente REST chama Delete File
. Se existir uma violação de partilha, o pedido falha com o código de estado 409 (Conflito) e o código de SharingViolation
erro .