4.4. Ceph ファイルシステム
スナップショットの作成時に、スナップショットディレクトリーの mtime と change_attr が 更新されるようになりました。
以前のリリースでは、libcephfs
クライアントは mtime を更新せず、スナップが作成または削除されたときに属性を変更していました。このため、NFS クライアントは CephFS NFS-Ganesha エクスポート内の CephFS スナップショットを正しくリストできませんでした。
この修正により、スナップショットが作成、削除、名前変更されるときに、スナップショットディレクトリー .snap
の mtime と change_attr が更新されます。mtime および change_attr を修正して、スナップショットの一覧表示で古いスナップショットエントリーを返さないようにします。
cephfs-top -d --lay
オプションは、1 ~ 25 の範囲の整数値のみを受け入れます。
以前のリリースでは、いくつかの新しい Curses メソッドが追加されたため cephfs-top -d --lay
オプションは正しく動作しませんでした。新しい Curses メソッドは整数値のみを受け入れるため、ヘルパー関数から浮動小数点値を取得する際に例外が出力されました。
今回の修正により、cephfs-top -d [--delay]
オプションは 1 から 25 までの整数値のみを受け入れ、cephfs-top
ユーティリティーが期待どおりに機能するようになりました。
リンク解除の完了後に同じ dentry を作成しても、MDS デーモンはクラッシュしません。
以前は、リンク解除と作成操作の間で競合状態が発生しました。このため、前回のリンク解除要求が何らかの理由で遅れ、その間に同じ dentry を作成しようとすると、MDS デーモンがクラッシュして失敗するか、新規作成は成功しても書き込まれた内容が失われます。
この修正により、ユーザーは同じ dentry を作成する場合の競合を避けるために、リンク解除が完了するまで待つ必要があります。
ceph nfs cluster info CLUSTER_ID
のコマンドを実行すると、存在しないクラスターが表示されなくなりました。
以前のリリースでは、ceph nfs cluster info CLUSTER_ID
コマンドの実行時にクラスターの存在がチェックされないため、virtual_ip
と backend
、それぞれ null と empty など、存在しないクラスターの情報が表示されていました。
今回の修正により、'ceph nfs cluster info CLUSTER_ID' コマンドはクラスターの存在をチェックし、存在しないクラスターがクエリーされると Error ENOENT: cluster does not exist が出力されます。
スナップスケジュールモジュールが誤ってボリュームモジュールを参照することがなくなりました。
以前のリリースでは、スナップスケジュールモジュールは、サブボリュームパスをフェッチしようとすると、誤ってボリュームモジュールを参照していました。間違ったボリュームモジュール名とリモートメソッド名を使用したため、ImportError
トレースバックが表示されます。
今回の修正により、テストされていない間違ったコードが修正され、メソッドが実装されて、スナップスケジュール CLI インターフェイスメソッドから正しく呼び出されるようになりました。スナップスケジュールモジュールは、サブボリュームレベルのスケジュールを追加しようとするときに、サブボリュームパスを正しく解決するようになりました。
整数オーバーフローと ops_in_flight
値オーバーフローは発生しなくなりました
以前のリリースでは、_calculate_ops
は設定オプション filer_max_purge_ops
に依存していましたが、これは実行中に変更することもできました。このため、ops_in_flight
の値が uint64
の機能を超える値に設定されている場合は、整数オーバーフローが発生し、ops_in_flight が
max_purge_ops
よりもはるかに大きくなり、適切な値に戻すことができなくなります。
今回の修正により、Filer::_do_purge_range()
ですでに使用されているため、ops_in_flight
での filer_max_purge_ops
の使用は、無視されます。整数オーバーフローおよび ops_in_flight
値オーバーフローが発生しなくなりました。
無効な OSD リクエストは RADOS に送信されなくなりました。
以前は、最初の dentry に十分なメタデータがあり、サイズが max_write_size
より大きい場合に、無効な OSD リクエストが RADOS に送信されていました。このため、RADOS は無効なリクエストを失敗させ、CephFS が読み取り専用になります。
この修正により、すべての OSD リクエストには、RADOS に送信される前に検証済みの情報が入力され、無効な OSD リクエストによって CephFS が読み取り専用になることはありません。
MDS は、孤立したディレクトリーエントリーを処理するようになりました。
以前のリリースでは、MDS 孤立したディレクトリー処理ロジックのバグが原因で、MDS が孤立したディレクトリーエントリーの一部の処理をスキップしていました。このため、MDS は孤立したディレクトリーエントリーを処理できず、削除されたファイルが領域を解放しません。
今回の修正により、孤立したインデックスポインターが修正され、MDS が孤立したディレクトリーをすべて処理するようになりました。
Ceph ファイルシステムに接続されたプールのプールレベルのスナップは無効になります。
以前のリリースでは、プールレベルのスナップと mon 管理のスナップには独自のスナップ ID の名前空間があり、これが原因で、ID 間で競合が発生し、Ceph Monitor がプールレベルのスナップであるか、mon が管理するスナップであるかを、一意に特定できませんでした。このため、プールレベルのスナップと mon 管理のスナップのセットに存在する ID を参照するときに、間違ったスナップが削除される可能性がありました。
この修正により、Ceph ファイルシステムに接続されたプールのプールレベルのスナップが無効になり、プール ID の競合が発生しなくなります。したがって、CephFS スナップが削除されたときに、意図しないデータ損失が発生することはありません。
クライアント要求が MDS とクライアント間で無制限にバウンスすることがなくなりました。
以前のリリースでは、CephFS クライアントと MDS との間で、クライアント要求の Ceph プロトコルが一致しませんでした。このため、CephFS クライアントと MDS の間で通信するときに、対応する情報が切り捨てられるか失われ、クライアント要求が MDS とクライアントの間で無制限にバウンスすることになります。
今回の修正により、クライアント要求のプロトコル内の対応するメンバーの型が同じ型になるように修正され、新しいコードは古い Ceph と互換性が確保されるようになります。クライアント要求は MDS とクライアントの間で無制限にバウンスすることはなく、十分に再試行された後に停止します。
メタデータの破損を検出するためにコードアサートが Ceph Manager デーモンサービスに追加されました
以前は、Postgres などを実行するワークロードの Manager デーモンサービスによって、スナップショット関連の一種のメタデータ破損が発生していました。
この修正により、新しい破損が検出された場合にトリガーされるコードアサートが Manager デーモンサービスに追加されます。これにより、破損の拡大が軽減され、ログを収集して原因を特定できるようになります。
クラスターを Red Hat Ceph Storage 6.1 にアップグレードした後にデーモンがクラッシュした場合の分析と修正措置については、Red Hat サポート に問い合わせてください。
セッションマップのバージョンの不一致の問題が原因で MDS デーモンがクラッシュしなくなりました。
以前のリリースでは、MDS フェイルオーバーが発生すると、MDS セッションマップジャーナルログが正しく保持されませんでした。このため、新しい MDS がジャーナルログを再生しようとすると、セッションマップジャーナルログが MDCache 内の情報または他のジャーナルログからの情報と一致せず、MDS デーモンがアサートをトリガーして自身をクラッシュさせます。
今回の修正により、MDS デーモンをクラッシュさせずに、セッションマップバージョンを強制的に再生しようとしても、セッションマップバージョンの不一致が原因の MDS デーモンのクラッシュは発生しません。
MDS はキャップ取り消しの確認を待っている間に無期限に停止することがなくなりました。
以前は、__setattrx()
が失敗した場合、_write()
は、CEPH_CAP_FILE_WR
キャップ参照を保持し、MDS はキャップ失効確認を待機して無期限に停止していました。さらに、他のクライアントの要求も無期限に停止してしまう原因にもなっていました。
今回の修正により、__setattrx ()
が失敗し、MDS のキャップ取り消し要求がスタックしない場合に、CEPH_CAP_FILE_WR
キャップ参照が解放されます。