2007年04月16日(月) [長年日記]
- 夜眠れない。
- MySQLは色々面倒だな。
■ [ruby][db] 「MySQL server has gone away」エラー一応解決
土曜日に未解決だった「MySQL server has gone away」エラーが出る件で何が起こっているのか少しわかったのでメモ。
今作っているRailsアプリケーションには、forkする変な処理がある。forkした後で子プロセスが終了するとMySQLとの接続が閉じられ、そうすると親プロセスがDBを参照しようとしたときに件のエラーが発生することがあるみたい。
こんな風にしてエラーが起こっているように見える:
railsプロセス | +-- fork --> 子プロセスA (waitしない) | | +-- fork --> 子プロセスB | (wait) | | : exec失敗 | 子プロセスA x DBへアクセス の終了を検出 するとエラー | | DBへアクセス | するとエラー | x
子プロセスBの終了時にMySQLとの接続がクローズし、その後railsプロセスや子プロセスAはそのクローズした接続を使ってDBにアクセスしようとするからエラーになるのではないかと思う。
で、子プロセス終了時にexit!を呼び出すようにしたらエラーは出なくなった。exit! って安直に使っても大丈夫なんだろうか。リソースリークが起こるような気もする。fork じゃなくてスレッドを使うように直した方がいいのかなあ。
[ruby-list:43021] Open3に似たような話があって、参考にした。
(追記)
直ってなかったみたい。まだエラーになることがある。
ActiveRecord::Base.remove_connection()とActiveRecord::Base.establish_connection()というメソッドがあったので、fork()した後でこれらを呼び出してDBとの接続をリセットするようにしたら改善された気がする。これで直るといいけど。
■ やること
- 年金
- スポンジ
- 歯ブラシ