1.4. Ceph ファイルシステムの POSIX コンプライアンスとの相違点
本セクションでは、Ceph File System(CephFS)が厳格な POSIX セマンティクスと異なる状況を一覧表示します。
-
クライアントがファイルの書き込みに失敗した場合、書き込み操作は必ずしも Atomic ではありません。例えば、
O_SYNC
フラグで開かれた 8MB のバッファを持つファイルに対して、クライアントがwrite()
システムコールを呼び出したところ、予期せぬ終了で、書き込み操作が部分的にしかできなくなってしまうことがあります。ローカルファイルシステムを含め、ほとんどのファイルシステムがこのような動作をします。 - 書き込み操作が同時に行われる状況では、オブジェクトの境界を超えた書き込み操作は必ずしも Atomic ではありません。たとえば、ライター A は "aa|aa" と writer B を同時に書き込みます( "|" はオブジェクト境界)。また、「aa|bb」は適切な「aa| aa」または「 bb|bb」 ではなく、書き込まれます。
-
POSIX には
telldir()
やseekdir()
というシステムコールがあり、カレントディレクトリのオフセットを取得して、そこまでシークすることができます。CephFS はいつでもディレクトリーを断片化できるため、ディレクトリーの安定した整数オフセットを返すことは困難です。そのため、0 以外のオフセットでseekdir()
システムコールを呼び出しても、動作する場合がありますが、動作を保証するものではありません。seekdir()
をオフセット 0 で呼び出すと必ず動作します。これは、rewinddir()
システムコールと同等のものです。 -
スパースファイルは、
stat()
システムコールのst_blocks
フィールドに正しく伝わりませんでした。CephFS はファイルのどの部分が割り当てまたは書き込まれるのかを明示的に追跡しないため、st_blocks
フィールドには、ブロックサイズで分けられたファイルサイズが常に設定されます。この動作により、du
などのユーティリティーが消費した領域を過剰に予測します。 -
mmap()
システムコールでファイルを複数のホストのメモリにマッピングした場合、書き込み操作が他のホストのキャッシュに一貫して伝わらない。つまり、あるページがホスト A でキャッシュされ、ホスト B で更新された場合、ホスト A のページはコヒーレントに無効にはなりません。 -
CephFS クライアントには、スナップショットへのアクセス、作成、削除、名前の変更に使用される隠れた
.snap
ディレクトリがあります。このディレクトリーはreaddir()
システムコールから除外されていますが、同名のファイルやディレクトリを作成しようとしたプロセスはエラーを返します。マウント時のこの非表示ディレクトリーの名前は、-o snapdirname=.<new_name> オプションを使用するか、
設定オプションを使用して変更できます。client_
snapdir