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.
  • 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.
  • 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.

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 SharingViolationde erro . O cliente SMB ainda tem o arquivo aberto e nega o acesso de Leitura/Exclusão.
  • 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 SharingViolationde erro . O cliente SMB ainda tem o arquivo aberto e nega o acesso de Gravação/Exclusão.

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 SharingViolationde 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:

  • Criar arquivo
  • Obter arquivo
  • Definir propriedades de arquivo
  • Definir metadados de arquivo
  • Excluir Arquivo
  • Intervalo PUT
  • Listar intervalos
  • Arquivo de concessão
Shared Read

Deny Write, Delete)
As seguintes operações de gravação, concessão e exclusão no arquivo falharão:

  • Criar arquivo
  • Definir propriedades de arquivo
  • Definir metadados de arquivo
  • Excluir Arquivo
  • Intervalo PUT
  • Arquivo de concessão
Shared Write

(Deny Read, Delete)
As seguintes operações de leitura, concessão e exclusão no arquivo falharão:

  • Criar arquivo
  • Obter arquivo
  • Excluir Arquivo
  • Listar intervalos
  • Arquivo de concessão
Shared Delete

(Deny Read, Write)
As seguintes operações de leitura, gravação e concessão no arquivo falharão:

  • Criar arquivo
  • Obter arquivo
  • Definir propriedades de arquivo
  • Definir metadados de arquivo
  • Intervalo PUT
  • Listar intervalos
  • Excluir Arquivo
  • Arquivo de concessão
Shared Read/Write

(Deny Delete)
As seguintes operações de concessão e exclusão no arquivo falharão:

  • Criar arquivo
  • Excluir Arquivo
  • Arquivo de concessão
Shared Read/Delete

(Deny Write)
As seguintes operações de gravação, concessão e exclusão no arquivo falharão:

  • Criar arquivo
  • Definir propriedades de arquivo
  • Definir metadados de arquivo
  • Intervalo PUT
  • Excluir Arquivo
  • Arquivo de concessão
Shared Write/Delete

(Deny Read)
As seguintes operações de leitura e concessão no arquivo falharão:

  • Obter arquivo
  • Listar intervalos
  • Excluir Arquivo
  • Arquivo de concessã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 SharingViolationde 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:

  • FileAccess.Write
  • FileAccess.Delete
  • FileAccess.Read|FileAccess.Write
  • FileAccess.Write|FileAccess.Delete
  • FileAccess.Read|FileAccess.Write|FileAccess.Delete
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 SMBDeletePendingde 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 ReadOnlyAttributede 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 ClientCacheFlushDelayde 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:

  1. O cliente SMB abre um arquivo, adquire uma oplock RWH e grava dados localmente.

  2. 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:

  1. O cliente SMB adquiriu um oplock de RH.

  2. 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 ClientCacheFlushDelayde 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 SharingViolationde erro .

Confira também

conceitos Arquivos do Azure