Низкоуровневые ошибки с использованием Solr и Sunspot в JRuby
У меня есть простое приложение DataMapper/Sinatra, работающее на JRuby в качестве службы поиска. При поиске я получаю спорадические сообщения об ошибках (не могу найти конкретную рифму или причину), гадая, сталкивался ли кто-либо с подобными проблемами.
Ошибки происходят случайным образом и сами по себе несовместимы.
Примеры:
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 с запросами, чтобы увидеть, если это проблема с Solr/Tomcat, но мне еще предстоит поймать Solr/Tomcat, уронившего мяч.
1 ответ
Проблема была в потоке. По умолчанию объект сеанса Sunspot не является потокобезопасным. В Sunspot::Rails он по умолчанию использует потокобезопасный объект, но, поскольку это Sinatra, вы должны сделать это вручную, вот так:
Sunspot.session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(Sunspot.config)