日和見ロックの例

次の例では、日和見ロックが行われて破損した場合のデータと SMB メッセージの移動を示します。 クライアントは、ファイル属性データとファイル データをキャッシュできることに注意してください。

また、これらの例は、クライアント アプリケーションがリモート サーバーから日和見ロックを要求している状況に基づいていることにも注意してください。 これらのプロセスは、ネットワーク リダイレクターとリモート サーバーによって自動的に開始されます。クライアント アプリケーションやアプリケーションが直接関与する必要はありません。 これらの例で説明するプロセスは、ローカル クライアント アプリケーションがローカル ファイル システムに対して日和見ロックを直接要求している状況に一般化できます。ただし、ネットワーク経由でのデータ交換は関係しません。

レベル 1 の日和見ロック

次の図は、ファイルのレベル 1 の日和見ロックのネットワーク トラフィック ビューを示しています。 矢印は、データ移動の方向 (存在する場合) を示します。

イベント クライアント X サーバー クライアント Y
1 ファイルを開き、要求レベル 1 のロック ==>
2 <== レベル 1 の日和見ロックを付与します
3 読み取り、書き込み、およびその他の操作 == を実行します。>
4 <== ファイルを開く要求
5 <== 日和見ロックを解除します
6 先読みデータを破棄します
7 データ == を書き込みます>
8 "close" または "done" メッセージ == を送信します>
9 Oks open 操作 ==>
10 読み取り、書き込み、およびその他の操作 == を実行します。> <== 読み取り、書き込み、およびその他の操作を実行します

 

イベント 1 では、クライアント X はファイルを開き、開いている操作の一環として、ファイルに対してレベル 1 の日和見ロックを要求します。 イベント 2 では、他のクライアントでファイルが開かないため、サーバーはレベル 1 のロックを付与します。 クライアントは、イベント 3 で通常の方法でファイルへのアクセスを続行します。

イベント 4 では、クライアント Y はファイルを開こうとし、日和見ロックを要求します。 サーバーは、クライアント X にファイルが開かれていることを確認します。 クライアント X が書き込みデータをフラッシュし、ファイルの読み取りキャッシュを破棄している間、サーバーは Y の要求を無視します。

サーバーは、日和見ロックであるイベント 5 を中断する SMB メッセージを X に送信して、X にクリーンアップを強制します。 クライアント X は、先行読み取りデータを "サイレント" に破棄します。つまり、このプロセスはネットワーク トラフィックを生成しません。 イベント 7 では、クライアント X はキャッシュされた書き込みデータをサーバーに書き込みます。 クライアント X がキャッシュされたデータのサーバーへの書き込みを完了すると、クライアント X はサーバーに "close" または "done" メッセージ (イベント 8) を送信します。

クライアント X がサーバーへの書き込みキャッシュのフラッシュを完了したか、ファイルを閉じたことをサーバーに通知した後、サーバーはイベント 9 でクライアント Y のファイルを開くことができます。 サーバーには同じファイルが開かれた 2 つのクライアントがあるため、どちらのクライアントにも日和見ロックが付与されません。 どちらのクライアントもファイルからの読み取りを続行し、1 つまたは両方がファイルに書き込みを行います。

Batch Opportunistic Lock

次の図は、バッチの日和見ロックのネットワーク トラフィック ビューを示しています。 矢印は、データ移動の方向 (存在する場合) を示します。

イベント クライアント X サーバー クライアント Y
1 ファイルを開き、バッチ ロックを要求 ==>
2 <== バッチの日和見ロックを付与します
3 ファイル == を読み取ります>
4 <== データの送信
5 ファイルを閉じます
6 ファイルを開きます
7 データを検索する
8 データ == を読み取ります>
9 <== データの送信
10 ファイルを閉じます
11 <== ファイルを開きます
12 <== 日和見ロックを解除します
13 ファイル == を閉じます>
14 Oks open 操作 ==>
15 <== 読み取り、書き込み、およびその他の操作を実行します

 

バッチの日和見ロックでは、クライアント X はファイル、イベント 1 を開き、サーバーはイベント 2 でクライアント X にバッチ ロックを付与します。 クライアント X は、サーバーがデータで応答するイベント 3 (イベント 4) のデータの読み取りを試みます。

イベント 5 は、作業中のバッチの日和見ロックを示しています。 クライアント X 上のアプリケーションがファイルを閉じます。 ただし、ネットワーク リダイレクターは閉じる操作を除外し、閉じるメッセージを送信しないため、"サイレント" クローズを実行します。 ネットワーク リダイレクターは、クライアント X がファイルの唯一の所有権を持っているため、これを行うことができます。 その後、イベント 6 で、アプリケーションによってファイルが再度開きます。 ここでも、ネットワークを経由するデータ フローはありません。 サーバーに関する限り、このクライアントはイベント 2 以降にファイルを開いています。

イベント 7、8、および 9 は、ネットワーク トラフィックの通常のコースを示します。 イベント 10 では、別のサイレント クローズが発生します。

イベント 11 では、クライアント Y はファイルを開こうとします。 ファイルのサーバービューは、クライアントX上のアプリケーションがそれを閉じているにもかかわらず、クライアントXがそれを開いているということです。 そのため、サーバーは、日和見ロックを解除するメッセージをクライアント X に送信します。クライアント X は、ネットワーク (イベント 13) を介して閉じるメッセージを送信するようになりました。 サーバーがクライアント Y のファイルを開くと、イベント 14 が続きます。クライアント X 上のアプリケーションはファイルを閉じたため、そのファイルのサーバーとの間の転送はこれ以上行われません。 クライアント Y は、イベント 15 で通常どおりデータ転送を開始します。

イベント 2 のファイルに対するロックがクライアント X に付与されてからイベント 13 で最後に閉じるまでの間、クライアントがキャッシュしたファイル データは、アプリケーションのオープン操作とクローズ操作が介在するにもかかわらず有効です。 ただし、日和見ロックが解除された後は、キャッシュされたデータを有効と見なすことはできません。

日和見ロックのフィルター処理

次の図は、フィルターの日和見ロックのネットワーク トラフィック ビューを示しています。 矢印は、データ移動の方向 (存在する場合) を示します。

イベント クライアント X サーバー クライアント Y
1 アクセス権のないファイルを開きます ==>
2 <== ファイルを開きます
3 Requests filter lock==>
4 <== ロックを許可します
5 == を読み取るためのファイルを開きます>
6 <== ファイルを再度開きます
7 読み取りハンドル == を使用してデータを読み取ります>
8 <== データの送信
9 <== データの送信
10 <== データの送信
11 <== ファイルを開きます
12 ファイル == を開きます>
13 <== 要求フィルター ロック
14 フィルター ロックを拒否==>
15 <== データを読み取ります
16 データの送信 ==>
17 データの読み取り (キャッシュ)
18 ファイル == を閉じます>
19 <== ファイルを閉じます

 

フィルターの日和見ロックでは、クライアント X はファイル、イベント 1 を開き、サーバーはイベント 2 で応答します。 その後、クライアントはイベント 3 でフィルターの日和見ロックを要求し、その後、サーバーがイベント 4 で日和見ロックを許可します。 クライアント X は、イベント 5 で読み取るためにファイルをもう一度開き、サーバーがイベント 6 で応答します。 その後、クライアントはデータの読み取りを試みます。このデータは、サーバーがデータで応答するイベント 8 です。

イベント 9 は、作業中のフィルターの日和見ロックを示しています。 クライアントが要求していない場合でも、サーバーはクライアントの前に読み取り、ネットワーク経由でデータを送信します。 クライアントはデータをキャッシュします。 イベント 10 では、サーバーは将来のデータ要求も予測し、クライアントがキャッシュするファイルの別の部分を送信します。

イベント 11 と 12 では、別のクライアント Y がファイルを開きます。 クライアント Y は、フィルターの日和見ロックも要求します。 イベント 14 では、サーバーはそれを拒否します。 イベント 15 では、クライアント Y は、サーバーがイベント 16 で送信するデータを要求します。 いずれの場合も、クライアント X には影響しません。別のクライアントは、いつでもこのファイルを開いて読み取りアクセスできます。 クライアント X のフィルター ロックに影響するクライアントは他にありません。

イベント 17 は、クライアント X がデータを読み取る方法を示しています。 ただし、サーバーは既にデータを送信しており、クライアントがデータをキャッシュしているため、ネットワークを通過するトラフィックはありません。

この例では、クライアント X はファイル内のすべてのデータを読み取ろうとしないため、イベント 9 と 10 で示される先読みは "無駄" になります。つまり、データは実際には使用されません。 これは、先読みによってアプリケーションが高速化されたため、許容される損失です。

イベント 18 では、クライアント X はファイルを閉じます。 クライアントのネットワーク リダイレクターは、キャッシュされたデータを破棄します。 サーバーがファイルを閉じます。