Gestire i blocchi dei file
File di Azure fornisce l'accesso alle condivisioni file cloud tramite i protocolli seguenti:
- Server Message Block (SMB)
- File system di rete (NFS)
- FileREST (HTTPS)
Questo argomento descrive come gestire le interazioni di blocco dei file tra SMB e FileREST. Le condivisioni file NFS presentano semantiche di blocco diverse e supportano un subset delle API FileREST. Questo argomento non è applicabile per le condivisioni file NFS.
Blocco file SMB
I client SMB che montano condivisioni file possono usare meccanismi di blocco del file system per gestire l'accesso ai file condivisi. Queste includono:
- Condivisione completa dell'accesso ai file per la lettura, la scrittura e l'eliminazione.
- Blocchi di intervalli di byte per gestire l'accesso in lettura e scrittura alle aree all'interno di un singolo file.
Quando un client SMB apre un file, specifica sia l'accesso ai file che la modalità di condivisione. Le opzioni di accesso ai file seguenti vengono in genere usate dai client SMB, anche se tutte le combinazioni sono consentite:
- Nessuno: Apre un file solo per l'accesso all'attributo di query.
- Leggere: Apre un file solo per l'accesso in lettura.
- Scrivere: Apre un file solo per l'accesso in scrittura.
- Lettura/scrittura: Apre un file con autorizzazioni di lettura/scrittura.
- Elimina: Apre un file solo per eliminare l'accesso.
I client SMB usano in genere le modalità di condivisione file seguenti:
- Nessuno: Rifiuta la condivisione del file corrente. Qualsiasi richiesta di apertura del file con accesso in lettura, scrittura o eliminazione avrà esito negativo fino alla chiusura del file.
- Lettura condivisa: Consente l'apertura successiva del file per la lettura. Se questo flag non è specificato, qualsiasi richiesta per aprire il file per la lettura avrà esito negativo, fino a quando il file non viene chiuso.
- Scrittura condivisa: Consente l'apertura successiva del file per la scrittura. Se questo flag non è specificato, qualsiasi richiesta per aprire il file per la scrittura avrà esito negativo, fino a quando il file non viene chiuso.
- Lettura/scrittura condivisa: Consente l'apertura successiva del file per la lettura o la scrittura. Se questo flag non è specificato, qualsiasi richiesta per aprire il file per la lettura o la scrittura avrà esito negativo, fino a quando il file non viene chiuso.
- Eliminazione condivisa: Consente l'eliminazione successiva di un file. Se questo flag non è specificato, qualsiasi richiesta di eliminazione del file avrà esito negativo finché il file non viene chiuso.
Esempi di file aperti dal client SMB
Valutare gli esempi di apertura file seguenti:
Il file viene aperto senza violazione di condivisione
- Client A apre il file con
FileAccess.Read
e FileShare.Write (nega la successiva lettura/eliminazione durante l'apertura). - Il client B apre quindi il file con
FileAccess.Write
FileShare.Read (nega la scrittura/eliminazione successiva durante l'apertura). - Risultato: Ciò è consentito, perché non esiste alcun conflitto tra le modalità di accesso ai file e condivisione file.
- Client A apre il file con
Violazione della condivisione a causa dell'accesso ai file
- Client A apre il file con
FileAccess.Write
e FileShare.Read (nega la scrittura/eliminazione successiva durante l'apertura). - Il client B apre quindi il file con
FileAccess.Write
FileShare.Write (nega la lettura/eliminazione successiva durante l'apertura). - Risultato: Il client B rileva una violazione della condivisione. Il client ha specificato un accesso ai file negato dalla modalità di condivisione specificata in precedenza da Client A.
- Client A apre il file con
Violazione della condivisione a causa della modalità di condivisione
- Client A apre il file con
FileAccess.Write
e FileShare.Write (nega la successiva lettura/eliminazione durante l'apertura). - Il client B apre quindi il file con
FileAccess.Write
FileShare.Read (nega la scrittura/eliminazione successiva durante l'apertura). - Risultato: Il client B rileva una violazione della condivisione. Il client ha specificato una modalità di condivisione che nega l'accesso in scrittura a un file ancora aperto per l'accesso in scrittura.
- Client A apre il file con
Accesso fileREST
Quando si esegue un'operazione FileREST, questa operazione deve rispettare la modalità di condivisione specificata per qualsiasi file aperto in un client SMB. Usare la modalità di accesso ai file seguente per determinare se l'operazione può essere completata:
Operazione FileREST | Equivalente all'accesso ai file |
---|---|
Elenca directory e file | N/D. |
Creare file | Scrittura, eliminazione. |
Get File | Lettura. |
Imposta proprietà file | Scrittura. |
Ottenere proprietà file | N/D. |
Set File Metadata | Scrittura. |
Recupera metadati di file | N/D. |
Delete File | Delete. |
Put Range | Scrittura. |
List Ranges | Lettura. |
Lease File | Scrittura, eliminazione e lettura condivisa per la durata del lease. |
Elencare directory e file, ottenere proprietà file e ottenere metadati file non funzionano sul contenuto del file. Queste operazioni non richiedono l'accesso in lettura al file, ovvero queste operazioni hanno esito positivo anche se un client SMB ha il file aperto per l'accesso in lettura esclusivo.
Di seguito sono riportati esempi di richieste FileREST che interagiscono con le modalità di condivisione SMB:
Violazione di condivisione fileREST
- Il client SMB apre il file con
FileAccess.Read
e FileShare.Write (nega la successiva lettura/eliminazione durante l'apertura). - Il client REST esegue quindi un'operazione Get File nel file ( usando
FileAccess.Read
così come specificato nella tabella precedente). -
Risultato: La richiesta del client REST ha esito negativo con il codice di stato 409 (Conflitto) e il codice
SharingViolation
di errore . Il client SMB ha ancora il file aperto e nega l'accesso di lettura/eliminazione.
- Il client SMB apre il file con
Violazione di condivisione dell'intervallo fileREST Put
- Il client SMB apre il file con
FileAccess.Write
e FileShare.Read (nega la successiva scrittura/eliminazione durante l'apertura). - Il client REST esegue quindi un'operazione Put Range nel file (usando
FileAccess.Write
così come specificato nella tabella precedente). -
Risultato: La richiesta del client REST ha esito negativo con il codice di stato 409 (Conflitto) e il codice
SharingViolation
di errore . Il client SMB ha ancora il file aperto e nega l'accesso Write/Delete.
- Il client SMB apre il file con
La sezione successiva include una tabella completa di scenari di violazione della condivisione api FileREST.
Implicazioni della modalità di condivisione client SMB su FileREST
A seconda della modalità di condivisione specificata quando un client SMB apre un file, è possibile che FileREST restituisca codice di stato 409 (conflitto) con codice SharingViolation
di errore . Nella tabella seguente sono elencati diversi scenari.
Modalità di condivisione file client SMB | Operazioni fileREST non riuscite con una violazione di condivisione |
---|---|
None (Deny Read, Write, Delete) |
Le operazioni di lettura, scrittura, lease ed eliminazione seguenti nel file avranno esito negativo:
|
Shared Read Deny Write, Delete) |
Le operazioni di scrittura, lease ed eliminazione seguenti sul file avranno esito negativo:
|
Shared Write (Deny Read, Delete) |
Le operazioni di lettura, lease ed eliminazione seguenti sul file avranno esito negativo:
|
Shared Delete (Deny Read, Write) |
Le operazioni di lettura, scrittura e lease seguenti sul file avranno esito negativo:
|
Shared Read/Write (Deny Delete) |
Le operazioni di lease ed eliminazione seguenti sul file avranno esito negativo:
|
Shared Read/Delete (Deny Write) |
Le operazioni di scrittura, lease ed eliminazione seguenti sul file avranno esito negativo:
|
Shared Write/Delete (Deny Read) |
Le operazioni di lettura e lease seguenti sul file avranno esito negativo:
|
Shared Read/Write/Delete (Deny Nothing) |
Elimina file |
File di Azure restituisce violazioni di condivisione solo quando i file sono aperti nei client SMB. Affinché un'operazione di eliminazione file FileREST abbia esito positivo, non possono essere presenti client SMB con handle aperti su tale file. Per altre informazioni, vedere Delete File operation and Interaction between FileREST and SMB opportunistic locks.For more information, see the Delete File operation and Interaction between FileREST and SMB opportunistic locks.
Implicazioni per il blocco dei file SMB nell'API file di lease FileREST
A seconda delle opzioni di accesso ai file specificate quando un client SMB apre un file, è possibile che l'API file di lease FileREST restituisca il codice di stato 409 (conflitto), con codice SharingViolation
di errore . Nella tabella seguente vengono fornite ulteriori informazioni:
Opzione di accesso ai file client SMB | Acquisire il lease sul file senza un lease attivo con l'API file di lease |
---|---|
Nessuno | Riesce |
Read | Riesce |
Write | Non riesce a causa di SharingViolation |
Elimina | Non riesce a causa di SharingViolation |
Lettura|Scrivere | Non riesce a causa di SharingViolation |
Lettura|Elimina | Non riesce a causa di SharingViolation |
Scrittura |Elimina | Non riesce a causa di SharingViolation |
Lettura|Scrittura |Elimina | Non riesce a causa di SharingViolation |
File di Azure restituisce violazioni di condivisione solo quando i file sono aperti nei client SMB. Si noti che per l'esito positivo di un'operazione file di lease FileREST non possono essere presenti client SMB con handle di scrittura o eliminazione aperti su tale file. Per altre informazioni, vedere l'operazione lease file e l'interazione tra blocchi opportunistici FileREST e SMB.
Implicazioni del file di lease FileREST per il blocco dei file SMB
Un lease in un file fornisce accesso esclusivo in scrittura ed eliminazione al file. Quando un client SMB apre un file, deve rispettare il blocco per qualsiasi file in lease dall'operazione FileREST Lease File. È possibile utilizzare la tabella seguente per determinare se è possibile completare l'operazione SMB open file:
Stato di lease del file FILEREST | Le operazioni SMB hanno esito negativo con una violazione di condivisione |
---|---|
Con lease | I client SMB che aprono il file con l'accesso file seguente avranno esito negativo:
|
Disponibile | Nessuno |
Rotto | Nessuno |
Implicazioni per l'eliminazione di SMB in FileREST
Quando un client SMB apre un file per l'eliminazione, contrassegna il file come eliminazione in sospeso, fino a quando non vengono chiusi tutti gli altri handle di apertura del client SMB in tale file. Mentre un file è contrassegnato come eliminazione in sospeso, qualsiasi operazione FileREST su tale file restituirà il codice di stato 409 (Conflitto), con codice SMBDeletePending
di errore . Il codice di stato 404 (Non trovato) non viene restituito, perché è possibile che il client SMB rimuova il flag di eliminazione in sospeso prima di chiudere il file. In altre parole, il codice di stato 404 (Non trovato) è previsto solo dopo la rimozione del file.
Mentre un file si trova in uno stato di eliminazione in sospeso SMB, non verrà incluso nei List Files
risultati.
Si noti anche che il commit delle operazioni e Delete Directory
FileREST Delete File
viene eseguito in modo atomico e non comporta lo stato di eliminazione in sospeso.
Implicazioni degli attributi di file in FileREST
Ai client SMB è consentito leggere e impostare gli attributi dei file, ad esempio:
- Archiviazione
- Sola lettura
- Nascosto
- Sistema
Se un file o una directory è contrassegnata come di sola lettura, qualsiasi operazione FileREST che tenta di scrivere nel file avrà esito negativo con codice di stato 412 (Precondizione non riuscita) e codice ReadOnlyAttribute
errore . tra cui:
Create File
Set File Properties
Set File Metadata
Put Range
Questi attributi di file non possono essere impostati o letti dai client REST. Dopo che un file viene reso di sola lettura, i client REST non sono in grado di scrivere nel file finché il client SMB non rimuove l'attributo di sola lettura.
Interazione tra blocchi opportunistici FileREST e SMB
Il blocco opportunistico SMB (oplock) è un meccanismo di memorizzazione nella cache richiesto dai client SMB per migliorare le prestazioni e ridurre i trasferimenti di rete. Un client SMB può memorizzare nella cache lo stato più recente di un file o di una directory specifica. Esistono più tipi di blocco opportunistico, noti come tipi di lease SMB:
- Lettura (R): il client SMB può leggere dalla cache locale.
- Scrittura (W): il client SMB può scrivere in locale, senza la necessità di scaricare nuovamente i dati nella condivisione file di Azure.
- Handle (H): il client SMB non è necessario per inviare immediatamente una notifica alla condivisione file di Azure quando un handle viene chiuso. Questo tipo di blocco è utile quando un'applicazione continua ad aprire e chiudere i file con la stessa modalità di accesso e condivisione.
Questi tipi di lease sono indipendenti dalla modalità di accesso e condivisione specificata. In genere, un client SMB tenta di acquisire tutti i tipi di lease ogni volta che apre un nuovo handle in un file, indipendentemente dalla modalità di accesso e condivisione.
A seconda dell'operazione FileREST chiamata, potrebbe essere necessario richiedere di interrompere un blocco opportunistico esistente. Nel caso di un oplock di scrittura, il client SMB deve scaricare le modifiche memorizzate nella cache nella condivisione file di Azure. Di seguito sono riportati alcuni casi in cui è necessario interrompere ciascun tipo di blocco opportunistico:
Un oplock di lettura (R) deve essere interrotto ogni volta che viene eseguita un'operazione di scrittura, ad esempio
Put Range
.Un oplock write (W) deve essere interrotto ogni volta che viene eseguita un'operazione di lettura, ad esempio
Get File
.Un oplock handle (H) deve essere interrotto ogni volta che un client genera un'operazione di eliminazione. File di Azure richiede che nessun handle possa essere aperto se un'operazione di eliminazione ha esito positivo.
Gli oplock di handle vengono interrotti anche quando un'operazione FileREST presenta una violazione di condivisione con un handle SMB esistente. Ciò si verifica per verificare che gli handle siano ancora aperti da un'applicazione in esecuzione nei client.
L'interruzione dell'oplock potrebbe richiedere lo scaricamento delle modifiche del client SMB memorizzate nella cache, che possono causare ritardi nel tempo di risposta dell'operazione. Lo scaricamento potrebbe anche causare l'esito negativo dell'operazione con il codice di stato 408 (timeout della richiesta) e il codice ClientCacheFlushDelay
di errore .
Le sezioni seguenti illustrano gli scenari in cui gli oplock vengono interrotti.
Sono necessari un'interruzione di oplock e lo scaricamento del client SMB e il client REST riscontra un ritardo
Prendere in considerazione gli esempi seguenti:
Il client SMB apre un file, acquisisce il blocco opportunistico RWH e scrive i dati localmente.
Il client REST invia una
Get File
richiesta.- La condivisione file di Azure interrompe l'oplock di scrittura (W), lasciando il client con un oplock RH.
- Il client SMB scarica i dati memorizzati nella cache nella condivisione file di Azure e riconosce l'interruzione di oplock.
- La condivisione file di Azure elabora la
Get File
richiesta e risponde con i dati richiesti.
In questo esempio il client REST riscontra ritardi. Questa situazione è causata dall'interruzione di blocco e dal tempo impiegato dal client SMB per scaricare i dati nella condivisione file di Azure.
Le chiamate successive a Get File
non riscontrano ritardi aggiuntivi, perché l'oplock di scrittura (W) è già stato interrotto.
È richiesta l'interruzione di un blocco opportunistico, ma il client REST non riscontrerà ritardi
Prendere in considerazione gli esempi seguenti:
Il client SMB ha acquisito un blocco opportunistico di lettura e handle (LH).
Il client REST invia una
Put Range
richiesta.- La condivisione file di Azure invia una richiesta di interruzione di blocco al client SMB e non attende una risposta.
- La condivisione file di Azure elabora la
Put Range
richiesta.
In questo esempio, l'interruzione di oplock è obbligatoria, ma la Put Range
richiesta non riscontra ritardi aggiuntivi. Una risposta non è necessaria quando si interrompe l'oplock di lettura.
comportamento File di Azure
Nella tabella seguente viene riepilogato il comportamento di File di Azure per ogni operazione FileREST. Questo comportamento si basa sullo stato di oplock del client SMB che ha già acquisito un handle nello stesso file. Inoltre, il comportamento presuppone che l'SMB gestisca l'accesso e la condivisione non siano in conflitto con l'operazione FileREST.
Se viene rilevato un conflitto, viene interrotto anche il blocco opportunistico dell'handle per garantire che l'handle sia ancora aperto nel client. Nel caso di un'interruzione di blocco, File di Azure deve attendere che l'interruzione sia stata completata correttamente. Nel caso di un'interruzione di oplock non blocca, File di Azure non deve attendere.
Operazione FileREST | Tipi di oplock correnti | Interruzione oplock eseguita | Blocco operativo risultante |
---|---|---|---|
Get File | LSH | Sì (di blocco) | LH |
Get File | LH | No | LH |
Get File | LS | Sì (di blocco) | R |
Get File Properties | LSH | Sì (di blocco) | LH |
Get File Properties | LH | No | LH |
Get File Properties | LS | Sì (di blocco) | R |
List Ranges | LSH | Sì (di blocco) | LH |
List Ranges | LH | No | LH |
List Ranges | LS | Sì (di blocco) | R |
Recupera metadati di file | LSH | Sì (di blocco) | LH |
Recupera metadati di file | LH | No | LH |
Recupera metadati di file | LS | Sì (di blocco) | R |
Elencare file | LSH | No | LSH |
Elencare file | LH | No | LH |
Elencare file | LS | No | LS |
Put Range | LSH | Sì (di blocco) | Nessuno |
Put Range | LH | Sì (non di blocco) | Nessuno |
Put Range | LS | Sì (di blocco) | Nessuno |
Set File Properties | LSH | Sì (di blocco) | Nessuno |
Set File Properties | LH | Sì (non di blocco) | Nessuno |
Set File Properties | LS | Sì (di blocco) | Nessuno |
Set File Metadata | LSH | Sì (di blocco) | Nessuno |
Set File Metadata | LH | Sì (non di blocco) | Nessuno |
Set File Metadata | LS | Sì (di blocco) | Nessuno |
Elimina file | LSH | Sì (di blocco) | LS |
Elimina file | LH | Sì (di blocco) | R |
Elimina file | LS | No | LS |
Nel caso in cui sia necessaria un'interruzione di blocco, in determinate condizioni, l'operazione FileREST ha esito negativo. Se l'interruzione non riesce entro il timeout della richiesta specificata o entro 30 secondi, il servizio restituisce prima il codice di stato 408 (Timeout richiesta) e il codice ClientCacheFlushDelay
di errore .
La Delete File
richiesta richiede anche l'interruzione del lease di handle oplock (H). L'interruzione dell'handle garantisce che non ci siano handle di file ancora aperti da un'applicazione client SMB quando un client REST chiama Delete File
. Se si verifica una violazione della condivisione, la richiesta ha esito negativo con il codice di stato 409 (Conflitto) e il codice SharingViolation
di errore .