2

JRuby で検索サービスとして実行されている単純な DataMapper/Sinatra アプリがあります。検索中に散発的なエラー メッセージが表示され (特定のリズムや理由が見つからない)、他の誰かが同様の問題に遭遇したかどうか疑問に思っています。

エラーはランダムに発生し、それ自体に一貫性がありません。

例:

INFO: IOError - closed stream:
 org/jruby/RubyIO.java:2616:in `sysread'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill'
 org/jruby/ext/Timeout.java:99:in `timeout'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:126:in `readline'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:2026:in `read_status_line'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:2015:in `read_new'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1051:in `request'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1037:in `request'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:543:in `start'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1035:in `request'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:772:in `get'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:16:in `get'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:36:in `request'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/search/abstract_search.rb:35:in `execute'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/session.rb:59:in `search'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot.rb:335:in `search'
 /var/www/search/application.rb:7:in `HEAD /search'

INFO: NoMethodError - undefined method `+' for nil:NilClass:
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:178:in `write0'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:153:in `write'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:168:in `writing'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:152:in `write'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1580:in `write_header'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1535:in `exec'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1049:in `request'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:772:in `get'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:16:in `get'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:36:in `request'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/search/abstract_search.rb:35:in `execute'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/session.rb:59:in `search'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot.rb:335:in `search'
 /var/www/search/application.rb:7:in `HEAD /search'

INFO: IOError - stream closed:
 org/jruby/RubyIO.java:1978:in `close'
 /usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:70:in `close'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:1059:in `request'
 /usr/lib/jruby/lib/ruby/1.8/net/http.rb:772:in `get'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:16:in `get'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:36:in `request'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/search/abstract_search.rb:35:in `execute'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/session.rb:59:in `search'
 /usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot.rb:335:in `search'
 /var/www/search/application.rb:7:in `HEAD /search'

エラーは、Sunspot の下にある何か (RSolr または JRuby でしょうか?) に問題があるようですが、一貫して問題を再現する方法が見つからないため、少し途方に暮れています。Solr/Tomcat に問題があるかどうかを確認するために、Solr のインストールを削除しようとしましたが、Solr/Tomcat がボールを落としているのをまだ見つけていません。

4

1 に答える 1

2

問題はスレッドでした。デフォルトでは、Sunspot のセッション オブジェクトはスレッドセーフではありません。Sunspot::Rails では、デフォルトでスレッドセーフなオブジェクトを使用しますが、これは Sinatra であるため、次のように手動で行う必要があります。

Sunspot.session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(Sunspot.config)
于 2011-06-22T19:23:15.117 に答える