Module: Gritz::Rails

Defined in:
/home/runner/work/gritz/gritz/sources/gritz-rails/lib/gritz/rails/executor.rb,
/home/runner/work/gritz/gritz/sources/gritz-rails/lib/gritz/rails/railtie.rb,
/home/runner/work/gritz/gritz/sources/gritz-rails/lib/gritz/rails/version.rb,
/home/runner/work/gritz/gritz/sources/gritz-rails/lib/gritz/rails.rb

Defined Under Namespace

Modules: ConfigurationDSL Classes: Executor

Constant Summary collapse

VERSION =
"0.9.1"

Class Method Summary collapse

Class Method Details

.install(config, application: ::Rails.application) ⇒ Object

Installs Rails execution and fork lifecycle hooks into one server configuration.

Raises:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File '/home/runner/work/gritz/gritz/sources/gritz-rails/lib/gritz/rails.rb', line 14

def self.install(config, application: ::Rails.application)
  raise ConfigurationError, "rails_app requires an initialized Rails application" unless application&.initialized?

  installed = config.middleware.entries.find { |entry| entry.middleware == Executor }
  if installed
    raise ConfigurationError, "Rails integration is already installed for another application" unless installed.options[:application].equal?(application)

    return config
  end

  development = ::Rails.env.development?
  ActiveSupport::IsolatedExecutionState.isolation_level = :fiber if config.transport == :async
  config.reflection = true if development && config.transport == :native
  first = config.middleware.entries.first
  if first
    config.middleware.insert_before(first.middleware, Executor, application:, development:)
  else
    config.middleware.use(Executor, application:, development:)
  end
  disconnect_pools = lambda do |_index = nil|
    if defined?(ActiveRecord::Base)
      ActiveRecord::Base.connection_handler.connection_pool_list(:all).each(&:disconnect!)
    end
  end
  config.add_preloader do
    ActiveSupport::IsolatedExecutionState.isolation_level = :fiber if config.transport == :async
    raise ConfigurationError, "Rails development mode requires workers 0" if development && config.workers.positive?

    application.eager_load!
    config.controllers.map! { |controller| reloadable_controller(controller) } if development
    disconnect_pools.call if config.workers.positive?
  end
  config.add_hook(:before_fork, &disconnect_pools)
  config
end