Catalyst+mod_perl2+DBIC(DBD::mysql-v4.008)でSegmentation fault

なんか良く分からんけどSegmentation faultが出て泣きそうだったんだけどやっと原因がわかったっぽい感じなのでメモしとく。

とりあえず環境は下記

CentOS 5.2
Apache 2.2.9
Perl v5.8.8
mod_perl 2.0.4
MySQL 5.0.51b

現象としてはサイトを数時間放置してアクセスすると必ずセグるというもので、当初は何がなんだか分からないL状態でした。

で、coreファイルを解析したところ、

Program terminated with signal 11, Segmentation fault.
#0  0x048be024 in mysql_send_query () from /usr/local/mysql/lib/mysql/libmysqlclient.so.15

というメッセージが。どうやらmysqlに問題があるっぽいことがわかり、その辺から調査をば。

別の環境ではセグったことが無かったので何かしらのモジュールの最新バージョンが怪しいということで、MySQLがらみのDBD::mysqlをターゲットにしてみたところ。どんぴしゃ。

DBD::mysql-v4.008(記事書いてる時点での最新版)だとセグるけど、別の環境でも使用しているDBD::mysql-v4.004だとセグらないことが判明。うががーさんめ。

で一応、間のバージョンも調査したところ、以下の結果に

4.004 OK
4.005 OK
4.006 OKだけど何故か文字化け
4.007 セグる(文字化けはしない)
4.008 セグる(文字化けはしない)

なんか知らないけど4.006だと文字化けした。SET NAMESが効いてないとか?良く分からん。

ってことで4.007以上のバージョンだとCatalyst+mod_perl2でセグる。Catalystというか多分Apache::DBIのようなコネクトをキャッシュするものは軒並みセグりそうな感じがする。多分MySQLのコネクションが切れた時に再接続がされてない常態でクエリが発行されたとかかなぁ?ちょっと深いところまでは調べれてない。

そういうことで根本解決ではないかもしれないけどDBD::mysqlは4.005を使うのが無難かと。

とりあえずうちではしばらく4.005で様子見してみることにしました。

ググル先生に問い合わせたけど同じ症状出てる人を見かけなかったので、もしかしたらうちだけの問題かもしれないのでご了承を。

同じ症状の人がいたら情報求む。

# あとid:ma8loose、協力thx!


追記

id:tokuhiromさんからのコメントを受けて。

DBD::mysql-v4.008+myapp_server.plだとセグりませんでした。なのでmod_perlとの何かが変に干渉してるのかなぁとか思った次第です。

あとセグの検証方法としては、Catalyst起動中(MySQLのコネクションが永続化)にMySQLを再起動させて、その状態でサイトにアクセスすると確実にセグります。

同じ方法で4.005ではセグりません。
再接続の部分で何かしら問題がありそうな匂いはします。


追記追記

Bug #37027 for DBD-mysql: mysql_auto_reconnect causing seg faults

RTにチケットがあったようです。正式対応はまだみたいですが、パッチがでているようなのでそれを使えばセグしないとのこと。

id:tokuhiromさん、情報ありがとうございました。