第3章 主なバグ修正
本章では、ユーザーに大きな影響を及ぼす Red Hat Gluster Storage の今回のリリースで修正されたバグについて説明します。
注記
ハイパーリンクの付いていない Bugzilla ID は、機密データが割り当てられている可能性のあるプライベートバグです。
セキュリティーの修正
- CVE-2019-10197 (中程度)
- パラメーターとパーミッションの組み合わせにより、ユーザーが共有パスの定義から逃れることができる可能性があります。
一般的な修正
- BZ#1578703
- 以前は、gluster volume status <volname> inodeを実行するとinodeテーブル全体が出力され、タイムアウトしてパフォーマンス問題が発生することがありました。このコマンドの出力はより合理的になり、元の情報はstetumpを実行することで得られるようになりました。
- BZ#1734423、BZ#1736830、BZ#1737674
- これまでは、動的に割り当てられたメモリが正しく解放されないため、glusterクライアントでのメモリ消費量の増加やメモリ不足の管理が行われていました。メモリが正しく解放されるようになり、メモリオーバーランが発生しないようになりました。
- BZ#1676468
- 以前は、glusterfsはカーネルの自動無効化を有効にしており、ctimeが変更されるとページキャッシュを無効にしていました。つまり、ctimeの変更前、変更中、変更後に書き込みが発生するたびに、ページキャッシュがパージされ、その後の書き込みのパフォーマンスはキャッシュの恩恵を受けないことになりました。パフォーマンスを向上させるための2つの新しいオプションが用意されました。マウントオプションの
auto-invalidation[=on|off]
がデフォルトで有効になりました。これは、カーネルが属性、dentry、およびページキャッシュを自動的に無効にするかどうかを指定するものです。書き込み後にページキャッシュを保持するには、これを「off」に設定します。ただし、ファイルが2つの異なるマウントポイントから同時にアクセスできない場合に限ります。ボリュームオプションのperformance.global-cache-invalidation=[on|off]
は、performance.cache-invalidation
の値を上書きします。このオプションは、デフォルトでは無効ですが、有効にすると、統計の変更が検出されたときに、glusterに関連するすべての読み取りキャッシュをパージします。ファイルが異なるマウントポイントからアクセス可能で、これらのマウントポイント間のキャッシュが一貫していることが要求される場合に限り、このオプションをオンにしてください。両方のオプションをオフにすると、書き込まれたデータはページキャッシュに保持され、同一領域でのオーバーラップ読み取りのパフォーマンスが向上します。 - BZ#1726991
get-status
操作は開始および停止の状態しか追跡しないため、ブリックの状態が開始または停止の状態にあるときに、ブリックの状態が開始と表示されていました。get-status
操作は、より正確に状態を報告するようになりました。- BZ#1720192
- glusterボリュームに
bind-address
が指定されている場合、リバランスソケットファイルの名前が許容される文字数よりも大きくなり、リバランスが開始されないという問題がありました。ボリューム名とUUIDに基づいてハッシュが生成されるようになり、この問題が回避されました。 - BZ#1670415、BZ#1686255
- すべてのボリュームの状態を表示するときに発生していた小さなメモリーリークが修正されました。
- BZ#1652461
- 3ノードクラスターで1500以上のボリュームを設定している場合に、ノードやglusterdサービスが利用できなくなると、再接続時にハンドシェイクプロセスがタイムアウトする前に収集するボリューム情報が多すぎるという問題がありました。この問題は、ボリューム情報の収集プロセスにいくつかの最適化を加えることで解決されます。
- BZ#1058032
- これまでは、仮想マシンの移行中に、マシンイメージが共有ファイルシステム上にあることが検出されると、libvirtがマシンイメージの所有権を変更していました。そのため、仮想マシンがイメージにアクセスできなくなっていました。この問題はもう再現しません。
- BZ#1685246
- removeexattr システムコールがブリックプロセスに渡されなかったため、アクセス制御リスト設定が Red Hat Gluster Storage ボリュームから削除されませんでした。この問題は修正され、期待通りに属性が削除されるようになりました。
分散されたボリュームの修正
- BZ#1732774
- 不良ブリック上のファイルに対する書き込み要求が実行されている間に、そのファイルがヒーリングされていた場合、書き込み操作中に発生する読み取りは、不良ブリックからファイルを読み取ることができます。これにより、正常なブリックのデータが破損してしまう可能性があります。この問題を回避するために、すべての読み取りは良好なブリックからのみ行われるようになりました。
- BZ#1706549
- ブリックがダウンしても、
O_TRUNC
フラグを使用してファイルを変更することができます。ブリック機能が復活すると、ファイル記述子を使用してファイルを変更した操作は、open-fdヒールを開始します。これまでは、O_TRUNC
を使用してオープンされたファイルに対してopen-fd healを実行すると、ファイルに対して切り捨て操作が行われていました。切り捨て操作は通常、すでにロックを取得している操作の一部として行われるため、明示的なロックを取得しませんでした。この場合、NULLロック構造が発生し、最終的にNULLロック構造が参照解除されたときにクラッシュしました。open-fdヒール時にO_TRUNC
フラグが無視され、ファイルのデータヒール時に切り捨て操作が行われるようになり、この問題が回避されるようになりました。 - BZ#1745107
- これまでは、ファイルのサイズやバージョンの更新に失敗しても、ファイル記述子が不良としてマークされることはありませんでした。そのため、必ずしもそうではないのに、ブリックが正常だと思われたり、ファイルに誤ったデータが表示されたりすることがありました。この更新により、更新に失敗した後のファイル同期の変更やフラッシュの失敗により、ファイル記述子が不良とマークされるようになりました。
分散ボリュームの修正
- BZ#1672869
- これまでは、
parallel-readdir
を有効にすると、古くなったlinktoファイルがデータファイルと誤って解釈され、削除できませんでした。古くなったlinktoファイルが正しく認識されるようになりました。
イベントに関する修正
- BZ#1732443
- これまでは、イベントソケットの初期化時にネットワークファミリーが正しく設定されませんでした。この結果、無効な引数エラーが発生し、イベントがコンシューマーに送信されませんでした。ネットワークファミリーが正しく設定され、イベントが期待通りに動作するようになりました。
gdeployによる自動化の修正
- BZ#1759810
- gdeployによるSambaのセットアップ時に、設定オプション
group=samba
とuser.cifs=enable
がボリュームに設定されるようになり、セットアップが成功するようになりました。 - BZ#1712904
- これまでは、gdeployを使用してsambaを設定すると、クラスタ内のすべてのノードでsambaユーザが作成されませんでした。これにより、CTDBのフェイルオーバー時に、必要なユーザーが存在しないという問題が発生しました。gdeployは、すべてのノードでsambaユーザーを作成するようになり、この問題を回避しました。
Geo レプリケーションに関する修正
- BZ#1708116
- ジオレプリケーションで、リンクが解除されてマスターに存在しなくなった大量のファイルの同期を試みると、デッドロックが発生してtarsshプロセスがハングアップしてしまうという問題がありました。tarが完了する前に、tarプロセスのstderrバッファがいっぱいになると、ハングアップしました。ワーカーはstderrを読み取る前にtarが完了することを期待していましたが、tarは読み取られてバッファが解放されるまで完了できませんでした。ワーカーは、tarプロセスが作成されるとすぐにstderr出力の読み取りを開始するようになり、この問題が回避されました。
- BZ#1708121
- Geo レプリケーションでは、多数の異なるファイルが作成され、同じ宛先パスにリネームされた場合に、追加のファイルを作成するのではなく、正しく同期するようになりました。
- BZ#1712591
- 非rootのGeo レプリケーションセッションでは、glusterのバイナリパスがPATH変数に追加されないため、glusterコマンドがセッションで利用できないという問題がありました。既存の
gluster-command-dir
およびgluster-command-slave-dir
オプションを使用して、セッションがglusterコマンドにアクセスできるようにすることができます。 - BZ#1670429
- シンボリックリンクの名前が同期の間に複数回変更されても、Geo レプリケーションが成功するようになりました。
NFS-Ganeshaの修正
- BZ#1728588
- NFSクライアントとの接続を再確立しようとしたときに、サーバーが既存の状態を時間内にクリーンアップしないという競合状態がありました。これにより、新しい接続が期限切れと誤って認識され、マウントポイントにアクセスできなくなるという問題がありました。新しい接続を受け入れる前に状態がクリーンアップされるようになったため、この問題は発生しなくなりました。
- BZ#1751210
- NFS-Ganeshaでは、Glusterストレージに対するすべての操作にクライアントの認証情報を使用していました。非rootユーザーが読み取り専用のファイルを操作した場合に、「permission denied」というエラーが発生することがありました。ルート権限が必要に応じて使用されるようになり、非rootユーザーが 0444 モードを使用してファイルを作成および書き込むことができるようになりました。
レプリケーションの修正
- BZ#1688395
- 書き込みトランザクション中にeager-lockのロック取得が失敗すると、前のロックが保持され、後続の書き込みがすべてブロックされ、ハングアップすることがありました。この状況が正しく処理されるようになり、関連する問題の診断に役立つ、より具体的なログメッセージが追加されました。
- BZ#1642425
- Gluster NFSボリュームのボリューム設定ファイルで
cluster.quorum-count
ボリュームオプションが更新されないという問題がありました。これは、読み取ったファイルの最後の部分がバッファサイズよりも小さい場合、バッファから書き込まれるデータが新しいデータと古いデータの組み合わせになったためです。この問題は修正され、Gluster NFSクライアントは、cluster.quorum-type
がfixed
に設定されている場合、cluster.quorum-count
を尊重するようになりました。
Shardingの修正
- BZ#1568758
- 多数のシャードを持つファイルを削除するときに、タイムアウトしていました。すべてのシャードで並行してアンリンク操作が行われ、
.shard
ディレクトリで競合が発生したためです。タイムアウトにより削除が失敗し、.shard
ディレクトリに古いシャードが残るという問題がありました。.shard
ディレクトリの競合を抑制し、タイムアウトを防ぐために、シャードの削除は、一度に1バッチのシャードを削除するバックグラウンドプロセスになりました。シャードの削除バッチのサイズは、features.shard-deletion-rate
オプションで制御されますが、デフォルトでは100
に設定されています。
Web Administrationに関する修正
- BZ#1645428
- 以前に出荷されたバージョンのpython2-pyasn1パッケージを使用すると、IPAクライアントのインストールに失敗するという問題がありました。python2-pyasn1の代わりにpysnmpが使用されるように、このパッケージはtendrl-notifierとtendrl-commonsのアップデートで置き換えられ、インストールは期待通りに動作します。Red Hat Gluster Storage Web Administration 3.5 にアップグレードする前に、以下のコマンドを実行してpython2-pyasn1とpysnmpパッケージ(依存関係は除く)を削除してください。
# rpm -e --nodeps $(rpm -qa 'python2-pyasn1') # rpm -e --nodeps $(rpm -qa 'pysnmp')
- BZ#1647322
- 以前は、tendrlは
/var/lib/carbon/whisper/tendrl
ディレクトリにオーナーを設定しませんでした。このディレクトリの所有者がcarbon
ユーザーでない場合、carbon-cacheはこの場所にwhisperファイルを作成できませんでした。whisperファイルを確実に作成できるように、Tendrlはディレクトリの所有者をcarbon
ユーザーにするようになりました。 - BZ#1688630
- これまでは、
tendrl-monitoring-integration
が実行されていないために発生したエラーは、一般的なエラーメッセージで報告されていました。この状況で、tendrl-monitoring-integration
のステータスに関するより具体的なエラーメッセージが記録されるようになりました。 - BZ#1645221
- これまでは、Red Hat Gluster Storage Web Administrationでは、Web Administrationによるノードの管理を停止する前に、すべてのノードがオンラインになっている必要がありました。クラスタ内の1つまたは複数のノードがオンラインでない場合でも、ノードを管理対象から外すことができるようになりました。
- BZ#1666386
- Red Hat Gluster Storage Web Administrationでは、正常に動作しているヒールプロセスの一部であっても、スプリットブレイン関連のイベントをすべて受信し、ユーザーインターフェースにエラーとして表示していました。イベントがクライアントの識別子に基づいてフィルタリングされるようになり、ユーザーインターフェースから不要なエラーや誤ったエラーを取り除くことができるようになりました。
- BZ#1687333
- これまでは、クラスター内のすべてのノードがオフラインになったときに、Web Administrationインターフェイスでオフラインのノード数が正しく報告されませんでした。ノードの状態が正しく追跡され、報告されるようになりました。
- BZ#1686888
- node-agentサービスは、インポートと削除(管理停止)の操作を行います。node-agentサービスが実行されていない場合、これらの操作は一般的なログメッセージと共にタイムアウトしました。この問題が発生した場合、より明確に記録されるようになりました。
- BZ#1702412
- これまでは、Ansible 2.8との互換性が正しく機能しませんでした。Red Hat Storage Web Administration が Ansible 2.8 と互換性を持つようになりました。