Skip to content
Browse files

Restore stale session check and move after dispatch development clean…

…ups before the request
  • Loading branch information...
1 parent 96d6105 commit 7259baab4722d2343cbd0d81cb2aacc95d0c9461 @josh josh committed
View
7 actionpack/lib/action_controller/dispatcher.rb
@@ -7,7 +7,6 @@ def define_dispatcher_callbacks(cache_classes)
unless cache_classes
# Development mode callbacks
before_dispatch :reload_application
- after_dispatch :cleanup_application
ActionView::Helpers::AssetTagHelper.cache_asset_timestamps = false
end
@@ -93,11 +92,9 @@ def reload_application
run_callbacks :prepare_dispatch
Routing::Routes.reload
- end
- # Cleanup the application by clearing out loaded classes so they can
- # be reloaded on the next request without restarting the server.
- def cleanup_application
+ # Cleanup the application by clearing out loaded classes so they can
+ # be reloaded on the next request without restarting the server.
ActiveRecord::Base.reset_subclasses if defined?(ActiveRecord)
ActiveSupport::Dependencies.clear
ActiveRecord::Base.clear_reloadable_connections! if defined?(ActiveRecord)
View
25 actionpack/lib/action_controller/session/abstract_store.rb
@@ -58,9 +58,28 @@ def loaded?
end
def load!
- @id, session = @by.send(:load_session, @env)
- replace(session)
- @loaded = true
+ stale_session_check! do
+ @id, session = @by.send(:load_session, @env)
+ replace(session)
+ @loaded = true
+ end
+ end
+
+ def stale_session_check!
+ yield
+ rescue ArgumentError => argument_error
+ if argument_error.message =~ %r{undefined class/module ([\w:]*\w)}
+ begin
+ # Note that the regexp does not allow $1 to end with a ':'
+ $1.constantize
+ rescue LoadError, NameError => const_error
+ raise ActionController::SessionRestoreError, "Session contains objects whose class definition isn\\'t available.\nRemember to require the classes for all objects kept in the session.\n(Original exception: \#{const_error.message} [\#{const_error.class}])\n"
@nertzy
nertzy added a note

This line is over-escaped.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ end
+
+ retry
+ else
+ raise
+ end
end
end

2 comments on commit 7259baa

@pixeltrix
Ruby on Rails member

This has huge effect if you’re using the Thinking Sphinx plugin. TS loads all the models using a to_prepare callback which is then dumped by the call to ActiveSupport::Dependencies.clear. What was the reason for moving cleanup_application into reload_application? Maybe we could move the cleanup stuff before the call to run_callbacks?

@pixeltrix
Ruby on Rails member

Lighthouse ticket created: http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1898-clearing-dependencies-in-reload_application-performance-issue

Please sign in to comment.
Something went wrong with that request. Please try again.