メモの日々


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との接続をリセットするようにしたら改善された気がする。これで直るといいけど。

やること

  • 年金
  • スポンジ
  • 歯ブラシ