次の方法で共有


ファイル ロックの管理

Azure Filesは、次のプロトコルを使用してクラウド ファイル共有へのアクセスを提供します。

  • サーバー メッセージ ブロック (SMB)
  • Network File System (NFS)
  • FileREST (HTTPS)

このトピックでは、SMB と FileREST の間のファイル ロック操作を管理する方法について説明します。 NFS ファイル共有には異なるロック セマンティクスがあり、FileREST API のサブセットがサポートされています。 このトピックは、NFS ファイル共有には適用されません。

SMB ファイルのロック

ファイル共有をマウントする SMB クライアントは、ファイル システムのロック メカニズムを使用して、共有ファイルへのアクセスを管理できます。 これには以下が含まれます。

  • 読み取り、書き込み、および削除を行うために共有する全体的なファイル アクセス権。
  • 単一ファイル内の領域への読み取りおよび書き込みアクセスを管理するバイト範囲ロック。

SMB クライアントは、ファイルを開くと、ファイル アクセスと共有モードの両方を指定します。 SMB クライアントでは通常、次のファイル アクセス オプションが使用されますが、すべての組み合わせが許可されます。

  • なし: クエリ属性アクセス専用のファイルを開きます。
  • 読む: 読み取りアクセス専用のファイルを開きます。
  • 書き込み: 書き込みアクセス専用のファイルを開きます。
  • 読み取り/書き込み: 読み取り/書き込みアクセス許可を持つファイルを開きます。
  • 削除: 削除アクセス専用のファイルを開きます。

SMB クライアントは、通常、次のファイル共有モードを使用します。

  • なし: 現在のファイルの共有を拒否します。 ファイルが閉じられるまで、読み取り、書き込み、または削除のアクセス権を持つファイルを開く要求は失敗します。
  • 共有読み取り: 読み取り用のファイルの後続の開きを許可します。 このフラグが指定されていない場合、ファイルが閉じられるまで、読み取り用にファイルを開く要求は失敗します。
  • 共有書き込み: ファイルを書き込むための後続のオープンを許可します。 このフラグが指定されていない場合、ファイルが閉じられるまで、書き込みのためにファイルを開く要求は失敗します。
  • 共有の読み取り/書き込み: 読み取りまたは書き込みのためにファイルを後続で開きます。 このフラグが指定されていない場合、ファイルを閉じるまで、読み取りまたは書き込みのためにファイルを開く要求は失敗します。
  • 共有削除: ファイルの後続の削除を許可します。 このフラグが指定されていない場合、ファイルが閉じられるまで、ファイルを削除する要求は失敗します。

SMB クライアントでファイルを開く例

以下に示すファイルを開く例について検討します。

  • 共有違反なしでファイルが開く

    • クライアント A は、 および FileShare.Write を使用して FileAccess.Read ファイルを開きます (開いている間、後続の読み取り/削除は拒否されます)。
    • 次に、クライアント B は FileShare.Read でファイル FileAccess.Write を開きます (開いている間は後続の書き込み/削除を拒否します)。
    • 結果: ファイル アクセス モードとファイル共有モードの間に競合がないため、これは許可されます。
  • ファイル アクセスによる共有違反

    • クライアント A は、 および FileShare.Read を使用して FileAccess.Write ファイルを開きます (開いている間、後続の書き込み/削除は拒否されます)。
    • 次に、クライアント B は FileShare.Write で FileAccess.Write ファイルを開きます (開いている間、後続の読み取り/削除は拒否されます)。
    • 結果: クライアント B で共有違反が発生しました。 クライアントは、以前にクライアント A によって指定された共有モードによって拒否されるファイル アクセスを指定しました。
  • 共有モードによる共有違反

    • クライアント A は、 および FileShare.Write を使用して FileAccess.Write ファイルを開きます (開いている間、後続の読み取り/削除は拒否されます)。
    • 次に、クライアント B は FileShare.Read でファイル FileAccess.Write を開きます (開いている間は後続の書き込み/削除を拒否します)。
    • 結果: クライアント B で共有違反が発生しました。 クライアントは、書き込みアクセスのために開いているファイルへの書き込みアクセスを拒否する共有モードを指定しました。

FileREST ファイル へのアクセス

FileREST 操作を実行する場合、この操作は SMB クライアントで開いているファイルに対して指定された共有モードを考慮する必要があります。 次のファイル アクセス モードを使用して、操作を完了できるかどうかを判断します。

FileREST 操作 同等のファイル アクセス
ディレクトリとファイルの一覧表示 該当なし。
ファイルを作成する 書き込み、削除。
Get File 読み取り。
ファイル プロパティの設定 書き込み。
ファイル プロパティの取得 該当なし。
Set File Metadata 書き込み。
ファイル メタデータの取得 該当なし。
ファイルの削除 削除
Put Range 書き込み。
範囲の一覧表示 読み取り。
リース ファイル リース期間中の書き込み、削除、および共有読み取り。

ディレクトリとファイルの一覧表示ファイルのプロパティの取得およびファイル メタデータの取得 は、ファイル コンテンツに対して機能しません。 これらの操作では、ファイルへの読み取りアクセスは必要ありません (つまり、SMB クライアントが排他読み取りアクセス用にファイルを開いている場合でも、これらの操作は成功します)。

SMB 共有モードと対話する FileREST 要求の例を次に示します。

  • FileREST ファイル共有違反の取得

    • SMB クライアントは、 と FileShare.Write を使用して FileAccess.Read ファイルを開きます (開いている間、後続の読み取り/削除は拒否されます)。
    • その後、REST クライアントは、ファイルに対して ファイルの取得 操作を実行します (これにより、前の表で指定したように を使用 FileAccess.Read します)。
    • 結果: REST クライアントの要求は、状態コード 409 (競合) とエラー コード SharingViolationで失敗します。 SMB クライアントは引き続きファイルを開き、読み取り/削除アクセスを拒否します。
  • FileREST Put Range 共有違反

    • SMB クライアントは、 と FileShare.Read を使用して FileAccess.Write ファイルを開きます (開いている間、後続の書き込み/削除は拒否されます)。
    • 次に、REST クライアントは、ファイルに対して Put Range 操作を実行します (これにより、前の表で指定したように を使用 FileAccess.Write します)。
    • 結果: REST クライアントの要求は、状態コード 409 (競合) とエラー コード SharingViolationで失敗します。 SMB クライアントは引き続きファイルを開き、書き込み/削除アクセスを拒否します。

次のセクションでは、FileREST API 共有違反シナリオの包括的な表を示します。

FILEREST に対する SMB クライアント共有モードの影響

SMB クライアントがファイルを開くときに指定する共有モードによっては、FileREST がエラー SharingViolationコード と共に状態コード 409 (競合) を返す可能性があります。 次の表に、いくつかのシナリオを示します。

SMB クライアント ファイル共有モード ファイルREST 操作が共有違反で失敗する
None

(Deny Read, Write, Delete)
ファイルに対する次の読み取り、書き込み、リース、および削除操作は失敗します。

  • CreateFile
  • Get File
  • Set File Properties
  • Set File Metadata
  • ファイルの削除
  • Put Range
  • List Ranges
  • リース ファイル
Shared Read

Deny Write, Delete)
ファイルに対する次の書き込み、リース、および削除操作は失敗します。

  • CreateFile
  • Set File Properties
  • Set File Metadata
  • ファイルの削除
  • Put Range
  • リース ファイル
Shared Write

(Deny Read, Delete)
ファイルに対する次の読み取り、リース、および削除操作は失敗します。

  • CreateFile
  • Get File
  • ファイルの削除
  • List Ranges
  • リース ファイル
Shared Delete

(Deny Read, Write)
ファイルに対する次の読み取り、書き込み、およびリース操作は失敗します。

  • CreateFile
  • Get File
  • Set File Properties
  • Set File Metadata
  • Put Range
  • List Ranges
  • ファイルの削除
  • リース ファイル
Shared Read/Write

(Deny Delete)
ファイルに対する次のリース操作と削除操作は失敗します。

  • CreateFile
  • ファイルの削除
  • リース ファイル
Shared Read/Delete

(Deny Write)
ファイルに対する次の書き込み、リース、および削除操作は失敗します。

  • CreateFile
  • Set File Properties
  • Set File Metadata
  • Put Range
  • ファイルの削除
  • リース ファイル
Shared Write/Delete

(Deny Read)
ファイルに対する次の読み取りとリース操作は失敗します。

  • Get File
  • List Ranges
  • ファイルの削除
  • リース ファイル
Shared Read/Write/Delete

(Deny Nothing)
ファイルの削除

Azure Filesは、SMB クライアントでファイルが開かれている場合にのみ、共有違反を返します。 FileREST のファイルの削除 操作を成功させるために、そのファイルに対してハンドルを開いた SMB クライアントを使用することはできません。 詳細については、「 ファイルの削除 操作」および 「FileREST と SMB の日和見ロック間の相互作用」を参照してください。

FILEREST リース ファイル API に対する SMB ファイルロックの影響

SMB クライアントがファイルを開くときに指定するファイル アクセス オプションに応じて、FileREST リース ファイル API がエラー コード で状態コード 409 (競合) SharingViolationを返す可能性があります。 次の表に、詳細情報を示します。

SMB クライアント ファイル アクセス オプション リース ファイル API を使用して、アクティブなリースなしでファイルのリースを取得する
なし 成功
Read 成功
Write が原因で失敗する SharingViolation
削除 が原因で失敗する SharingViolation
Read|書き込み が原因で失敗する SharingViolation
Read|削除 が原因で失敗する SharingViolation
書き込み|削除 が原因で失敗する SharingViolation
Read|書き込み|削除 が原因で失敗する SharingViolation

Azure Filesは、SMB クライアントでファイルが開かれている場合にのみ、共有違反を返します。 FileREST リース ファイル 操作を成功させるために、そのファイルに対して書き込みハンドルまたは削除ハンドルが開いている SMB クライアントは存在できないことに注意してください。 詳細については、「 ファイルのリース 操作」および 「FileREST と SMB の日和見ロック間の相互作用」を参照してください。

SMB ファイルのロックに対する FileREST リース ファイルの影響

ファイルのリースは、ファイルへの排他的な書き込みおよび削除アクセスを提供します。 SMB クライアントは、ファイルを開くときに、FileREST リース ファイル操作によってリースされたすべてのファイルのロックを考慮する必要があります。 次の表を使用して、SMB オープン ファイル操作を完了できるかどうかを判断できます。

FileREST ファイルのリース状態 SMB 操作が共有違反で失敗する
Leased 次のファイル アクセス権を持つファイルを開く SMB クライアントは失敗します。

  • FileAccess.Write
  • FileAccess.Delete
  • FileAccess.Read|FileAccess.Write
  • FileAccess.Write|FileAccess.Delete
  • FileAccess.Read|FileAccess.Write|FileAccess.Delete
利用可能 なし
中断 なし

FileREST に対する SMB 削除の影響

SMB クライアントは、ファイルを削除用に開くと、そのファイルの他のすべての SMB クライアントオープン ハンドルが閉じられるまで、ファイルを 保留中の削除としてマークします。 ファイルが削除保留中としてマークされている間、そのファイルに対する FileREST 操作は状態コード 409 (競合) とエラー コード SMBDeletePendingを返します。 SMB クライアントがファイルを閉じる前に保留中の削除フラグを削除できるため、状態コード 404 (見つかりません) は返されません。 つまり、ステータス コード 404 (Not Found) は、ファイルが削除済みである場合のみ返されることが想定されます。

ファイルは SMB 保留中の削除状態ですが、結果には List Files 含まれません。

また、FileREST Delete FileDelete Directory 操作はアトミックにコミットされ、削除が保留状態になりません。

FileREST に対するファイル属性の影響

SMB クライアントは、次のようなファイル属性の読み取りおよび設定が可能です。

  • アーカイブ
  • 読み取り専用
  • [非表示]
  • システム

ファイルまたはディレクトリが 読み取り専用としてマークされている場合、ファイルへの書き込みを試みる FileREST 操作は、状態コード 412 (前提条件に失敗) とエラー コード ReadOnlyAttributeで失敗します。 記録される操作には次のようなものがあります。

  • Create File
  • Set File Properties
  • Set File Metadata
  • Put Range

これらのファイル属性を設定したり、REST クライアントから読み取ったりすることはできません。 ファイルが読み取り専用になった後、SMB クライアントが読み取り専用属性を削除するまで、REST クライアントはファイルに書き込むことができません。

FileREST と SMB の日和見ロック間の相互作用

SMB の便宜的ロック (oplock) は、パフォーマンスの向上およびネットワーク転送の削減を目的にして SMB クライアントが要求するキャッシュ メカニズムです。 SMB クライアントは、特定のファイルまたはディレクトリの最新の状態をキャッシュできます。 便宜的ロックの種類 (SMB リース タイプ と呼ばれる) には複数あります。

  • 読み取り (R): SMB クライアントはローカル キャッシュから読み取ることができます。
  • 書き込み (W): SMB クライアントはローカルで書き込むことができます。データを Azure ファイル共有にフラッシュし直す必要はありません。
  • ハンドル (H): SMB クライアントは、ハンドルが閉じられたときに Azure ファイル共有に直ちに通知する必要はありません。 このロックの種類は、アプリケーションが同じアクセスモードと共有モードでファイルを開いたり閉じたりする場合に便利です。

これらのリースの種類は、指定されたアクセス モードと共有モードに依存しません。 通常、SMB クライアントは、アクセス モードと共有モードに関係なく、ファイルに対して新しいハンドルを開くたびに、すべてのリースの種類を取得しようとします。

呼び出される FileREST 操作によっては、既存の日和見ロックを解除するように要求する必要がある場合があります。 書き込み oplock の場合、SMB クライアントはキャッシュされた変更を Azure ファイル共有にフラッシュする必要があります。 次に、各種の oplock の解除を必要とする場合をいくつかを示します。

  • などの Put Range書き込み操作が発行されるたびに、読み取り (R) oplock を切断する必要があります。

  • などの Get File読み取り操作が発行されるたびに、書き込み (W) oplock を切断する必要があります。

  • クライアントが削除操作を発行するたびに、ハンドル (H) oplock を壊す必要があります。 Azure Filesでは、削除操作が成功した場合にハンドルを開けないことを要求します。

    また、FileREST 操作が既存の SMB ハンドルとの共有違反に直面すると、ハンドル oplock が壊れます。 これは、クライアントで実行されているアプリケーションによってハンドルがまだ開かれていることを確認するために発生します。

oplock を中断するには、キャッシュされた SMB クライアントの変更をフラッシュする必要があります。これにより、操作の応答時間が遅延する可能性があります。 フラッシュすると、状態コード 408 (要求タイムアウト) とエラー コード ClientCacheFlushDelayで操作が失敗する可能性もあります。

次のセクションでは、oplock が壊れるシナリオについて説明します。

oplock ブレークと SMB クライアントフラッシュが必要であり、REST クライアントで遅延が発生する

次の例を考えてみましょう。

  1. SMB クライアントは、ファイルを開き、RWH oplock を取得し、ローカルでデータを書き込みます。

  2. REST クライアントは要求を送信します Get File

    • Azure ファイル共有は書き込み (W) oplock を中断し、クライアントは RH oplock を残します。
    • SMB クライアントは、キャッシュされたデータを Azure ファイル共有にフラッシュし、oplock の中断を確認します。
    • Azure ファイル共有は要求を Get File 処理し、要求されたデータで応答します。

この例では、REST クライアントで遅延が発生します。 この状況は、oplock の中断と、SMB クライアントが Azure ファイル共有に対してデータをフラッシュするのにかかった時間が原因で発生します。

後続の 呼 Get File び出しでは、書き込み (W) oplock が既に壊れているため、追加の遅延は発生しません。

oplock の解除は必須ですが、REST クライアントで遅延は発生しません。

次の例を考えてみましょう。

  1. SMB クライアントは RH oplock を取得しました。

  2. REST クライアントは要求を送信します Put Range

    • Azure ファイル共有は、SMB クライアントに oplock break 要求を送信し、応答を待機しません。
    • Azure ファイル共有によって要求が処理されます Put Range

この例では、oplock の中断が必要ですが、要求に追加の Put Range 遅延は発生しません。 読み取り操作を中断するときに応答は必要ありません。

Azure Files動作

次の表は、各 FileREST 操作のAzure Filesの動作をまとめたものです。 この動作は、同じファイルのハンドルを既に取得している SMB クライアントの oplock 状態に基づいています。 さらに、この動作では、SMB ハンドルのアクセスと共有が FileREST 操作と競合しないことを前提としています。

競合がある場合は、クライアント上でハンドルが確実に開いたままになるようにハンドル oplock も解除されます。 ブロッキング oplock ブレークの場合、Azure Filesは中断が成功したことを確認するまで待機する必要があります。 非ブロッキング oplock ブレークの場合、Azure Filesは待機する必要はありません。

FileREST 操作 現在の oplock 型 Oplock の中断が実行されました 結果の oplock
Get File RWH はい (ブロッキング) RH
Get File RH いいえ RH
Get File RW はい (ブロッキング) R
ファイル プロパティの取得 RWH はい (ブロッキング) RH
ファイル プロパティの取得 RH いいえ RH
ファイル プロパティの取得 RW はい (ブロッキング) R
List Ranges RWH はい (ブロッキング) RH
List Ranges RH いいえ RH
List Ranges RW はい (ブロッキング) R
ファイルのメタデータを取得する RWH はい (ブロッキング) RH
ファイルのメタデータを取得する RH いいえ RH
ファイルのメタデータを取得する RW はい (ブロッキング) R
ファイルの一覧表示 RWH いいえ RWH
ファイルの一覧表示 RH いいえ RH
ファイルの一覧表示 RW いいえ RW
Put Range RWH はい (ブロッキング) なし
Put Range RH はい (非ブロッキング) なし
Put Range RW はい (ブロッキング) なし
Set File Properties RWH はい (ブロッキング) なし
Set File Properties RH はい (非ブロッキング) なし
Set File Properties RW はい (ブロッキング) なし
Set File Metadata RWH はい (ブロッキング) なし
Set File Metadata RH はい (非ブロッキング) なし
Set File Metadata RW はい (ブロッキング) なし
ファイルの削除 RWH はい (ブロッキング) RW
ファイルの削除 RH はい (ブロッキング) R
ファイルの削除 RW いいえ RW

ブロッキング oplock ブレークが必要な場合、特定の条件下では、FileREST 操作は失敗します。 指定した要求タイムアウト内、または 30 秒以内 (どちらか早く完了した場合) に中断が成功しない場合、サービスは状態コード 408 (要求タイムアウト) とエラー コード ClientCacheFlushDelayを返します。

要求には Delete File 、oplock ハンドル (H) リースの中断も必要です。 ハンドルを中断すると、REST クライアントが を呼び出 Delete Fileしたときに SMB クライアント アプリケーションによって開かれたファイル ハンドルが存在しなくなります。 共有違反がある場合、要求は状態コード 409 (競合) とエラー コード SharingViolationで失敗します。

関連項目

Azure Filesの概念