2008-11-03 5 views
6

Me aparece un problema extraño. Mi controlador llama a un objeto DRBDrb y la excepción "objeto reciclado"

@request_handler = DRbObject.new(nil, url) 
availability_result = @request_handler.fetch_availability(request, @reservation_search, params[:selected_room_rates]) 

y este objeto Drb está haciendo algunas búsquedas.

pero a veces, en unos entornos Linux, aparece un "0xdba87b30 se recicla objeto" con este StackTrace

--- 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:375:in `_id2ref' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:375:in `to_obj' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1402:in `to_obj' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1704:in `to_obj' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:613:in `recv_request' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:911:in `recv_request' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1530:in `init_with_client' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1542:in `setup_message' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1494:in `perform' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1589:in `main_loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1585:in `loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1585:in `main_loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1581:in `start' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1581:in `main_loop' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1430:in `run' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1427:in `start' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1427:in `run' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1347:in `initialize' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1627:in `new' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/1.8/drb/drb.rb:1627:in `start_service' 
- (druby://10.254.143.159:9001) ./core/request_handler.rb:244 
- (druby://10.254.143.159:9001) /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' 
- (druby://10.254.143.159:9001) /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/dependencies.rb:510:in `require' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/dependencies.rb:355:in `new_constants_in' 
- (druby://10.254.143.159:9001) /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/dependencies.rb:510:in `require' 
- (druby://10.254.143.159:9001) core/request_handler.rb:31 
- (druby://10.254.143.159:9001) core/request_handler.rb:29:in `each' 
- (druby://10.254.143.159:9001) core/request_handler.rb:29 
- app/drops/room_drop.rb:18:in `room_rates' 
- lib/liquid/liquid_templates.rb:47:in `parse_template' 
- lib/liquid/liquid_templates.rb:21:in `render_liquid_template_without_layout' 
- app/helpers/skins_helper.rb:6:in `render_respond_by_format' 
- app/helpers/skins_helper.rb:4:in `render_respond_by_format' 
- app/helpers/skins_helper.rb:25:in `render_availability_action' 
- app/controllers/web_reservations_controller.rb:109:in `availability_simplified' 
- /usr/bin/mongrel_rails:19:in `load' 
- /usr/bin/mongrel_rails:19 

Lo extraño es que no puedo reproducir el error en mi (ventanas) máquina de desarrollo , pero lo obtengo solo en mi servidor de prueba de Linux (2 mongrels en lugar de uno en mi máquina).

¿Qué pasa? Creo que es un problema de recolector de basura (objeto recolectado antes de volver a usarlo), pero no entiendo dónde estoy haciendo algo mal. Simplemente creo el objeto en mi controlador y llamo a un método sobre él.

¿Alguna idea?

Gracias! Roberto

+0

Parece que le falta la parte superior de la pila donde muestra el error, ¿podría incluir eso? – dgtized

Respuesta

5

El error significa que está tratando de servir un objeto que ha sido recolectado basura, lo que generalmente sucede porque el objeto salió de alcance en el servidor .

Su apuesta más segura es averiguar por qué el objeto fue recolectado antes de la basura prematuramente en primer lugar. Alternativamente, puede deshabilitar el GC del servidor llamando al GC.disable, que generalmente es una mala idea, especialmente si su servidor es de larga ejecución.

+0

Obviamente, como se dijo, no debes inhabilitar el GC, pero tratar de hacerlo temporalmente te permitirá saber si este es tu problema – Almund

0

¿Es posible que esté llamando a DRb.start_service más de una vez en el servidor?

Cuestiones relacionadas