ToshiyukiTerashita/castoro — Issue #60: peer のレプリケーションが ruby 1.9.2p290 で動作しない
Author: tora
Created: 2012-02-22 03:28:08+00:00
State: open

現象
peer が、レプリケーションしようとすると、通信がタイムアウトしてまい、レプリケーションが行われない。

環境
CentOS 5.6 64ビット
ruby-1.9.2-p290 をソースファイルからコンパイル、configure にオプションは無し
castoro-peer (0.2.0.pre)

情報収集
通信ポートへの接続確認
再起動直後は、
$ telnet localhost 30148
で、適当な文字を打ち込み、リターンキーを押すと、期待通り、以下のような応答がある。
["1.1","R",null,{"error":{"code":"Castoro::Peer::RetryableError","message":"server status: 10 10 offline for "}}]
しかしながら、レプリケーションしなくなっている状態では、応答がない。
このことから、プロセス内部でレプリケーション要求を処理するスレッドが無くなってしまう模様。

スレッド数の確認
$ ps -L -p crepdのプロセスID | wc
crepd の再起動直後は、ヘッダ行を含めて 47 行あるが、しばらくすると、減っていき、最終的に 27 行になってしまう。
このことから、プロセス内部でスレッドが異常終了している模様。

Exception の確認
crepd をデーモンプロセスとしてではなく、フォアグラウンドで実行、デバッグオプション付き
-f は、デーモンにならず、フォアグラウンドで実行
-d は、 Ruby の DEBUG を on にする。よって、内部の Exception を 表示してくれる。および、内部のデバッグ情報を表示する。
$ /usr/local/bin/crepd -f -d

Exception `Errno::EAGAIN' at /usr/local/lib/ruby/gems/1.9.1/gems/castoro-peer-0.2.0.pre/lib/castoro-peer/maintenace_server.rb:58 - Resource temporarily unavailable - read would block
が、延々と続くが、これについては、想定通り、問題は特になし

Exception `Castoro::Peer::RetryableError' at /usr/local/lib/ruby/gems/1.9.1/gems/castoro-peer-0.2.0.pre/lib/castoro-peer/crepd_receiver.rb:73 - server status: 10 10 offline for
は、crepd の動作モードが offline だったため。問題は特になし

Exception `SystemStackError' at /usr/local/lib/ruby/gems/1.9.1/gems/castoro-peer-0.2.0.pre/lib/castoro-peer/crepd_queue.rb - stack level too deep
Exception `SystemStackError' at /usr/local/lib/ruby/gems/1.9.1/gems/castoro-peer-0.2.0.pre/lib/castoro-peer/custom_condition_variable.rb:44 - stack level too deep
Exception `SystemStackError' at /usr/local/bin/crepd:19 - stack level too deep
/local/bin/crepd:19: stack level too deep (SystemStackError)
が、発生。どうやら、これが今回の問題の模様。

SystemStackError という例外が発生したため、rescue でキャッチできない。
そして、そのスレッドが強制終了されてしまう。