ActiveSupport.remove_constant - исключение NameError - PullRequest
0 голосов
/ 07 декабря 2010

Я работаю над приложением Rails (2.3.4), использующим пространственные расширения MySQL, поэтому я использую гем GeoRuby (1.3.4) иatial_adapter (1.1.2).

ВсегдаОднако, поскольку я начал использовать объекты Point GeoRuby, у меня возникают проблемы, когда ActiveSupport пытается удалить константы после обработки запроса:

[ pid=18105 thr=67398490 file=utils.rb:176 time=2010-12-07 15:00:38.894 ]: *** Exception NameError in application (cannot remove Object::Geometry) (process 18105, thread #<Thread:0x808d6b4>):
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:603:in `remove_const'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:603:in `remove_constant'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:603:in `instance_eval'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:603:in `remove_constant'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:450:in `remove_unloadable_constants!'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:450:in `each'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:450:in `remove_unloadable_constants!'
from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:236:in `clear'
from /opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/dispatcher.rb:64:in `cleanup_application'
from /opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/reloader.rb:17:in `close'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/rack/request_handler.rb:136:in `process_request'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_request_handler.rb:513:in `accept_and_process_next_request'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_request_handler.rb:274:in `main_loop'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/classic_rails/application_spawner.rb:321:in `start_request_handler'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/classic_rails/application_spawner.rb:275:in `send'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/classic_rails/application_spawner.rb:275:in `handle_spawn_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/utils.rb:479:in `safe_fork'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/classic_rails/application_spawner.rb:270:in `handle_spawn_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:357:in `__send__'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:180:in `start'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/classic_rails/application_spawner.rb:149:in `start'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/spawn_manager.rb:219:in `spawn_rails_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server_collection.rb:132:in `lookup_or_add'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/spawn_manager.rb:214:in `spawn_rails_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server_collection.rb:82:in `synchronize'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/spawn_manager.rb:213:in `spawn_rails_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/spawn_manager.rb:132:in `spawn_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:357:in `__send__'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
from /opt/local/lib/ruby/gems/1.8/gems/passenger-3.0.0/helper-scripts/passenger-spawn-server:99

В конечном итоге это приводит к тому, что Apache получает SIGTERM (возможно, из-за истощения потоковили что-то в этом роде), поэтому сервер иногда не может отвечать ни на какие запросы.

Одна странная вещь - это «Object :: Geometry» - я ожидаю, что вместо этого будет читать «GeoRuby :: SimpleFeatures :: Geometry»(Я использую пару GeoRuby :: SimpleFeatures :: Point, которая является подклассом Geometry).

Я также заметил, что в ActiveSupport 3.0.0 код для remove_constant отличается от версииЯ работаю сУстраняет ли это обновление эту проблему и, если да, требуется ли обновление до Rails 3.0?

1 Ответ

0 голосов
/ 10 декабря 2010

Я исправил это, окружив код ошибки (тело метода remove_constant) в active_support / dependencies.rb предложением begin-rescue-end, чтобы игнорировать исключение. Я не уверен, есть ли у этого какие-либо негативные побочные эффекты, но, по крайней мере, это не заставляет Apache время от времени перезапускаться.

...