Gerenciar bloqueios de arquivos
Arquivos do Azure fornece acesso aos compartilhamentos de arquivos de nuvem por meio dos seguintes protocolos:
- Protocolo SMB
- NFS (sistema de arquivos de rede)
- FileREST (HTTPS)
Este tópico descreve como gerenciar interações de bloqueio de arquivos entre SMB e FileREST. Os compartilhamentos de arquivos NFS têm semântica de bloqueio diferente e dão suporte a um subconjunto das APIs FileREST. Este tópico não é aplicável a compartilhamentos de arquivos NFS.
Bloqueio de arquivo SMB
Os clientes SMB que montam compartilhamentos de arquivos podem usar mecanismos de bloqueio do sistema de arquivos para gerenciar o acesso a arquivos compartilhados. Estão incluídos:
- Todo compartilhamento de acesso de arquivo para leitura, gravação e exclusão.
- Bloqueios de intervalo de bytes para gerenciar o acesso de leitura e gravação para regiões dentro de um único arquivo.
Quando um cliente SMB abre um arquivo, ele especifica o acesso ao arquivo e o modo de compartilhamento. As seguintes opções de acesso a arquivos normalmente são usadas por clientes SMB, embora todas as combinações sejam permitidas:
- Nenhum: Abre um arquivo somente para acesso de atributo de consulta.
- Ler: Abre um arquivo somente para acesso de leitura.
- Escrever: Abre um arquivo somente para acesso de gravação.
- Leitura/gravação: Abre um arquivo com permissões de leitura/gravação.
- Excluir: Abre um arquivo somente para excluir acesso.
Os seguintes modos de compartilhamento de arquivo são normalmente usados por clientes SMB:
- Nenhum: Recusa o compartilhamento do arquivo atual. Qualquer solicitação para abrir o arquivo com acesso de leitura, gravação ou exclusão falhará até que o arquivo seja fechado.
- Leitura Compartilhada: Permite a abertura subsequente do arquivo para leitura. Se esse sinalizador não for especificado, qualquer solicitação para abrir o arquivo para leitura falhará até que o arquivo seja fechado.
- Gravação compartilhada: Permite a abertura subsequente do arquivo para gravação. Se esse sinalizador não for especificado, qualquer solicitação para abrir o arquivo para gravação falhará até que o arquivo seja fechado.
- Leitura/gravação compartilhada: Permite a abertura subsequente do arquivo para leitura ou gravação. Se esse sinalizador não for especificado, qualquer solicitação para abrir o arquivo para leitura ou gravação falhará até que o arquivo seja fechado.
- Exclusão compartilhada: Permite a exclusão subsequente de um arquivo. Se esse sinalizador não for especificado, qualquer solicitação para excluir o arquivo falhará até que o arquivo seja fechado.
Exemplos de arquivo aberto do cliente SMB
Considere os seguintes exemplos de arquivos abertos:
O arquivo é aberto sem violação de compartilhamento
- O cliente A abre o arquivo com
FileAccess.Read
e FileShare.Write (nega a leitura/exclusão subsequente enquanto está aberto). - Em seguida, o cliente B abre o arquivo com
FileAccess.Write
FileShare.Read (nega gravação/exclusão subsequente enquanto está aberto). - Resultado: Isso é permitido, pois não há conflito entre o acesso a arquivos e os modos de compartilhamento de arquivos.
- O cliente A abre o arquivo com
Violação de compartilhamento devido ao acesso a arquivos
- O cliente A abre o arquivo com
FileAccess.Write
e FileShare.Read (nega gravação/exclusão subsequente enquanto está aberto). - Em seguida, o cliente B abre o arquivo com
FileAccess.Write
FileShare.Write (nega a leitura/exclusão subsequente enquanto está aberto). - Resultado: O cliente B encontra uma violação de compartilhamento. O cliente especificou um acesso de arquivo negado pelo modo de compartilhamento especificado anteriormente pelo Cliente A.
- O cliente A abre o arquivo com
Violação de compartilhamento devido ao modo de compartilhamento
- O cliente A abre o arquivo com
FileAccess.Write
e FileShare.Write (nega a leitura/exclusão subsequente enquanto está aberto). - Em seguida, o cliente B abre o arquivo com
FileAccess.Write
FileShare.Read (nega gravação/exclusão subsequente enquanto está aberto). - Resultado: O cliente B encontra uma violação de compartilhamento. O cliente especificou um modo de compartilhamento que nega o acesso de gravação a um arquivo que ainda está aberto para acesso de gravação.
- O cliente A abre o arquivo com
Acesso ao arquivo FileREST
Quando você executa uma operação FileREST, essa operação deve respeitar o modo de compartilhamento especificado para qualquer arquivo aberto em um cliente SMB. Use o seguinte modo de acesso ao arquivo para determinar se a operação pode ser concluída:
Operação FileREST | Equivalente ao acesso a arquivos |
---|---|
Lista de Diretórios e Arquivos | N/D |
Criar Arquivo | Gravação, exclusão. |
Obter arquivo | Leitura. |
Definir as Propriedades do Arquivo | Gravação. |
Obter as Propriedades do Arquivo | N/D |
Definir metadados de arquivo | Gravação. |
Obter os Metadados do Arquivo | N/D |
Excluir arquivo | Excluir. |
Intervalo PUT | Gravação. |
Listar Intervalos | Leitura. |
Arquivo de concessão | Gravação, exclusão e leitura compartilhada durante a concessão. |
List Directories and Files, Get File Properties e Get File Metadata não operam no conteúdo do arquivo. Essas operações não exigem acesso de leitura ao arquivo (ou seja, essas operações são bem-sucedidas mesmo que um cliente SMB tenha o arquivo aberto para acesso de leitura exclusivo).
Veja a seguir exemplos de solicitações FileREST interagindo com os modos de compartilhamento SMB:
FileREST Obter violação de compartilhamento de arquivos
- O cliente SMB abre o arquivo com
FileAccess.Read
e FileShare.Write (nega a leitura/exclusão subsequente enquanto está aberto). - Em seguida, o cliente REST executa uma operação Obter Arquivo no arquivo (assim, usando
FileAccess.Read
conforme especificado na tabela anterior). -
Resultado: A solicitação do cliente REST falha com o código status 409 (Conflito) e o código
SharingViolation
de erro . O cliente SMB ainda tem o arquivo aberto e nega o acesso de Leitura/Exclusão.
- O cliente SMB abre o arquivo com
Violação de compartilhamento de intervalo put de FileREST
- O cliente SMB abre o arquivo com
FileAccess.Write
e FileShare.Read (nega gravação/exclusão subsequente enquanto está aberto). - Em seguida, o cliente REST executa uma operação Put Range no arquivo (assim, usando
FileAccess.Write
conforme especificado na tabela anterior). -
Resultado: A solicitação do cliente REST falha com o código status 409 (Conflito) e o código
SharingViolation
de erro . O cliente SMB ainda tem o arquivo aberto e nega o acesso de Gravação/Exclusão.
- O cliente SMB abre o arquivo com
A próxima seção inclui uma tabela abrangente de cenários de violação de compartilhamento de API FileREST.
Implicações do modo de compartilhamento de cliente SMB no FileREST
Dependendo do modo de compartilhamento especificado quando um cliente SMB abre um arquivo, é possível que FileREST retorne status código 409 (Conflito) com o código SharingViolation
de erro . A tabela a seguir lista vários cenários.
Modo de compartilhamento de arquivos do cliente SMB | Operações FileREST falhando com uma violação de compartilhamento |
---|---|
None (Deny Read, Write, Delete) |
As seguintes operações de leitura, gravação, concessão e exclusão no arquivo falharão:
|
Shared Read Deny Write, Delete) |
As seguintes operações de gravação, concessão e exclusão no arquivo falharão:
|
Shared Write (Deny Read, Delete) |
As seguintes operações de leitura, concessão e exclusão no arquivo falharão:
|
Shared Delete (Deny Read, Write) |
As seguintes operações de leitura, gravação e concessão no arquivo falharão:
|
Shared Read/Write (Deny Delete) |
As seguintes operações de concessão e exclusão no arquivo falharão:
|
Shared Read/Delete (Deny Write) |
As seguintes operações de gravação, concessão e exclusão no arquivo falharão:
|
Shared Write/Delete (Deny Read) |
As seguintes operações de leitura e concessão no arquivo falharão:
|
Shared Read/Write/Delete (Deny Nothing) |
Excluir Arquivo |
Arquivos do Azure retorna violações de compartilhamento somente quando os arquivos estão abertos em clientes SMB. Para que uma operação FileREST Delete File tenha êxito, não pode haver nenhum cliente SMB com identificadores abertos nesse arquivo. Para obter mais informações, consulte a operação Excluir Arquivo e Interação entre bloqueios oportunistas FileREST e SMB.
Implicações de bloqueio de arquivo SMB na API de Arquivo de Concessão FileREST
Dependendo das opções de acesso ao arquivo especificadas quando um cliente SMB abre um arquivo, é possível que a API de Arquivo de Concessão FileREST retorne status código 409 (Conflito), com o código SharingViolation
de erro . A tabela a seguir fornece mais informações:
Opção de acesso ao arquivo do cliente SMB | Adquirir concessão no arquivo sem uma concessão ativa com a API de Arquivo de Concessão |
---|---|
Nenhum | Tem êxito |
Ler | Tem êxito |
Gravar | Falha devido a SharingViolation |
Excluir | Falha devido a SharingViolation |
Leitura|Escrever | Falha devido a SharingViolation |
Leitura|Excluir | Falha devido a SharingViolation |
Gravação|Excluir | Falha devido a SharingViolation |
Leitura|Gravação|Excluir | Falha devido a SharingViolation |
Arquivos do Azure retorna violações de compartilhamento somente quando os arquivos estão abertos em clientes SMB. Observe que, para que uma operação arquivo de concessão FileREST tenha êxito, não pode haver clientes SMB com identificadores de Gravação ou Exclusão abertos nesse arquivo. Para obter mais informações, consulte a operação Arquivo de Concessão e Interação entre bloqueios oportunistas FileREST e SMB.
Implicações do Arquivo de Concessão fileREST para o bloqueio de arquivos SMB
Uma concessão em um arquivo fornece acesso exclusivo de gravação e exclusão ao arquivo. Quando um cliente SMB abre um arquivo, ele deve respeitar o bloqueio de qualquer arquivo concedido pela operação Arquivo de Concessão FileREST. Você pode usar a tabela a seguir para determinar se a operação de arquivo aberto SMB pode ser concluída:
Estado de concessão de arquivo FileREST | Operações SMB falhando com uma violação de compartilhamento |
---|---|
Concedida | Os clientes SMB que abrem o arquivo com o seguinte acesso ao arquivo falharão:
|
Disponível | Nenhum |
Desfeito | Nenhum |
Implicações de exclusão de SMB no FileREST
Quando um cliente SMB abre um arquivo para exclusão, ele marca o arquivo como exclusão pendente, até que todos os outros identificadores abertos do cliente SMB nesse arquivo sejam fechados. Enquanto um arquivo é marcado como exclusão pendente, qualquer operação FileREST nesse arquivo retornará status código 409 (Conflito), com o código SMBDeletePending
de erro . O código de status 404 (Não Encontrado) não é retornado, pois é possível que o cliente SMB remova o sinalizador de exclusão pendente antes de fechar o arquivo. Em outras palavras, o código de status 404 (Não encontrado) é esperado apenas se o arquivo tiver sido removido.
Embora um arquivo esteja em um estado de exclusão pendente de SMB, ele não será incluído nos List Files
resultados.
Observe também que o FileREST Delete File
e Delete Directory
as operações são confirmados atomicamente e não resultam em estado de exclusão pendente.
Implicações de atributo de arquivo em FileREST
Os clientes SMB podem ler e definir atributos de arquivo, incluindo:
- Arquivos
- Somente leitura
- Hidden
- Sistema
Se um arquivo ou diretório for marcado como somente leitura, qualquer operação FileREST que tentar gravar no arquivo falhará com status código 412 (Falha na pré-condição) e o código ReadOnlyAttribute
de erro . Essas operações incluem:
Create File
Set File Properties
Set File Metadata
Put Range
Esses atributos de arquivo não podem ser definidos ou lidos de clientes REST. Depois que um arquivo é tornado somente leitura, os clientes REST não podem gravar no arquivo até que o cliente SMB remova o atributo somente leitura.
Interação entre bloqueios oportunistas FileREST e SMB
O bloqueio oportunista (oplock) SMB é um mecanismo de cache que os clientes SMB solicitam para melhorar o desempenho e reduzir as transferências de rede. Um cliente SMB pode armazenar em cache o estado mais recente de um arquivo ou diretório específico. Existem vários tipos de bloqueios oportunistas, conhecidos como tipos de concessão SMB:
- Leitura (R): o cliente SMB pode ler do cache local.
- Gravação (W): o cliente SMB pode gravar localmente, sem a necessidade de liberar os dados de volta para o compartilhamento de arquivos do Azure.
- Identificador (H): o cliente SMB não precisa notificar imediatamente o compartilhamento de arquivos do Azure quando um identificador é fechado. Esse tipo de bloqueio é útil quando um aplicativo continua abrindo e fechando arquivos com o mesmo modo de acesso e compartilhamento.
Esses tipos de concessão são independentes do modo de acesso e compartilhamento especificado. Normalmente, um cliente SMB tenta adquirir todos os tipos de concessão sempre que abre um novo identificador em um arquivo, independentemente do modo de acesso e compartilhamento.
Dependendo da operação FileREST chamada, talvez seja necessário solicitar a interrupção de um bloqueio oportunista existente. No caso de um oplock de gravação, o cliente SMB deve liberar alterações armazenadas em cache no compartilhamento de arquivos do Azure. Veja abaixo alguns casos em que cada tipo de oplock deve ser interrompido:
Um oplock de Leitura (R) precisa ser interrompido sempre que uma operação de gravação é emitida, como
Put Range
.Um oplock de Gravação (W) precisa ser interrompido sempre que uma operação de leitura é emitida, como
Get File
.Um oplock de Identificador (H) precisa ser interrompido sempre que um cliente emite uma operação de exclusão. Arquivos do Azure requer que nenhum identificador possa ser aberto se uma operação de exclusão for bem-sucedida.
Os oplocks de identificador também são interrompidos quando uma operação FileREST enfrenta uma violação de compartilhamento com um identificador SMB existente. Isso ocorre para verificar se os identificadores ainda estão abertos por um aplicativo em execução nos clientes.
Quebrar o oplock pode exigir a liberação de alterações de cliente SMB armazenadas em cache, o que pode causar atrasos no tempo de resposta da operação. A liberação também pode fazer com que a operação falhe com o código status 408 (Tempo limite da solicitação) e o código ClientCacheFlushDelay
de erro .
As seções a seguir discutem cenários em que os oplocks são interrompidos.
Uma interrupção de oplock e a liberação do cliente SMB são necessárias e o cliente REST enfrenta um atraso
Considere o seguinte exemplo:
O cliente SMB abre um arquivo, adquire uma oplock RWH e grava dados localmente.
O cliente REST envia uma solicitação
Get File
.- O compartilhamento de arquivos do Azure interrompe o oplock de gravação (W), deixando o cliente com um oplock rh.
- O cliente SMB libera seus dados armazenados em cache no compartilhamento de arquivos do Azure e reconhece a interrupção do oplock.
- O compartilhamento de arquivos do Azure processa a solicitação
Get File
e responde de volta com os dados solicitados.
Neste exemplo, o cliente REST enfrenta atrasos. Essa situação é causada pela interrupção do oplock e pelo tempo gasto pelo cliente SMB para liberar seus dados no compartilhamento de arquivos do Azure.
As chamadas subsequentes para Get File
não sofrerão atrasos adicionais, pois o oplock de gravação (W) já foi interrompido.
Uma interrupção de oplock é necessária, mas o cliente REST não passa por um atraso
Considere o seguinte exemplo:
O cliente SMB adquiriu um oplock de RH.
O cliente REST envia uma solicitação
Put Range
.- O compartilhamento de arquivos do Azure envia uma solicitação de interrupção oplock para o cliente SMB e não aguarda uma resposta.
- O compartilhamento de arquivos do Azure processa a solicitação
Put Range
.
Neste exemplo, a quebra de oplock é necessária, mas a solicitação Put Range
não apresenta atrasos adicionais. Uma resposta não é necessária ao quebrar o oplock de leitura.
Arquivos do Azure comportamento
A tabela a seguir resume o comportamento de Arquivos do Azure para cada operação FileREST. Esse comportamento é baseado no estado oplock do cliente SMB que já adquiriu um identificador no mesmo arquivo. Além disso, o comportamento pressupõe que o SMB manipule o acesso e o compartilhamento não entrem em conflito com a operação FileREST.
Se houver um conflito, o oplock de identificador também é interrompido para garantir que o identificador ainda esteja aberto no cliente. No caso de uma quebra de bloqueio, Arquivos do Azure deve aguardar uma confirmação de que a interrupção foi bem-sucedida. No caso de uma quebra de oplock sem bloqueio, Arquivos do Azure não precisa esperar.
Operação FileREST | Tipos oplock atuais | Interrupção do Oplock executada | Oplock resultante |
---|---|---|---|
Obter arquivo | RWH | Sim (bloqueio) | RH |
Obter arquivo | RH | Não | RH |
Obter arquivo | RW | Sim (bloqueio) | R |
Obter propriedades do arquivo | RWH | Sim (bloqueio) | RH |
Obter propriedades do arquivo | RH | Não | RH |
Obter propriedades do arquivo | RW | Sim (bloqueio) | R |
Listar intervalos | RWH | Sim (bloqueio) | RH |
Listar intervalos | RH | Não | RH |
Listar intervalos | RW | Sim (bloqueio) | R |
Obter Metadados do Arquivo | RWH | Sim (bloqueio) | RH |
Obter Metadados do Arquivo | RH | Não | RH |
Obter Metadados do Arquivo | RW | Sim (bloqueio) | R |
Listar arquivos | RWH | Não | RWH |
Listar arquivos | RH | Não | RH |
Listar arquivos | RW | Não | RW |
Intervalo PUT | RWH | Sim (bloqueio) | Nenhum |
Intervalo PUT | RH | Sim (sem bloqueio) | Nenhum |
Intervalo PUT | RW | Sim (bloqueio) | Nenhum |
Definir propriedades de arquivo | RWH | Sim (bloqueio) | Nenhum |
Definir propriedades de arquivo | RH | Sim (sem bloqueio) | Nenhum |
Definir propriedades de arquivo | RW | Sim (bloqueio) | Nenhum |
Definir metadados de arquivo | RWH | Sim (bloqueio) | Nenhum |
Definir metadados de arquivo | RH | Sim (sem bloqueio) | Nenhum |
Definir metadados de arquivo | RW | Sim (bloqueio) | Nenhum |
Excluir Arquivo | RWH | Sim (bloqueio) | RW |
Excluir Arquivo | RH | Sim (bloqueio) | R |
Excluir Arquivo | RW | Não | RW |
No caso em que uma quebra de oplock de bloqueio é necessária, em determinadas condições, a operação FileREST falha. Se a interrupção não for bem-sucedida dentro do tempo limite de solicitação especificado ou dentro de 30 segundos, o que for concluído primeiro, o serviço retornará status código 408 (Tempo limite da solicitação) e o código ClientCacheFlushDelay
de erro .
A Delete File
solicitação também requer a quebra da concessão do identificador oplock (H). Quebrar o identificador garante que não haja identificadores de arquivo ainda abertos por um aplicativo cliente SMB quando um cliente REST chama Delete File
. Se houver uma violação de compartilhamento, a solicitação falhará com status código 409 (Conflito) e o código SharingViolation
de erro .