Partilhar via


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

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

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

  • Criar Ficheiro
  • Obter Ficheiro
  • Definir Propriedades do Ficheiro
  • Definir Metadados de Ficheiro
  • Eliminar Ficheiro
  • Colocar Intervalo
  • Intervalos de Lista
  • Ficheiro de Concessão
Shared Read

Deny Write, Delete)
As seguintes operações de escrita, concessão e eliminação no ficheiro falharão:

  • Criar Ficheiro
  • Definir Propriedades do Ficheiro
  • Definir Metadados de Ficheiro
  • Eliminar Ficheiro
  • Colocar Intervalo
  • Ficheiro de Concessão
Shared Write

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

  • Criar Ficheiro
  • Obter Ficheiro
  • Eliminar Ficheiro
  • Intervalos de Lista
  • Ficheiro de Concessão
Shared Delete

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

  • Criar Ficheiro
  • Obter Ficheiro
  • Definir Propriedades do Ficheiro
  • Definir Metadados de Ficheiro
  • Colocar Intervalo
  • Intervalos de Lista
  • Eliminar Ficheiro
  • Ficheiro de Concessão
Shared Read/Write

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

  • Criar Ficheiro
  • Eliminar Ficheiro
  • Ficheiro de Concessão
Shared Read/Delete

(Deny Write)
As seguintes operações de escrita, concessão e eliminação no ficheiro falharão:

  • Criar Ficheiro
  • Definir Propriedades do Ficheiro
  • Definir Metadados de Ficheiro
  • Colocar Intervalo
  • Eliminar Ficheiro
  • Ficheiro de Concessão
Shared Write/Delete

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

  • Obter Ficheiro
  • Intervalos de Lista
  • Eliminar Ficheiro
  • Ficheiro de Concessã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 SharingViolationde 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:

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

  1. O cliente SMB abre um ficheiro, adquire um oplock RWH e escreve dados localmente.

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

  1. O cliente SMB adquiriu um oplock RH.

  2. 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 ClientCacheFlushDelayde 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 SharingViolationerro .

Ver também

conceitos de Ficheiros do Azure