rasdaemon のファイルディスクリプタリークを linux-edac ML に報告

id:buty4649 が業務で扱っている プライベートクラウド(OpenStack) に rasdaemon を導入してくれたのだけど、ハードウェアの異常を検知してはくれるものの sqlite にレコードを入れるあたりでエラーログを出していたので調べていた

Oct 19 16:06:42 *** rasdaemon[4233]: rasdaemon: Failed to do mc_event step on sqlite: error = 14
Oct 19 16:06:42 *** rasdaemon[4233]: rasdaemon: Failed reset mc_event on sqlite: error = 14

errno 14 は ENFILEToo many open files 。よくみるやつ

       ENFILE          Too many open files in system (POSIX.1).  On Linux,
                       this is probably a result of encountering the
                       /proc/sys/fs/file-max limit (see proc(5)).

問題を起こしているプロセスの strace を取りつつ rasdaemon のソースを眺めてみたところ、abrtd にレポートを投げる関数があり その関数で socket(2) が成功してかつ connect(2) が失敗するとファイルディスクリプタがリークするというバグを見つた。その旨を linux-edac の ML にバグレポートを投げた

いきなりパッチを投げてもよさそうだが、まずはバグがあることを認識してもらうのがいいのだろうか。さてはて。

ややこしい状況

... にもかかわらず

  • Ubuntu の rasdaemon は abrtd にレポートを投げる ./configure --enable-abrt-report オプションを有効にしてビルドされている
  • abrtd が動いていないので connect(2) は必ず失敗する
  • つまりハードウェアの異常を検知すると 必ず 冒頭に述べたバグを踏む 🔥

というややこしい条件がついている感じだった。 「Ubuntu のひとたち rasdaemon 使ってないのネー」という話をした

その他調べたこと

感想

  • はやくバグ fix されるといいな