普段動作している処理でNoMethodErrorがraiseされて困っています

73 views
Skip to first unread message

tamoot

unread,
Jan 6, 2012, 2:41:36 AM1/6/12
to 日本JRubyユーザ会
こんにちは。


tamootと申します。

JRuby1.4.0+rails2.2.2の環境で、普段動作している処理のですが、
突然NoMethodErrorがraiseされて困っています。

つたない英語で書いてありますが、詳細は以下になります。
https://gist.github.com/1436617

どなたかこのような問題に遭遇されたかたはいらっしゃらないでしょうか。

----
tamoot

Hiroshi Nakamura

unread,
Jan 9, 2012, 9:49:10 PM1/9/12
to jruby-u...@googlegroups.com
(2012/01/06 16:41), tamoot wrote:
> JRuby1.4.0+rails2.2.2の環境で、普段動作している処理のですが、
> 突然NoMethodErrorがraiseされて困っています。
>
> つたない英語で書いてありますが、詳細は以下になります。
> https://gist.github.com/1436617

英語で書いてあるということは、すでにJRubyのチケットとかにfileされてたり
します?あるいは、これから、という予定でしょうか。

また中身のほうですが、ActiveRecordのバージョンが2.2.0となっていますが、
rubygems.orgにはそのようなバージョンがないようです。2.0.2でしょうか。あ
るいは開発バージョン?例外の上がっている場所の行数を見たいので、正確な
バージョンを教えてください(gitのタグでもOKです)。

ありがちなのは、マルチスレッドでクラスの再定義中にアクセスして、メソッド
や定数が見つからなくてNoMethodErrorやNameError、というのがありがちです。
これは、マルチスレッド環境下では、以下のタイミングで発生します。

1. Railsのdevelopmentモードでは、アクセスの度にクラスを再定義するため、
発生する(ファイルが更新された場合のみ、だったかも?)

2. Railsはproductionモードでも、クラスを最初のアクセス時に遅延読み込み
するため、アプリの起動直後に発生する。

どちらかが当てはまる可能性はありますか?
また、JRubyの起動オプションに-Xbacktrace.style=rawを渡してエラーを発生さ
せ、より詳細な例外情報を取得することは可能でしょうか。Railsでどうやるの
かわかってませんが。。。

/ / /

なお、1についてはCRubyでも同様(ただしマルチスレッドで使う人が居ないので
表面化しない)で、Rails側の対処が必要です。autoloadを直したりという支援
をしているのですが、Rails側でマルチスレッドに興味のある人が少ないため
か、当面直る気配はなさそうです。

2についてはJRubyの問題で、master branchでは修正しました。次のリリースの
1.7では直るはずです。

以上です。

signature.asc

Hiroshi Nakamura

unread,
Jan 11, 2012, 12:03:56 AM1/11/12
to jruby-u...@googlegroups.com
(2012/01/11 11:35), tamoot wrote:
> 現状は1, 2どちらも当てはまってはいません。
> 最初のアクセス時でもなく、動作中になっています。

了解です。

ところで、動作中、複数アクセス同時の際に発生しているかどうか、など、わか
りますか?例えば複数ブラウザで同時アクセスしまくると発生しがち、など。

また、will_paginateというpluginが使われているようですが、こいつのバー
ジョンは何でしょうか。こいつがThread-safeでない、というパターンも考えら
れます。

>> また、JRubyの起動オプションに-Xbacktrace.style=rawを渡してエラーを発生さ
>> せ、より詳細な例外情報を取得することは可能でしょうか。Railsでどうやるの
>> かわかってませんが。。。

こちらもよろしくお願いします。

signature.asc

tamoot

unread,
Jan 11, 2012, 2:24:21 AM1/11/12
to 日本JRubyユーザ会
コメントありがとうございます。

> ところで、動作中、複数アクセス同時の際に発生しているかどうか、など、わか
> りますか?例えば複数ブラウザで同時アクセスしまくると発生しがち、など。

残念ながら、発生したのはたった一度であり、
調査に難航している状況です。
プロセスとしては、数十のActiveRecordの操作を行うスレッドが動作しています。

> また、will_paginateというpluginが使われているようですが、こいつのバー
> ジョンは何でしょうか。こいつがThread-safeでない、というパターンも考えら
> れます。

2.3.4になります。
こちらでもソースを見てみます。

Hiroshi Nakamura

unread,
Jan 11, 2012, 4:42:46 AM1/11/12
to jruby-u...@googlegroups.com
(2012/01/11 16:24), tamoot wrote:
>> ところで、動作中、複数アクセス同時の際に発生しているかどうか、など、わか
>> りますか?例えば複数ブラウザで同時アクセスしまくると発生しがち、など。
>
> 残念ながら、発生したのはたった一度であり、
> 調査に難航している状況です。
> プロセスとしては、数十のActiveRecordの操作を行うスレッドが動作しています。

なるほど。

>> また、will_paginateというpluginが使われているようですが、こいつのバー
>> ジョンは何でしょうか。こいつがThread-safeでない、というパターンも考えら
>> れます。
>
> 2.3.4になります。
> こちらでもソースを見てみます。

再度よく見たところ、will_pagenateは単にmethod_missingを横取りしていただ
けでした。ActiveRecord::BaseにFinderをincludeとか、無茶だなあ。

というわけで元に戻って、怪しいのはActiveRecordですね。2.3.14のソースコー
ド見ると、既に派手に書き換わっているんですが、特にThread絡みの修正、とい
うコミットメッセージは見当たらないようです。するとJRubyか。。。

とりあえず、bugs.jruby.orgにチケットを登録しておいてもらえませんでしょう
か。おそらく「バージョンアップして再現させてね」と言われておしまいです
が、万が一同じ現象にぶち当たっている人が居れば、何かコメントもらえる可能
性はあります。

signature.asc

tamoot

unread,
May 29, 2012, 12:55:35 AM5/29/12
to jruby-u...@googlegroups.com
遅ればせながらチケットを発行しました。
https://jira.codehaus.org/browse/JRUBY-6689


とりあえず、bugs.jruby.orgにチケットを登録しておいてもらえませんでしょう
か。おそらく「バージョンアップして再現させてね」と言われておしまいです
が、万が一同じ現象にぶち当たっている人が居れば、何かコメントもらえる可能
性はあります。


こちらの事情により、backtrace.style=raw は稼働中の環境に適用することはNG
となってしまいました。(いろいろありまして。。)

Rubyの例外から、Javaのbacktraceを取得できるような、
そんな理想的な手段があったりしないでしょうか。。

Reply all
Reply to author
Forward
0 new messages