CLFS の安定した記憶域
共通ログ ファイル システム (CLFS) ストリームにレコードを書き込むと、レコードは揮発性メモリ内のログ I/O ブロック (マーシャリング領域内) に配置されます。 CLFS は、定期的にログ I/O ブロックをマーシャリング領域からディスクなどの安定したストレージにフラッシュします。 安定ストレージ デバイスでは、ログは一連のコンテナーで構成され、それぞれが物理メディア上の連続したエクステントになります。 ストリームの安定ストレージを形成するコンテナーのコレクションは、ログまたは物理ログと呼ばれます。
次の図は、コンテナーを示しています。
上の図は、3 つのログ I/O ブロックを保持するコンテナーを示しています。 最初のログ I/O ブロックには 3 つのレコードが含まれており、2 つ目には 5 つのレコードが含まれており、3 つ目には 2 つのレコードが含まれています。 図が示すように、各ログ I/O ブロックの先頭は、安定したストレージ メディアのセクターの先頭と常に一致しています。 安定ストレージ上のログ I/O ブロックのサイズは異なされることに注意してください。
CLFS は、3 つの数値のセットを使用して、ログ内のレコードを検索します。
コンテナ識別子は、レコードを保持するコンテナを識別します。
ブロック オフセットは、コンテナ内の、レコードを保持するログ I/O ブロックの先頭のバイト オフセットを示します。
レコード シーケンス 番号は、ログ I/O ブロック内のレコードを識別します。
CLFS ログ レコードのログ シーケンス番号 (LSN) には、実際には、コンテナー識別子、ブロック オフセット、およびレコード シーケンス番号の 3 つの情報が保持されます。 ただし、ログ クライアントに提供される LSN には、CLFS が安定したストレージ上のレコードにアクセスする前に物理コンテナー識別子にマップする必要がある 論理コンテナー識別子が含まれています。
CLFS では、論理コンテナー識別子を使用して、実際には物理コンテナーがリサイクルされているときに、ログ レコードがコンテナーの進行中のシーケンスに書き込まれているというビューをクライアントに提供します。
ログに 3 つのコンテナーがあり、1 つのクライアントが CLFS レコードをログに書き込んでいるとします。 次のシナリオは、コンテナーをリサイクルする方法を示しています。
クライアントは、3 つのコンテナーすべてを満たすのに十分なログ レコードを書き込みます。
クライアントは、ログ ベースを (ClfsAdvanceLogBaseまたはClfsWriteRestartArea) を呼び出して、コンテナー 2 のレコードの 1 つに設定します。 これにより、クライアントはコンテナー 1 のレコードが不要になったと言っています。
クライアントは別のレコードをログに書き込み、新しく書き込まれたレコードの LSN を取得します。 その LSN 内の論理コンテナー識別子は 4 です。 レコードが安定したストレージにフラッシュされると、クライアントが論理コンテナー 4 で認識するレコードは、物理コンテナー 1 に送られます。
次の図はシナリオを示しています。 これは、論理コンテナのクライアント シーケンスが安定したストレージ上の物理コンテナにどのようにマッピングされるかを示しています。
論理コンテナー ID、ブロック オフセット、およびレコード シーケンス番号は、特定のストリームの LSN が常に厳密に増加するシーケンスを形成するように LSN に格納されます。 つまり、ストリームに書き込まれたログ レコードの LSN (論理コンテナー識別子を持つ) は、以前に同じストリームに書き込まれたログ レコードの LSN よりも常に大きくなります。 LSN は、2 つの目的を果たします。1) ストリームのクライアントに順序付けられたレコード識別子のシーケンスを提供し、2) CLFS に安定したストレージ上のレコードの場所を提供します。
レコードの LSN を指定すると、次の関数を呼び出すことによって、論理コンテナー識別子、ブロック オフセット、およびレコード シーケンス番号を抽出できます。
論理コンテナー ID は 32 ビットの数値であるため、2^32 個の論理コンテナー ID があり、それらは 0x0 から 0xFFFFFFFF の範囲にあります。 ストリームは、最大で 2^32 個の論理コンテナーを持つことができます。
ブロック オフセットは LSN の 23 ビットに格納されますが、 ClfsLsnBlockOffset は、安定したストレージ メディアのセクター サイズに合わせた 32 ビットの数値を返します。 ブロック オフセットは常に 512 の倍数です。 また、ブロックオフセットは、安定した記憶媒体のセクタサイズに整合する。 たとえば、セクター サイズが 1024 バイトの場合、ブロック オフセットは 1024 の倍数になります。
レコード・シーケンス番号は 9 ビットの数値であるため、可能なレコード・シーケンス番号は 2^9 (512) 個あり、それらは 0x0 から 0x1FF の範囲にあります。 ログ I/O ブロックには、最大 512 個のレコードを含めることができます。